exponenta event banner

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

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

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

Вычислительные единицы

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

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

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

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

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

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

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

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

Va = ± Vb ± Vc,

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

Vi = Fi2EiQi + Bi.

Уравнение в дополнении дает решение результирующего уравнения для запомненного целого числа, Qa. Используя сокращенную нотацию, это уравнение становится

Qa = ± Fsb2Eb EaQb ± Fsc2Ec EaQc + Bnet,

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

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

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

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

    Qa = Bnet.

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

    QRawProduct=FsbQb.

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

    QTemp = преобразовать (QRawProduct).

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

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

    Qa = Qa ± QTemp.

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

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

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

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

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

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

Умножение

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

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

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

Va = VbVc.

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

Vi = Fi2EiQi + Bi.

Решение результирующего уравнения для запомненного на выходе целого числа Qa приведено ниже:

Qa = FbFcFa2Eb + Ec EaQbQc + FbBcFa2Eb EaQb + FcBbFa2Ec EaQc + BbBc − BaFa2 − Ea.

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

В блоках 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) QOriginal≪2) − 173.

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

Qa = FbFcFa2Eb + Ec EaQbQc.

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

Количество

FNet = FbFcFa

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

2ENetQNet,

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

Онлайн-конверсии и операции

  1. Умножают целые значения Qb и Qc:

    QRawProduct = QbQc.

    Для поддержания полной точности произведения двоичная точка QRawProduct задается суммой двоичных точек Qb и Qc.

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

    QTemp = преобразовать (QRawProduct).

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

  3. Умножение

    Q2RawProduct = QTempQNet

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

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

    Qa = преобразовать (Q2RawProduct).

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

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

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

Qa = 2Eb + Ec EaQbQc.

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

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

Онлайн-конверсии и операции

  1. Умножают целые значения Qb и Qc:

    QRawProduct = QbQc.

    Для поддержания полной точности произведения двоичная точка QRawProduct задается суммой двоичных точек Qb и Qc.

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

    Qa = преобразовать (QRawProduct).

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

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

Дополнительные сведения см. в разделе Процесс умножения.

Подразделение

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

Примечание

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

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

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

Va = Vb/Vc,

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

Vi = Fi2EiQi + Bi.

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

Qa = 2Eb Ec Ea (Qb/Qc).

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

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

Дополнительные сведения см. в разделе Процесс разделения.

Изменения

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

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

Без смены (исходный номер)

00110101

53

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

11010100

212

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

00001101

13

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

Смещение битов вправо

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

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

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