Правила для арифметических операций

Арифметика с фиксированной точкой относится к тому, как управляются подписанные или неподписанные двоичные слова. Простота арифметических функций с фиксированной точкой, таких как сложение и вычитание, позволяет проводить экономически эффективные аппаратные реализации.

В следующих разделах описываются правила, которые Simulink® программное обеспечение выполняется при выполнении арифметических операций на входах и параметрах. Эти правила организованы в четыре группы на основе соответствующих операций: сложение и вычитание, умножение, деление и сдвиги. Для каждой из этих четырех групп правила выполнения указанной операции представлены в примере с использованием правил.

Вычислительные модули

Архитектура ядра многих процессоров содержит несколько вычислительные модули арифметики включая модули логики (ALU), умножение и накопление модулей (MAC) и переключатели. Эти вычислительные модули обрабатывают двоичные данные непосредственно и обеспечивают поддержку арифметических расчетов различной точности. ALU выполняет стандартный набор арифметических и логических операций, а также деление. MAC выполняет операции умножения, умножения/сложения и умножения/вычитания. Переключатель выполняет логические и арифметические сдвиги, нормализацию, денормализацию и другие операции.

Сложение и вычитание

Сложение является наиболее распространенной арифметической операцией, которую выполняет процессор. Когда два n-битовых числа складываются вместе, всегда можно получить результат с n + 1 ненулевыми цифрами из-за переноса из самой левой цифры. Для сложения двух дополнительных чисел существует три случая:

  • Если оба числа положительны, и результат их сложения имеет бит знака 1, то произошло переполнение; в противном случае результат будет правильным.

  • Если оба числа отрицательны, и знак результата 0, то произошло переполнение; в противном случае результат будет правильным.

  • Если числа отличаются от знака, переполнение не может произойти, и результат всегда верен.

Процесс суммирования блоков Simulink с фиксированной точкой

Рассмотрим суммирование двух чисел. В идеале вещественные значения подчиняются уравнению

Va=±Vb±Vc,

где Vb и Vc являются входом значениями, а Va является выходом значением. Чтобы увидеть, как суммирование фактически реализовано, три идеальных значения должны быть заменены общей схемой кодирования [Slope Bias], описанной в масштабировании:

Vi=Fi2EiQi+Bi.

Уравнение в Сложении даёт решение получившегося уравнения для сохраненного целого числа, Qa. Используя краткое обозначение, это уравнение становится

Qa=±Fsb2EbEaQb±Fsc2EcEaQc+Bnet,

где Fsb и Fsc - скорректированные дробные склоны, а Bnet - смещение сети. Оффлайн-преобразования и онлайн-преобразования и операции обсуждаются ниже.

Автономные преобразования.  Fsb, Fsc и Bnet вычисляются в автономном режиме с использованием округления к ближайшему и насыщения. Кроме того, Bnet хранится с использованием типа выходных данных.

Онлайн-конверсии и операции.  Остальные операции выполняются в оперативном режиме процессором с фиксированной точкой и зависят от наклонов и смещений для типов входных и выходных данных. Худший (самый неэффективный) случай происходит, когда склоны и смещения несоответствуют. Преобразования и операции в наихудшем случае описываются следующими шагами:

  1. Начальное значение для Qa определяется смещением сети, Bnet:

    Qa=Bnet.

  2. Первое входное целое значение, Qb, умножается на скорректированный наклон, Fsb:

    QRawProduct=FsbQb.

  3. Предыдущий продукт преобразуется в измененный тип выходных данных, где наклон равен единице, а смещение равняется нулю:

    QTemp=convert(QRawProduct).

    Это преобразование включает любую необходимую перемену битов, округление или обработку переполнения.

  4. Операция суммирования выполняется:

    Qa=Qa±QTemp.

    Это суммирование включает любую необходимую обработку переполнения.

  5. Шаги 2-4 повторяются для каждого числа, которое должно быть суммировано.

Важно отметить, что перемена битов, округление и обработка переполнения применяются к промежуточным этапам (3 и 4), а не к общей сумме.

Для получения дополнительной информации смотрите Процесс суммирования.

Оптимизация симуляций и сгенерированного кода

Если масштабирование входного и выходного сигналов совпадает, количество операций суммирования уменьшается с худшего (наиболее неэффективного) случая. Для примера, когда вход имеет тот же дробный наклон, что и выход, шаг 2 уменьшается до умножения на единицу и может быть устранен. Тривиальные шаги в процессе суммирования устраняются как для симуляции, так и для генерации кода. Исключительное использование двоичного масштабирования только для точек как для входных сигналов, так и для выходных сигналов является общим способом устранения несоответствий склонов и смещений, и приводит к наиболее эффективным симуляциям и сгенерированному коду.

Умножение

Умножение n-битового двоичного числа с m-битным двоичным числом приводит к продукту, которая до m + n бит в длину для слов с знаком и без знака. Большинство процессоров выполняют умножение n-бит на n-бит и получают 2n-бит результата (двойные биты), принимая, что нет условия переполнения.

Процесс умножения блоков Simulink с фиксированной точкой

Рассмотрим умножение двух чисел. В идеале вещественные значения подчиняются уравнению

Va=VbVc.

где Vb и Vc являются входом значениями, а Va является выходом значением. Чтобы увидеть, как умножение фактически реализовано, три идеальных значения должны быть заменены общей схемой кодирования [Slope Bias], описанной в масштабировании:

Vi=Fi2EiQi+Bi.

Решение получившегося уравнения для выхода сохраненного целого числа, Qa, приведено ниже:

Qa=FbFcFa2Eb+EcEaQbQc+FbBcFa2EbEaQb+FcBbFa2EcEaQc+BbBcBaFa2Ea.

Умножение с ненулевыми смещениями и несоответствующими дробными склонами.  Реализация вышеописанного уравнения в худшем случае происходит, когда наклоны и смещения входного и выходного сигналов несоответствуют. В таких случаях для выполнения высокоуровневого умножения (или деления) требуется несколько низкоуровневых целочисленных операций. Выбор реализации этих низкоуровневых расчетов может повлиять на вычислительную эффективность, ошибки округления и переполнение.

В блоках Simulink фактическое умножение или операция деления всегда выполняется для переменных с фиксированной точкой, которые имеют нулевые смещения. Если вход имеет ненулевое смещение, он преобразуется в представление, которое имеет масштабирование только для двоичных точек перед операцией. Если результатом является ненулевое смещение, операция сначала выполняется с временными переменными, которые имеют двоичное масштабирование только для точек. Результат затем преобразуется в тип данных и масштабирование конечного выхода.

Если и входы, и выход имеют ненулевые смещения, то операция разбивается следующим образом:

V1Temp=V1,V2Temp=V2,V3Temp=V1TempV2Temp,V3=V3Temp,

где

V1Temp=2E1TempQ1Temp,V2Temp=2E2TempQ2Temp,V3Temp=2E3TempQ3Temp.

Эти уравнения показывают, что временные переменные имеют двоичное масштабирование только для точек. Однако уравнения не указывают сигнальность, размеры слова или значения фиксированной экспоненты этих переменных. Программа Simulink присваивает эти свойства временным переменным на основе следующих целей:

  • Представление исходного значения без переполнения.

    Тип данных и масштабирование исходного значения определяют максимальное и минимальное значение реального мира:

    VMax=F2EQMaxInteger+B,

    VMin=F2EQMinInteger+B.

    Тип данных и масштабирование временного значения должны быть в состоянии представлять эту область значений без переполнения. Потеря точности возможна, но переполнение никогда не допускается.

  • Используйте тип данных, который приводит к эффективным операциям.

    Эта цель относится к цели, которую вы будете использовать для производственного развертывания вашего проекта. Например, предположим, что вы реализуете проект на 16-битном процессоре с фиксированной точкой, который обеспечивает 32-битную long, 16-битный intи 8-битные short или char. Для такой цели сохранение эффективности означает, что используется не более 32 биты, и меньшие размеры 8 или 16 бит используются, если они достаточны для поддержания точности.

  • Обеспечьте точность.

    В идеале каждое возможное значение, заданное исходным типом данных и масштабированием, идеально представлено временной переменной. Однако это может потребовать больше биты, чем эффективно. Биты отбрасываются, что приводит к потере точности, в той степени, в которой это необходимо для сохранения эффективности.

Например, рассмотрим следующее, принимая 16-битную цель микропроцессора:

VOriginal=QOriginal+-43.25,

где QOriginal - 8-битный беззнаковый тип данных. Для этого типа данных,

QMaxInteger=225,QMinInteger=0,

так

VMax=211.75,VMin=43.25.

Минимальное возможное значение отрицательное, поэтому временная переменная должна быть подписанным целочисленным типом данных. Исходная переменная имеет наклон 1, но смещение выражается с большей точностью двумя цифрами после двоичной точки. Чтобы получить полную точность, фиксированная экспонента временной переменной должна быть -2 или менее. Программное обеспечение Simulink выбирает наименее возможную точность, которая обычно является наиболее эффективной, если только не возникают проблемы переполнения. Для масштабирования 2-2выбор 16-разрядной или 32-разрядной подписи позволяет избежать переполнения. Для эффективности программное обеспечение Simulink выбирает меньший выбор из 16 бит. Если исходная переменная является входом, то уравнения для преобразования во временную переменную

uint8_T  QOriginal,uint16_TQTemp,   QTemp=((uint16_T)QOriginal2)173.

Умножение с нулевыми смещениями и несоответствующими дробными склонами.  Когда смещения равны нулю, и дробные склоны несоответствуют, реализация уменьшается до

Qa=FbFcFa2Eb+EcEaQbQc.

Автономные преобразования

Количество

FNet=FbFcFa

Вычисляется в автономном режиме с использованием округления к ближайшему и насыщения. FNet хранится с использованием типа данных с фиксированной точкой формы

2ENetQNet,

где ENet и QNet выбираются автоматически, чтобы наилучшим образом представлять FNet.

Онлайн-преобразования и операции

  1. Целочисленные значения Qb и Qc умножаются:

    QRawProduct=QbQc.

    Чтобы сохранить полную точность продукта, двоичная точка QRawProduct задается суммой двоичных точек Qb и Qc.

  2. Предыдущий продукт преобразуется в тип выходных данных:

    QTemp=convert(QRawProduct).

    Это преобразование включает любую необходимую перемену битов, округление или обработку переполнения. Преобразования сигналов обсуждают преобразования.

  3. Умножение

    Q2RawProduct=QTempQNet

    выполняется.

  4. Предыдущий продукт преобразуется в тип выходных данных:

    Qa=convert(Q2RawProduct).

    Это преобразование включает любую необходимую перемену битов, округление или обработку переполнения. Преобразования сигналов обсуждают преобразования.

  5. Шаги с 1 по 4 повторяются для каждого дополнительного числа, которое должно быть умножено.

Умножение с нулевыми смещениями и совпадение дробных наклонов.  Когда смещения равны нулю, а дробные склоны совпадают, реализация уменьшается до

Qa=2Eb+EcEaQbQc.

Автономные преобразования

Преобразования в автономном режиме не выполняются.

Онлайн-преобразования и операции

  1. Целочисленные значения Qb и Qc умножаются:

    QRawProduct=QbQc.

    Чтобы сохранить полную точность продукта, двоичная точка QRawProduct задается суммой двоичных точек Qb и Qc.

  2. Предыдущий продукт преобразуется в тип выходных данных:

    Qa=convert(QRawProduct).

    Это преобразование включает любую необходимую перемену битов, округление или обработку переполнения. Преобразования сигналов обсуждают преобразования.

  3. Шаги 1 и 2 повторяются для каждого дополнительного числа, которое должно быть умножено.

Для получения дополнительной информации смотрите Процесс умножения.

Деление

В этом разделе рассматривается деление величин с нулевым смещением.

Примечание

Когда любой вход для вычисления деления имеет ненулевое смещение, выполненные операции точно совпадают с операциями для умножения, описанными в Умножении с ненулевыми смещениями и несоответствующими дробными склонами.

Процесс деления блоков Simulink с фиксированной точкой

Рассмотрим деление двух чисел. В идеале вещественные значения подчиняются уравнению

Va=Vb/Vc,

где Vb и Vc являются входом значениями, а Va является выходом значением. Чтобы увидеть, как действительно реализовано деление, три идеальных значения должны быть заменены общей схемой кодирования [Slope Bias], описанной в масштабировании:

Vi=Fi2EiQi+Bi.

Для случая, когда коэффициенты регулировки наклона едины, а смещения равны нулю для всех сигналов, решение получившегося уравнения для выхода сохраненного целого числа Qa задается следующим уравнением:

Qa=2EbEcEa(Qb/Qc).

Это уравнение включает целочисленное деление и некоторые битовые сдвиги. Если Ea > Eb - Ec, то любые битовые сдвиги направо и реализация проста. Однако, если  Ea < Eb - Ec, то битовые сдвиги идут налево, и реализация может оказаться более сложной. Существенной проблемой является то, что выход имеет большую точность, чем обеспечивает целое деление. Чтобы получить полную точность, необходимо дробное деление. Язык программирования C предоставляет доступ к целому делению только для типов данных с фиксированной точкой. В зависимости от размера числителя, можно получить некоторые дробные биты, выполнив сдвиг перед целым делением. В худшем случае может оказаться необходимым прибегнуть к многократному вычитанию в программном обеспечении.

В целом, деление значений является операцией, которую следует избегать во встраиваемых системах с фиксированной точкой. Деление, где выход имеет большую точность, чем целое деление (то есть Ea < Eb - Ec), должно использоваться с еще большей реактивностью.

Для получения дополнительной информации см. раздел «Процесс деления».

Сдвиги

Почти все микропроцессоры и цифровые сигнальные процессоры поддерживают четко определенные операции битового сдвига (или просто сдвига) для целых чисел. Для примера рассмотрим 8-битное беззнаковое целое число 00110101. Результаты сдвига на 2 бита влево и сдвига на 2 бита вправо показаны в следующей таблице.

Операция сдвигаДвоичное значениеДесятичное значение

Нет сдвига (исходный номер)

00110101

53

Сдвиньте влево на 2 бита

11010100

212

Сдвиньте вправо на 2 бита

00001101

13

Сдвиг можно выполнить с помощью блока Shift Arithmetic Simulink. Используйте этот блок для выполнения битового сдвига, двоичного сдвига точки или обоих

Сдвигающие биты вправо

Особый случай сдвига бит вправо требует фактора обработки крайнего левого бита, который может содержать информацию о знаке. Сдвиг вправо может быть классифицирован как логический сдвиг вправо или арифметический сдвиг вправо. Для логического сдвига вправо 0 включено в самый значащий бит для каждого битового сдвига. Для арифметического сдвига вправо самый значительный бит рециркулируется для каждого битового сдвига.

Блок Shift Arithmetic выполняет арифметический сдвиг вправо и, следовательно, рециркулирует самый значительный бит для каждого сдвига бита вправо. Например, учитывая фиксированную точку номер 11001.011 (-6.625), немного сдвига два места направо с запятой в двоичном числе неперемещенные выражения номер 11110.010 (-1.75), как показано в модели ниже:

Чтобы выполнить логический сдвиг прямо по номеру со знаком с помощью арифметики, используйте блок Data Type Conversion, чтобы привести число как беззнаковое число эквивалентной длины и масштабирования. Эта модель показывает, что номер со знаком с фиксированной точкой 11001.001 (-6.625) становится 00110.010 (6.25).