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