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

Проблема

При генерации 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 и уменьшает КПД сгенерированного кода.

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

Рекомендация 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: уменьшайте дифференциал уровня

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

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

Рекомендация 3: сопоставьте конвейерные задержки с RAM

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

Смотрите также

Связанные примеры

Больше о