Оптимизируйте сгенерированный HDL-код для многоуровневых проектов с большими дифференциалами скорости

Проблема

При генерации HDL-кода из вашего мультирейтового алгоритма в Simulink®HDL Coder™ может сгенерировать большое количество регистров конвейера, которые могут предотвратить проект HDL- подбора кривой в FPGA. Эта проблема возникает из-за шаблонов моделирования, которые могут привести к большим дифференциалам скоростей. Вы можете решить эту проблему с помощью методов моделирования, чтобы управлять коэффициентами шага расчета.

Описание

Эта проблема возникает, когда ваша модель Simulink™ имеет значительно большое различие в скоростях дискретизации или использует определенные реализации или оптимизации блоков, которые приводят к различным путям с тактовой частотой, таким как:

  • Реализации многоядерных блоков

  • Входная и выходная конвейеризация

  • Распределённая конвейеризация

  • Отображение библиотек с плавающей точкой

  • Собственная генерация HDL-кода с плавающей точкой

  • Математические функции с фиксированной точкой, такие как returcal, sqrt или delide

  • Совместное использование ресурсов

  • Вытекание

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

Рекомендации

Рекомендация 1: Используйте модель с одной скоростью

Большинство приложений, для которых вы нацелены на 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.

Рекомендация 2: Уменьшите дифференциал ставки

Если вы хотите использовать многоскоростную модель, рекомендуется уменьшить дифференциал скорости. Дифференциал скорости соответствует отношению самой быстрой к самой медленной тактовой частоте в вашем проекте. Если ваше целевое приложение требует двух путей сигнала, таких что один путь сигнала запускается во временных модулях наносекунд (ns), а другой путь сигнала запускается во временных модулях микросекунд (us), вы можете принять решение сохранить мультирасовые пути в вашей модели. Следует иметь в виду, что балансировка задержки может ввести значительно большое количество регистров, чтобы сбалансировать пути сигнала.

В этом примере можно изменить частоту дискретизации блока Constant внутри Подсистемы hdlcoder_multirate_high_differential, чтобы уменьшить дифференциал скорости.

Откройте эту модель, у которой значение шага расчета блока Constant изменено на 0,01.

open_system ('hdlcoder_multirate_medium_differential')

Когда вы компилируете модель и дважды кликните hdlcoder__multirate_medium_differential Подсистема, вы видите, что разница скоростей между двумя путями сигнала равна 1000.

Сгенерируйте HDL-код для hdlcoder_multirate_medium_differential Подсистема и проверьте выходной журнал.

Откройте сгенерированную модель. В командной строке MATLAB™ введите gm_hdlcoder_multirate_medium_differential. Когда вы компилируете сгенерированную модель и дважды кликните hdlcoder_multirate_medium_differential Подсистема, модель отображается легендой шага расчета.

Модель имеет большое количество регистров, приблизительно 1000, в пути быстрой тактовой частоты. Дополнительная стоимость регистров ожидается, когда у вас есть логика управления, которая запускается со скоростью дискретизации, которая в 1000 раз быстрее, чем частота дискретизации системы. Когда вы развертываете сгенерированный код на целевой платформе, имейте в виду ограничения в аппаратных ресурсах на целевой платформе. Эта рекомендация предлагает компромисс между генерацией оптимального HDL-кода и нацеливанием на практические приложения FPGA, которые могут потребовать чрезвычайно большого дифференциала ставок.

Рекомендация 3. Сопоставление задержек трубопровода с ОЗУ

Чтобы оптимизировать количество регистров, которые использует ваш проект на целевом устройстве FPGA, можно использовать настройку Map Pipeline Delays to RAM. Этот параметр является компромиссом регистров конвейера, которые вставляются в HDL-код с ресурсами ОЗУ, чтобы сохранить площадь участка на целевом устройстве FPGA. Эту настройку можно включить на вкладке HDL Code Generation > Optimizations > General диалогового окна Параметров конфигурации.

Можно также задать эту настройку в командной строке при помощи 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-кода и для развертывания кода на целевой платформе.

См. также

Похожие примеры

Подробнее о