exponenta event banner

Внедрение оптимизированного по модулю HDL по константе

В этом примере показано, как использовать блок Modulo by Constant HDL Optimized.

Операция по модулю,

$Y\ = \ X\ mod\ D\ = X - \lfloor \frac{X}{D} \rfloor \times D$

является важным строительным блоком для многих математических алгоритмов. Однако эта формула для$X\ mod\ D$ неэффективна в вычислительном отношении для фиксированных и целых входов. Во многих встраиваемых процессорах отсутствуют инструкции для целочисленного деления. Тем, у кого они есть, требуется много тактов для вычисления ответа. Деление также неэффективно в коммерчески доступных FPGA, арифметические схемы которых предназначены для эффективного умножения, сложения и вычитания. Наконец, для операций с фиксированной точкой по модулю трудно оптимизировать длину слова внутренних типов данных, используемых для вычисления, поскольку операция разделения является неограниченной, даже для входов малой длины слова.

Знаменателем в задаче по модулю является константа времени компиляции, так что блок может вычислить потоковое деление, используя умножение, за которым следует приведение. Перезапись операции разделения как

$\frac{X}{D} = X \times \frac{1}{D}$

показывает это. Константа$1/D$ вычисляется до точности, необходимой для поддержания точности и вычислительной эффективности. Следующая команда отбрасывает любые дробные биты, что является эффективной операцией как на микропроцессорах, так и на FPGA.

В следующем примере показано, как использовать блок Modulo by Constant HDL Optimized для выполнения этой операции, и приведены примеры использования ресурсов и статистика производительности.

Как использовать модуль по постоянному оптимизированному блоку HDL

Блок Modulo by Constant HDL Optimized вычисляет операцию по модулю, используя общую стратегию, описанную выше. Для блока необходимо задать параметр Знаменатель, как показано ниже.

Блок показан ниже, если для параметра «Знаменатель» задано значение 10. Значок блока отображает как математическое выражение для операции по модулю, так и задержку блока.

Из значения знаменателя и типа данных Xблок может вычислять все необходимые константы и типы данных. Поскольку он предназначен для развертывания FPGA, он использует сигналы управления validIn и validOut чтобы указать, когда X и Y действительны. Кроме того, он моделируется с той же задержкой, что и сгенерированный код HDL.

Для использования блока сначала создайте входные данные с фиксированной точкой. Формат, показанный ниже, может использоваться блоком «Из рабочей области».

>> X.time = (0:1:200).';
>> X.signals.values = fi(0:0.125:25,0,18,2).';
>> X.signals.dimensions = 1;

Используя тот же формат, создайте логическое значение validIn сигнал, который многократно переключается с false на true.

>> validIn.time = (0:1:200).';
>> validIn.signals.values = [false; repmat([true false]', 100, 1)];
>> validIn.signals.dimensions = 1;

Чтобы завершить настройку данных для проблемы, установите D равно постоянному знаменателю, используемому для операции по модулю.

>> D = 10;

Откройте модель.

>> open_system('modulo_by_constant_block_example')

DUT_FXP подсистема вычисляет$X\ mod\ D$ для фиксированных входов с использованием блока Modulo by Constant HDL Optimized.

DUT_FLT подсистема вычисляет$X\ mod\ D$ с использованием блока математической функции с параметром Function, равным mod. Потому что Симулинк mod операция поддерживает только входы с плавающей запятой и целочисленные входы, входные данные приводятся к одной точности перед вводом в блок математической функции. Он дополнительно добавляет задержку, чтобы соответствовать задержке DUT_FXP подсистема.

Compare and Plot подсистема строит график всех выходов и вычисляет разницу между вычислением с фиксированной запятой и идеалом с плавающей запятой.

Моделирование модели и изучение области для сравнения результатов с фиксированной и плавающей точками.

>> sim('modulo_by_constant_block_example')

Результаты блоков Modulo by Constant HDL Optimized и Math Function точно совпадают, как показано на графике ниже. Обратите внимание, что на этом графике отображается задержка в системе, поскольку имеется задержка между началом моделирования и первым временем. validOut поднимается высоко.

Создание кода HDL

При наличии лицензии HDL Coder можно создать и развернуть код HDL для DUT_FXP как показано ниже.

>> makehdl('modulo_by_constant_block_example/DUT_FXP');

Внедренная статистика HDL

Пример статистики использования ресурсов на устройстве Xilinx ® Virtex ® -7 XC7VX485 FFG1157-1 приведен ниже. Реализованная конструкция способна работать на этом устройстве более 500MHz.

       Resources       Usage
    _______________    _____

    LUT                 33  
    LUTRAM              8   
    Slice Registers     57  
    DSP48               1