При генерации HDL-кода из многоскоростного алгоритма в Simulink® HDL Coder™ может сгенерировать большое количество конвейерных регистров, которые могут препятствовать тому, чтобы проект HDL поместился в FPGA. Эта проблема происходит из-за моделирования шаблонов, которые могут привести к большим дифференциалам уровня. Можно решить эту проблему при помощи техник моделирования, чтобы управлять отношениями шага расчета.
Эта проблема происходит, когда ваша модель Simulink™ имеет значительно значительные различия в частотах дискретизации или использует определенные реализации блока или оптимизацию, которая приводит к различным путям тактовой частоты, таким как:
Реализации блока мультицикла
Конвейеризация ввода и вывода
Распределенная конвейеризация
Отображение библиотеки с плавающей точкой
Нативная генерация HDL-кода с плавающей точкой
Математические функции фиксированной точки, такие как обратная величина, sqrt, или делятся
Разделение ресурсов
Потоковая передача
Дополнительные конвейеры приводят к задержке наверху, которая требует вставки соответствия с задержками через несколько путей прохождения сигнала, действующих на различных уровнях. Если отношение самого быстрого к самой медленной тактовой частоте является довольно большим, генератор кода может потенциально ввести большое количество регистров в получившемся HDL-коде. Большое количество конвейерных регистров может увеличить размер сгенерированных файлов HDL и может препятствовать тому, чтобы проект поместился в FPGA.
Чтобы видеть пример того, как эта проблема происходит, откройте эту модель Simulink™.
open_system('hdlcoder_multirate_high_differential')
Когда вы компилируете модель и дважды кликаете hdlcoder_multirate_high_differential
Подсистема, вы видите, что модель имеет блок Gain с плавающей точкой, оператор мультицикла, в быстрой области тактовой частоты.
Сгенерируйте HDL-код для hdlcoder_multirate_high_differential
Подсистема и проверка выходной журнал.
Откройте сгенерированную модель. В командной строке введите gm_hdlcoder_multirate_high_differential
. Когда вы компилируете модель и дважды кликаете hdlcoder_multirate_high_differential
Подсистема, модель выглядит, как отображено легендой шага расчета.
Задержка крупносерийного производства на быстрой области тактовой частоты проекта введена генератором кода, чтобы сбалансировать задержки через несколько выходных путей системы. Эта большая задержка увеличивает размер сгенерированных файлов HDL и уменьшает КПД сгенерированного кода.
Большинство приложений, что вы предназначаетесь для HDL-кода для силы не, требует такого большого дифференциала уровня. В этом случае рекомендуется, чтобы вы использовали односкоростную модель. В этом примере можно изменить частоту дискретизации блока Constant в hdlcoder_multirate_high_differential Subsystem
совпадать с той из базовой модели.
Откройте эту модель, которая имеет шаг расчета блока Constant, измененного на 10E-06
, который является тем же шагом расчета как основной шаг расчета модели.
open_system('hdlcoder_singlerate')
Когда вы компилируете модель и дважды кликаете hdlcoder_singlerate
Подсистема, вы видите, что пути прохождения сигнала в модели действуют в том же шаге расчета 10E-06
.
Сгенерируйте HDL-код для hdlcoder_singlerate
Подсистема и проверка выходной журнал.
Вы видите, что выходная задержка значительно уменьшилась. Теперь откройте сгенерированную модель. В командной строке MATLAB™ введите gm_hdlcoder_singlerate
. Когда вы компилируете модель и дважды кликаете hdlcoder_singlerate
Подсистема, модель выглядит, как отображено легендой шага расчета.
Сгенерированный HDL-код теперь оптимален и использует немного регистров. Поэтому можно развернуть проект, чтобы предназначаться для платформ FPGA.
Если вы хотите использовать многоскоростную модель, рекомендуется, чтобы вы уменьшали дифференциал уровня. Дифференциал уровня соответствует отношению самого быстрого к самой медленной тактовой частоте в вашем проекте. Если ваше целевое приложение требует двух путей прохождения сигнала, таким образом, что один путь прохождения сигнала запускается в единицах измерения времени наносекунд (не уточнено) и других запусков пути прохождения сигнала в единицах измерения времени микросекунд (нас), можно принять решение сохранить многоскоростные пути в модели. Следует иметь в виду, что балансировка задержки может ввести значительно большое количество регистров, чтобы сбалансировать пути прохождения сигнала.
В этом примере можно изменить частоту дискретизации блока Constant в hdlcoder_multirate_high_differential Подсистеме, чтобы уменьшать дифференциал уровня.
Откройте эту модель, которая имеет шаг расчета блока Constant, измененного на 0,01.
open_system ('hdlcoder_multirate_medium_differential')
Когда вы компилируете модель и дважды кликаете hdlcoder__multirate_medium_differential
Подсистема, вы видите, что дифференциал уровня между этими двумя путями прохождения сигнала равен 1 000.
Сгенерируйте HDL-код для hdlcoder_multirate_medium_differential
Подсистема и проверка выходной журнал.
Откройте сгенерированную модель. В командной строке MATLAB™ введите gm_hdlcoder_multirate_medium_differential
. Когда вы компилируете сгенерированную модель и дважды кликаете hdlcoder_multirate_medium_differential
Подсистема, модель как отображена легендой шага расчета.
Модель имеет большое количество регистров, приблизительно 1 000, в быстром пути к тактовой частоте. Дополнительная стоимость регистров ожидается, когда у вас будет управляющая логика, которая запускается на уровне частоты дискретизации, которая в 1000 раз быстрее, чем частота дискретизации системы. Когда вы развертываете сгенерированный код в целевую платформу, знать об ограничениях в аппаратных ресурсах на целевой платформе. Эта рекомендация предлагает компромисс между генерацией оптимального HDL-кода и предназначением для практических приложений FPGA, которые могут потребовать чрезвычайно большого дифференциала уровня.
Чтобы оптимизировать количество регистров, которые ваш проект использует на целевом устройстве FPGA, можно использовать установку Map Pipeline Delays to RAM. Эта установка является компромиссом конвейерных регистров, которые вставляются в HDL-код с ресурсами RAM, чтобы сохранить место области на целевом устройстве FPGA. Можно включить эту установку во вкладке HDL Code Generation> Optimizations> General диалогового окна Configuration Parameters.
Можно также задать эту установку в командной строке при помощи MapPipelineDelaysToRAM
свойство с hdlset_param
или makehdl
. Можно просмотреть значение свойства при помощи hdlget_param
. Используйте любой из этих методов.
Передайте свойство в качестве аргумента к makehdl
функция.
makehdl('hdlcoder_multirate_high_differential/hdlcoder_multirate_high_differential', ... 'MapPipelineDelaysToRAM','on')
Когда вы используете hdlset_param
, можно установить параметр на модели, и затем сгенерировать HDL-код при помощи makehdl
.
hdlset_param('hdlcoder_multirate_high_differential', ... 'MapPipelineDelaysToRAM','on') makehdl('hdlcoder_multirate_high_differential/hdlcoder_multirate_high_differential')
Используйте эту установку в сочетании с предыдущими рекомендациями далее повысить эффективность сгенерированного HDL-кода и для развертывания кода к целевой платформе.
hdlcoder.createFloatingPointTargetConfig