Иногда, при генерации кода из алгоритма с плавающей точкой в 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 в модели. Этот блок в обратной связи.
Блок Add имеет задержку 11. При генерации кода HDL Coder™ не может выделить 11 задержек блока, потому что это не может добавить соответствие с задержками с другими путями.
Эта модель служит примером, чтобы проиллюстрировать различные стратегии решить эту проблему.
Эта парадигма моделирования использует оптимизацию конвейеризации тактовой частоты, чтобы сверхдискретизировать ваш проект к тактовой частоте намного быстрее, чем частота дискретизации DUT. Чтобы включить эту оптимизацию, задайте глобальный фактор сверхдискретизации для своей модели Simulink. Задержки с плавающей точкой затем действуют на более быстрой тактовой частоте и могут быть выделены успешно. Для получения дополнительной информации смотрите, что Тактовая частота Конвейерно обрабатывает.
Задайте фактор сверхдискретизации, который равен или больше, чем задержка операторов с плавающей точкой, которые не могут выделить задержки. Для модели RunningSum
укажите, что фактор сверхдискретизации, по крайней мере, равняется 12
. Чтобы узнать о значениях задержки операторов с плавающей точкой, смотрите блоки Simulink, Поддержанные с Собственным компонентом, С плавающей точкой.
Чтобы задать фактор сверхдискретизации, в диалоговом окне Configuration Parameters, на вкладке HDL Code Generation> Global Settings, устанавливают Oversampling factor на 12
.
Включите иерархию, сглаживающуюся на DUT, и убедитесь, что подсистемы в DUT наследовали эту установку. Для модели RunningSum
щелкните правой кнопкой по подсистеме CumSum_sl
и выберите HDL Code> HDL Block Properties, и затем установите FlattenHierarchy на on
.
Чтобы смоделировать ваш проект на скорости передачи данных и выборочно увеличить частоту дискретизации блоков, которых HDL Coder™ не может выделить задержки, используйте локальную сверхдискретизацию. Эти блоки затем действуют на более быстрой тактовой частоте и могут разместить необходимое количество задержек.
Если вы открываете модель RunningSum_OSmanual
и перешли к блоку Add, она показывает, как можно увеличить частоту дискретизации блока Add и выделить задержки.
Блоки, которые являются в контуре Повторного и Нулевого Порядка, Содержат блоки, действуют на тактовой частоте, которая в 12 раз быстрее, чем частота дискретизации модели.
Подсистема имеет блок Delay длины 12 при выводе блока Add. При генерации кода блок Add поглощает этот блок Delay, который компенсирует задержку оператора. Чтобы сбалансировать задержки, подсистема содержит блоки Задержки длины 12 в других путях.
Можно теперь сгенерировать HDL-код для подсистемы CumSum_sl
. Чтобы сгенерировать HDL-код для Подсистемы CumSum_Sl
, щелкните правой кнопкой по подсистеме и выберите HDL Code> Generate HDL for Subsystem.
Используйте эту парадигму моделирования, чтобы смоделировать ваш целый проект на скорости передачи данных Simulink. Для блоков, которые не могут разместить необходимое количество задержек, добавьте блок Delay с достаточным Delay length при выводе блоков. Задайте Delay length, который равен задержке оператора с плавающей точкой. Убедитесь, что вы добавляете соответствие с задержками других путей.
Для модели RunningSum
можно добавить блок Delay длины 12 при выводе блока Add. При генерации кода блок Add поглощает эту задержку, потому что блок имеет задержку 12.
Для получения дополнительной информации смотрите Факторы Задержки с Нативной Плавающей точкой.
Можно использовать Стратегию Задержки различных блоков, чтобы задать пользовательское значение задержки и поглотить дополнительные задержки. Используя эту стратегию может оптимизировать ваш проект для компромиссов между:
Синхронизируйте частоту и потребление энергии.
Фактор Oversmapling и частота дискретизации.
Чтобы узнать больше о компромиссах и блоках, для которых можно задать пользовательскую задержку, смотрите LatencyStrategy.
Примечание: Когда вы используете пользовательскую стратегию задержки, убедитесь, что Подсистема, которая содержит блок, которого собственный компонент, с плавающей точкой, не может выделить задержки, не является условной подсистемой. Таким образом, Подсистема не должна содержать триггер, сбрасывать или включать порты.
Чтобы видеть, как использование пользовательской задержки может решить вопрос выделения задержки, открыть модель RunningSum_Custom.slx
.
Модель подобна исходной модели RunningSum
, но не имеет блока Enable. Используя Enable блок может препятствовать пользовательской стратегии задержки поглотить задержки. Задайте пользовательскую задержку одной для блока Add. Блок Add может затем поглотить Единичную задержку, смежную с блоком Add.
Можно теперь сгенерировать HDL-код для подсистемы CumSum_sl.
Можно использовать нулевую установку стратегии задержки для блоков в проекте, которого нативная плавающая точка не может выделить задержки. По умолчанию блоки в вашем проекте наследовали нативные настройки с плавающей точкой, которые вы задаете в диалоговом окне Configuration Parameters. Задавать нулевую установку стратегии задержки для блока:
Щелкните правой кнопкой по блоку и выберите HDL Code> HDL Block Properties.
В диалоговом окне 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.
FPToleranceStrategy
| FPToleranceValue
| hdlcoder.createFloatingPointTargetConfig