В этом примере показано, как использовать различные оптимизации внутри блока MATLAB Function и через контур блока MATLAB Function с другими блоками в вашей модели Simulink ®. Пример также иллюстрирует различие в области и времени, когда вы используете различные настройки HDL- архитектуры блока MATLAB Function.
Генерация HDL-кода для блока MATLAB Function поддерживает две архитектуры HDL: MATLAB Function
и MATLAB Datapath
. Задайте HDL Architecture в диалоговом окне HDL Block Properties блока MATLAB Function.
Используйте MATLAB Datapath
архитектура к;
Моделируйте комплексные алгоритмы MATLAB с фиксированной и плавающей точками внутри блоков MATLAB Function и соединяйте этот алгоритм с другими блоками Simulink в вашей модели.
Значительно улучшите площадь и время своего проекта путем оптимизации алгоритма внутри блока MATLAB Function и через контур блока MATLAB Function с другими блоками Simulink в вашей модели.
Эта архитектура является настройкой по умолчанию для блоков MATLAB Function с типами с плавающей точкой. Путем включения MATLAB Datapath
архитектура для операций с фиксированной точкой, можно использовать различные оптимизации, которые включают:
Сплющивание иерархии
Совместное использование ресурсов и потоковая передача
Конвейеризация с тактовой частотой
Адаптивная конвейеризация
Распределённая конвейеризация и иерархическое распределённая конвейеризация
Оценка критического пути
Модели Simulink ® с фиксированной точкой используют MATLAB Function
по умолчанию архитектура. Некоторые оптимизации HDL, такие как совместное использование ресурсов и распределённая конвейеризация, которые вы включаете с этой архитектурой, оптимизируют блоки, окружающие блок MATLAB Function и алгоритм внутри блока MATLAB Function. Чтобы увидеть эффект оптимизации внутри блока MATLAB Function, исследуйте сгенерированный HDL-код для блока. Эта архитектура не применяет оптимизации через контур блока MATLAB Function с другими блоками Simulink.
Модели Simulink с плавающей точкой используют MATLAB Datapath
архитектура, даже если вы задаете MATLAB Function
как настройку архитектуры для блока. Когда вы используете типы с плавающей точкой, задайте собственный режим с плавающей точкой. С этой архитектурой генератор кода обрабатывает блок как обычный блок Subsystem. HDL Coder преобразует алгоритм потока управления кода MATLAB внутри блока MATLAB Function в представление dataflow, которое использует блоки Simulink. The MATLAB Datapath
архитектура разворачивает циклы в вашем коде из-за этого преобразования. Если вы хотите потоковыми циклами, либо используйте циклическую оптимизацию потоковой передачи с MATLAB Function
архитектура или используйте потоковую оптимизацию с MATLAB Datapath
как архитектура HDL.
При помощи MATLAB Datapath
Архитектура можно более эффективно выполнить различные оптимизации HDL Coder™ с помощью блока MATLAB Function, который вы бы в противном случае выполнили с блоком Subsystem. The MATLAB Datapath
архитектура применяет настройки оптимизации, которые вы задаете на алгоритме внутри блока MATLAB Function и через контур блока MATLAB Function, к другим блокам в вашей модели Simulink.
Например, рассмотрите эту модель с Подсистемой DUT, которая состоит из блока Product и блока MATLAB Function.
open_system('hdlcoder_MLFB_simple_datapath') set_param('hdlcoder_MLFB_simple_datapath', 'SimulationCommand', 'Update') open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT')
Блок MATLAB Function реализует два умножения.
open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function')
Архитектура HDL блока MATLAB Function установлена на MATLAB Datapath
. Чтобы сгенерировать HDL-код для HDL_DUT
Подсистема, выполните эту команду:
makehdl('hdlcoder_MLFB_simple_datapath/HDL_DUT')
Когда вы генерируете HDL-код, генератор кода заменяет блок MATLAB Function на подсистему, которая выполняет умножения c * d
и e * f
.
С MATLAB Datapath
можно выполнить оптимизацию внутри блока MATLAB Function и через блок MATLAB Function с другими блоками Simulink. В этом примере можно совместно использовать два множителя внутри блока MATLAB Function. Чтобы оптимизировать блоки, установите значение SharingFactor равным 2
на блоке MATLAB Function.
mlsubsys = 'hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function'; hdlset_param(mlsubsys, 'SharingFactor', 2)
Когда вы генерируете HDL-код, генератор кода делит умножения внутри блока MATLAB Function. Группа совместного использования отображается в отчете Оптимизации. При клике ссылок в группе совместного использования HDL Coder отображает общие множители внутри блока MATLAB Function в сгенерированной модели и исходной модели.
Можно применить оптимизацию через блок MATLAB Function с другими блоками Simulink. В этом примере можно совместно использовать блок Product вне блока MATLAB Function с умножителями внутри блока MATLAB Function. Чтобы поделиться этими ресурсами, удалите SharingFactor на блоке MATLAB Function и на родительской подсистеме, HDL_DUT
, включите FlattenHierarchy и установите значение SharingFactor равным 3
.
hdlset_param(mlsubsys, 'SharingFactor', 0) hdlset_param('hdlcoder_MLFB_simple_datapath/HDL_DUT', ... 'FlattenHierarchy', 'on', 'SharingFactor', 3)
Примечание: Не используйте InlineMATLABCode
свойство с MATLAB Datapath
архитектура блока. Использование FlattenHierarchy
вместо этого.
Когда вы генерируете HDL-код, генератор кода делит умножения внутри блока MATLAB Function с блоком Product снаружи. Группа совместного использования из трех умножителей отображается в отчете Оптимизации. При клике ссылок в группе совместного использования общие множители подсвечиваются в сгенерированной модели и исходной модели.
Для модели примера, которая иллюстрирует MATLAB Datapath
архитектура и чем она отличается от MATLAB Function
архитектура, откройте модель hdlcoder_MLFB_share_pipeline
. Модель использует целые типы. Для примера, который иллюстрирует, как вы используете MATLAB Datapath
архитектура с плавающими типами точек, см., «Генерация независимого от цели HDL-кода с собственной плавающей точкой».
open_system('hdlcoder_MLFB_share_pipeline') set_param('hdlcoder_MLFB_share_pipeline','SimulationCommand','Update')
Модель содержит две подсистемы DUT на верхнем уровне HDL_DUT_sharing
и HDL_DUT_distpipe
. Подсистемы иллюстрируют, как можно использовать совместное использование ресурсов и распределенную оптимизацию конвейеризации через контур блока MATLAB Function с другими блоками. Обе подсистемы выполняют основные сложения и умножения внутри и вне блока MATLAB Function.
open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')
open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem')
open_system('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')
Чтобы увидеть параметры HDL, которые сохраняются в модели, запустите hdlsaveparams
функция.
hdlsaveparams('hdlcoder_MLFB_share_pipeline')
%% Set Model 'hdlcoder_MLFB_share_pipeline' HDL parameters hdlset_param('hdlcoder_MLFB_share_pipeline', 'CriticalPathEstimation', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'HDLSubsystem', 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'OptimizationReport', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'Oversampling', 40); hdlset_param('hdlcoder_MLFB_share_pipeline', 'ResourceReport', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'ShareAdders', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'TargetDirectory', 'hdl_prj\hdlsrc'); hdlset_param('hdlcoder_MLFB_share_pipeline', 'Traceability', 'on'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'DistributedPipelining', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe', 'FlattenHierarchy', 'on'); % Set SubSystem HDL parameters hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'FlattenHierarchy', 'on'); hdlset_param('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing', 'SharingFactor', 8);
Вы видите, что значение по умолчанию MATLAB Function
HDL- архитектуры сохраняется на модели.
Чтобы сгенерировать HDL-код для общего DUT, запустите эту команду:
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing')
Когда вы открываете Отчет о потоковой передаче и совместном использовании, отчет отображает четыре множителя и три сумматора как общие ресурсы.
При клике второй группы совместного использования генератор кода подсвечивает три аддера, окружающих блок MATLAB Function. Группа совместного использования включает два сумматора внутри Подсистемы и блок Add снаружи. Генератор кода не разделял множители и сумматоры, которые находятся внутри блока MATLAB Function.
Оценка критического пути включена в модели. Когда вы аннотируете критический путь, блок MATLAB Function действует как барьер для этой оптимизации. Если критический путь находится внутри блока MATLAB Function и если вы хотите выделить критический путь, используйте MATLAB Datapath
архитектура.
Чтобы сгенерировать HDL-код для HDL_DUT_distpipe
, выполните эту команду:
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')
Когда вы открываете Отчет распределённой конвейеризации, вы видите, что генератор кода перемещает трубопроводы внутрь HDL_DUT_distpipe
подсистема, но не распределяет трубопроводы внутри блока MATLAB Function.
Этот рисунок показывает, как распределенная конвейеризация перемещает регистры трубопровода внутри подсистемы.
Чтобы улучшить площадь и сроки вашего проекта, используйте MATLAB Datapath
архитектура. Для HDL_DUT_sharing
подсистема, можно объединить совместное использование ресурсов с конвейеризацией с тактовой частотой и совместно использовать ресурсы внутри блока MATLAB Function и через блок MATLAB Function с другими блоками.
Для совместного использования ресурсов:
1. Включите FlattenHierarchy и укажите SharingFactor в родительской подсистеме HDL_DUT_sharing
. Установите значение SharingFactor равным 8
.
share_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing'; hdlset_param(share_subsys, 'FlattenHierarchy', 'on', 'SharingFactor', 8);
2. Задайте MATLAB Datapath
архитектура для блоков MATLAB Function внутри HDL_DUT_sharing
подсистема.
share_mlfcn1 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/MATLAB Function'; share_mlfcn2 = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_sharing/Subsystem/MATLAB Function'; hdlset_param(share_mlfcn1, 'architecture', 'MATLAB Datapath'); hdlset_param(share_mlfcn2, 'architecture', 'MATLAB Datapath');
Когда вы открываете отчет Потоковая передача и совместное использование, в отчете отображается общая группа из восьми умножителей и двух общих групп сумматоров.
Когда вы выбираете первую группу совместного использования, вы видите, что оптимизация разделяет множители внутри функции MATLAB с четырьмя блоками Gain снаружи. Вторая группа совместного использования состоит из сумматоров внутри каждого из двух Блоков MATLAB function.
Можно использовать распределенную оптимизацию конвейеризации с Distributedpipe_MLFB
подсистема. Включите иерархическое распределённую конвейеризацию на верхнем уровне и установите архитектуру функции MATLAB на MATLAB Datapath
с установленным значением DistributedPipelining на on
.
hdlset_param('hdlcoder_MLFB_share_pipeline', 'HierarchicalDistPipelining', 'on'); dist_subsys = 'hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe/MATLAB Function'; hdlset_param(dist_subsys, 'architecture', 'MATLAB Datapath'); hdlset_param(dist_subsys, 'DistributedPipelining', 'on');
После того, как вы сгенерируете HDL-код, откройте сгенерированную модель. Генератор кода использует иерархическую распределенную конвейеризацию и распределенную конвейеризацию, чтобы переместить регистры конвейера через блоки и внутри MATLAB Function
Подсистема.
Этот рисунок показывает, как распределенная конвейеризация перемещается регистры трубопровода внутри MATLAB Function
Подсистема.