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

Создание кода HDL для CumSum_Sl Подсистема, щелкните правой кнопкой мыши подсистему и выберите HDL Code > Generate HDL for Subsystem. Во время генерации кода HDL Coder™ генерирует ошибку:
Unable to allocate delays to compensate for the 11 delays introduced by Add in native floating-point mode. Consider either increasing the oversampling factor, setting the 'Latency Strategy' to 'Zero', or adding the necessary output pipelines via HDL block properties for other blocks in the model to accommodate for the latency introduced by this block.
Используя путь к блоку, указанному в сообщении об ошибке, перейдите к блоку Add в модели. Этот блок находится внутри контура обратной связи.

Блок добавления имеет задержку 11. При генерации кода HDL Coder™ не может выделить 11 задержек для блока, поскольку не может добавить соответствующие задержки к другим путям.
Эта модель служит примером для иллюстрации различных стратегий решения этой проблемы.
Эта моделирующая парадигма использует оптимизацию конвейеризации тактовой частоты, чтобы выполнить избыточную выборку по тактовой частоте намного быстрее, чем частота выборки DUT. Чтобы включить эту оптимизацию, укажите коэффициент глобальной избыточной выборки для модели Simulink. Затем задержки с плавающей запятой работают с более высокой тактовой частотой и могут быть успешно распределены. Дополнительные сведения см. в разделе Конвейеризация тактовой частоты.
Укажите коэффициент избыточной дискретизации, равный или превышающий задержку операторов с плавающей запятой, которым не удается выделить задержки. Для RunningSum модель, укажите коэффициент избыточной выборки, по крайней мере равный 12. Сведения о значениях задержки операторов с плавающей запятой см. в разделе Блоки Simulink, поддерживаемые собственной плавающей запятой.
Чтобы указать коэффициент избыточной выборки, выполните следующие действия.
На вкладке Приложения выберите Кодер HDL. Появится вкладка Код HDL (HDL Code).
Щелкните Настройки (Settings). На вкладке Создание кода HDL > Глобальные параметры установите для параметра Коэффициент избыточной выборки значение 12.
Включите сведение иерархии на DUT и убедитесь, что подсистемы внутри DUT наследуют этот параметр. Для RunningSum модель, выберите CumSum_sl и щелкните Свойства блока HDL (HDL Block Properties) на вкладке Код HDL (HDL Code), а затем установите для параметра FlattenHierarchy значение on.
Чтобы смоделировать конструкцию на скорости передачи данных и выборочно увеличить частоту дискретизации блоков, для которых Coder™ HDL не может распределить задержки, используйте локальную избыточную выборку. Эти блоки затем работают с более высокой тактовой частотой и могут выдерживать требуемое количество задержек.
Если открыть RunningSum_OSmanual и перейдите к блоку «Добавить», в котором показано, как можно увеличить частоту выборки блока «Добавить» и выделить задержки.

Блоки, находящиеся в пределах границ блоков Repeat и Zero Order Hold, работают с тактовой частотой, в 12 раз превышающей частоту дискретизации модели.
Подсистема имеет блок задержки длиной 12 на выходе блока добавления. При формировании кода блок Add поглощает этот блок Delay, который компенсирует задержку оператора. Чтобы сбалансировать задержки, подсистема содержит блоки задержки длиной 12 в других путях.
Теперь можно создать код HDL для CumSum_sl подсистема. Создание кода HDL для CumSum_Sl Подсистема, щелкните правой кнопкой мыши подсистему и выберите HDL Code > Generate HDL for Subsystem.
Эта парадигма моделирования используется для моделирования всей конструкции на скорости передачи данных Simulink. Для блоков, которые не могут выдержать необходимое количество задержек, добавьте блок задержки с достаточной длиной задержки на выходе блоков. Укажите длину задержки, равную задержке оператора с плавающей запятой. Убедитесь, что в других путях добавлены соответствующие задержки.
Для RunningSum можно добавить блок задержки длиной 12 на выходе блока добавления. При формировании кода блок Add поглощает эту задержку, поскольку блок имеет задержку 12.
Дополнительные сведения см. в разделе Вопросы задержки с собственной плавающей точкой.
Можно использовать стратегию задержки для различных блоков, чтобы указать пользовательское значение задержки и компенсировать дополнительные задержки. Использование этой стратегии позволяет оптимизировать дизайн для компромиссов между:
Тактовая частота и потребляемая мощность.
Коэффициент избыточного отображения и частота дискретизации.
Дополнительные сведения о компромиссах и блоках, для которых можно указать пользовательскую задержку, см. в разделе LatencyStrategy.
Примечание.При использовании пользовательской стратегии задержки убедитесь, что подсистема, содержащая блок, для которого собственная плавающая точка не может выделять задержки, не является условной подсистемой. То есть подсистема не должна содержать порты триггера, сброса или активизации.
Чтобы увидеть, как с помощью пользовательской задержки можно решить проблему с выделением задержки, откройте модель RunningSum_Custom.slx.

Модель похожа на исходную RunningSum модель, но не имеет блока Enable. Использование блока Enable может предотвратить поглощение задержек пользовательской стратегией задержки. Укажите пользовательскую задержку блока «Добавить». Блок добавления может затем поглощать единичную задержку рядом с блоком добавления.
Теперь можно создать код HDL для подсистемы CumSum_sl.
Можно использовать параметр стратегии нулевой задержки для блоков в конструкции, для которых собственная плавающая точка не может выделять задержки. По умолчанию блоки в конструкции наследуют собственные настройки с плавающей запятой, заданные в диалоговом окне «Параметры конфигурации». Чтобы задать стратегию нулевой задержки для блока, в диалоговом окне Свойства блока HDL (HDL Block Properties) на вкладке Собственная плавающая точка (Native Floating Point) задайте значение LatencyStrategy как Zero.
Для RunningSum например, установите для параметра LatencyStrategy блока Add значение Zero. Чтобы выбрать собственную библиотеку с плавающей запятой и указать стратегию нулевой задержки, в командной строке введите:
fc = hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint'); hdlset_param('RunningSum/CumSum_sl/Subsystem/Add', ... 'LatencyStrategy', 'Zero');
Примечание
Для достижения хорошей производительности на целевом устройстве FPGA не рекомендуется устанавливать значение «Стратегия задержки» (Latency Strategy). Zero в диалоговом окне Параметры конфигурации (Configuration Parameters).
createFloatingPointTargetConfig