В этом примере показано, как использовать различную оптимизацию в блоке MATLAB function и через контур блока MATLAB function с другими блоками в вашей модели Simulink®. Пример также иллюстрирует различие в области и синхронизации, когда вы используете различные настройки архитектуры HDL блока MATLAB function.
Генерация HDL-кода для блока MATLAB function поддерживает две архитектуры HDL: MATLAB Function
и MATLAB Datapath
. Задайте Архитектуру HDL в диалоговом окне HDL Block Properties блока MATLAB function.
Используйте MATLAB Datapath
архитектура к;
Комплексная фиксированная точка модели и алгоритмы MATLAB с плавающей точкой в блоках MATLAB function и интерфейсе этот алгоритм с другими блоками Simulink в вашей модели.
Улучшите область и синхронизацию вашего проекта значительно путем оптимизации алгоритма в блоке MATLAB function и через контур блока MATLAB function с другими блоками Simulink в модели.
Эта архитектура является настройкой по умолчанию для блоков MATLAB function с типами с плавающей точкой. Путем включения MATLAB Datapath
архитектура для операций фиксированной точки, можно использовать различную оптимизацию, которая включает:
Выравнивание иерархии
Разделение ресурсов и потоковая передача
Конвейеризация тактовой частоты
Адаптивная конвейеризация
Распределенная конвейеризация и иерархическая распределенная конвейеризация
Оценка критического пути
Модели Fixed-point 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 к представлению потока данных, которое использует блоки Simulink. MATLAB Datapath
архитектура разворачивает циклы в вашем коде из-за этого преобразования. Если вы хотите передать циклы потоком, любое использование оптимизация потоковой передачи цикла с MATLAB Function
архитектура или использование оптимизация потоковой передачи с MATLAB Datapath
как архитектура HDL.
При помощи MATLAB Datapath
архитектура, можно эффективнее выполнить различную оптимизацию HDL Coder™ с блоком MATLAB function, который вы в противном случае выполнили бы с блоком Subsystem. MATLAB Datapath
архитектура применяет настройки оптимизации, которые вы задаете на алгоритме в блоке MATLAB function и через контур блока MATLAB function с другими блоками в вашей модели Simulink.
Например, рассмотрите эту модель с Подсистемой DUT, которая состоит из блока продукта и блока 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. В этом примере можно совместно использовать блок продукта вне блока 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 с блоком продукта снаружи. Вы видите группу совместного использования из трех множителей в Отчете Оптимизации. Когда вы щелкаете по ссылкам в группе совместного использования, разделяемые множители подсвечены в сгенерированной модели и исходной модели.
Для модели в качестве примера, которая иллюстрирует 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 с четырьмя блоками Усиления снаружи. Вторая группа совместного использования состоит из сумматоров в каждом из этих двух блоков MATLAB function.
Можно использовать распределенную оптимизацию конвейеризации с Distributedpipe_MLFB
подсистема. Включите иерархическую распределенную конвейеризацию в верхнем уровне и установите архитектуру HDL функции 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
Подсистема.