Иногда, при генерации кода из алгоритма с плавающей точкой в 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, Поддержанные с Собственным компонентом, С плавающей точкой.
Задавать фактор сверхдискретизации:
Во вкладке Apps выберите HDL Coder. Вкладка HDL Code появляется.
Нажмите Settings. Во вкладке HDL Code Generation> Global Settings, набор Oversampling factor к 12
.
Включите иерархию, сглаживающуюся на DUT, и убедитесь, что подсистемы в DUT наследовали эту установку. Для RunningSum
модель, выберите CumSum_sl
подсистема и нажимает HDL Block Properties на вкладке HDL Code, и затем установила 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 может затем поглотить Unit Delay, смежный с блоком Add.
Можно теперь сгенерировать HDL-код для подсистемы CumSum_sl.
Можно использовать нулевую установку стратегии задержки для блоков в проекте, которого нативная плавающая точка не может выделить задержки. По умолчанию блоки в вашем проекте наследовали нативные настройки с плавающей точкой, которые вы задаете в диалоговом окне Configuration Parameters. Чтобы задать нулевую установку стратегии задержки для блока, в диалоговом окне 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