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

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

The операции с модулем,

$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 вычисляет операцию с модулем с использованием общей стратегии, описанной выше. Блок требует, чтобы вы задали параметр Denominator, как показано ниже.

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

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

Чтобы использовать блок, сначала создайте входные данные с фиксированной точкой. Формат, показанный ниже, расходуется блоком From Workspace.

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

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

>> 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')

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

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

The 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

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

       Resources       Usage
    _______________    _____

    LUT                 33  
    LUTRAM              8   
    Slice Registers     57  
    DSP48               1   

Для просмотра документации необходимо авторизоваться на сайте