В этом примере показано, как использовать блок Modulo by Constant HDL Optimized.
The операции с модулем,
является важным базовым блоком для многих математических алгоритмов. Однако эта формула для является вычислительно неэффективной для входов с фиксированной точкой и целочисленных значений. Во многих встраиваемых процессорах отсутствуют инструкции для целочисленного деления. Тем, у кого они есть, требуется много тактов, чтобы вычислить ответ. Деление также неэффективно в коммерчески доступных FPGA, арифметические схемы которых предназначены для эффективного умножения, сложения и вычитания. Наконец, для операций с модулем фиксированной точки трудно оптимизировать размер слова внутренних типов данных, используемых для вычисления, потому что операция деления неограниченна, даже для входов с малой длиной слова.
Знаменатель в задаче по модулю является константой времени компиляции, поэтому блок может вычислить деление с плавающей точкой с помощью умножения с последующим приведением. Переписывание операции деления как
показывает это. Константа вычисляется до точности, необходимой для поддержания точности и вычислительной эффективности. Последующее приведение отбрасывает любые дробные биты, что является эффективной операцией как на микропроцессорах, так и на FPGA.
В следующем примере показано, как использовать блок Modulo by Constant HDL Optimized для выполнения этой операции, и представлена выборка статистики использования ресурсов и эффективности.
Блок 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
подсистема вычисляет входы с фиксированной точкой, используя блок Modulo by Constant HDL Optimized.
The DUT_FLT
подсистема вычисляет с помощью блока 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 Coder, можно сгенерировать и развернуть HDL-код для DUT_FXP
подсистема, как показано ниже.
>> makehdl('modulo_by_constant_block_example/DUT_FXP');
Пример статистики использования ресурсов на устройстве с XC7VX485 Xilinx ® Virtex ® -7 FFG1157-1 показан ниже. Реализованный проект способен работать на этом устройстве со скоростью более 500MHz.
Resources Usage _______________ _____ LUT 33 LUTRAM 8 Slice Registers 57 DSP48 1