В этом примере показано, как использовать различные оптимизации внутри функционального блока MATLAB и через границу функционального блока MATLAB с другими блоками в модели Simulink ®. Пример также иллюстрирует разницу в площади и времени при использовании различных настроек архитектуры HDL функционального блока MATLAB.
Генерация кода HDL для функционального блока MATLAB поддерживает две архитектуры HDL: MATLAB Function и MATLAB Datapath. Укажите архитектуру HDL в диалоговом окне Свойства блока HDL функционального блока MATLAB.
Используйте MATLAB Datapath архитектура для;
Моделирование сложных алгоритмов MATLAB с фиксированной и плавающей точками внутри функциональных блоков MATLAB и взаимодействие этого алгоритма с другими блоками Simulink в модели.
Значительно увеличьте площадь и время проектирования за счет оптимизации алгоритма внутри функционального блока MATLAB и через границу функционального блока MATLAB с другими блоками Simulink в модели.
Эта архитектура является настройкой по умолчанию для функциональных блоков MATLAB с типами с плавающей запятой. Путем включения MATLAB Datapath архитектура для операций с фиксированной точкой, вы можете использовать различные оптимизации, которые включают в себя:
Распрямление иерархии
Совместное использование ресурсов и потоковая передача
Конвейеризация тактовой частоты
Адаптивная конвейерная обработка
Распределенная конвейерная обработка и иерархическая распределенная конвейерная обработка
Оценка критического пути
Модели Simulink ® с фиксированной точкой используют MATLAB Function архитектура по умолчанию. Некоторые оптимизации ЛПВП, такие как совместное использование ресурсов и распределенная конвейерная обработка, обеспечиваемая с помощью этой архитектуры, оптимизируют блоки, окружающие функциональный блок MATLAB, и алгоритм внутри функционального блока MATLAB. Чтобы увидеть эффект оптимизации внутри функционального блока MATLAB, проверьте сгенерированный код HDL для блока. Эта архитектура не применяет оптимизации по всей границе функционального блока MATLAB с другими блоками Simulink.
Модели Simulink с плавающей запятой используют MATLAB Datapath архитектура, даже если вы указываете MATLAB Function в качестве настройки архитектуры для блока. При использовании типов с плавающей запятой укажите собственный режим с плавающей запятой. При такой архитектуре генератор кода обрабатывает блок как обычный блок подсистемы. Кодер HDL преобразует алгоритм потока управления кодом MATLAB внутри функционального блока MATLAB в представление потока данных, в котором используются блоки Simulink. MATLAB Datapath из-за этого преобразования архитектура разворачивает циклы в коде. Если необходимо выполнить потоковую передачу циклов, используйте оптимизацию потоковой передачи цикла с помощью MATLAB Function или использовать оптимизацию потоковой передачи с помощью MATLAB Datapath в качестве архитектуры HDL.
С помощью MATLAB Datapath Архитектура позволяет более эффективно выполнять различные оптимизации Coder™ HDL с помощью блока MATLAB Function, который в противном случае выполнялся бы с блоком Subsystem. MATLAB Datapath архитектура применяет параметры оптимизации, заданные для алгоритма внутри функционального блока MATLAB и через границу функционального блока MATLAB с другими блоками в модели 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 реализует два умножения.
open_system('hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function')

Архитектура HDL функционального блока MATLAB имеет значение MATLAB Datapath. Создание кода HDL для HDL_DUT Подсистема, выполните следующую команду:
makehdl('hdlcoder_MLFB_simple_datapath/HDL_DUT')
При генерации кода HDL генератор кода заменяет функциональный блок MATLAB подсистемой, выполняющей умножение. c * d и e * f.

С помощью MATLAB Datapath архитектура позволяет выполнять оптимизацию в функциональном блоке MATLAB и в функциональном блоке MATLAB с другими блоками Simulink. В этом примере можно совместно использовать два множителя в блоке MATLAB Function. Чтобы оптимизировать блоки, задайте для параметра SharingFactor значение 2 в функциональном блоке MATLAB.
mlsubsys = 'hdlcoder_MLFB_simple_datapath/HDL_DUT/MATLAB Function'; hdlset_param(mlsubsys, 'SharingFactor', 2)
При генерации кода HDL генератор кода совместно использует умножение внутри блока MATLAB Function. Группа совместного доступа отображается в отчете по оптимизации. При щелчке по ссылкам в группе совместного использования кодер HDL отображает общие множители внутри блока MATLAB Function в созданной модели и исходной модели.

Оптимизацию можно применить к функциональному блоку MATLAB с другими блоками Simulink. В этом примере можно совместно использовать блок продукта вне функционального блока MATLAB с умножителями внутри функционального блока MATLAB. Для совместного использования этих ресурсов удалите 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 с блоком продукта снаружи. В отчете по оптимизации отображается группа совместного использования трех множителей. При щелчке по ссылкам в группе общего доступа общие множители подсвечиваются в созданной модели и исходной модели.

Для примера модели, которая иллюстрирует 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 с другими блоками. Обе подсистемы выполняют основные дополнения и умножения внутри и снаружи функционального блока MATLAB.
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. Группа совместного использования включает два сумматора внутри подсистемы и блок добавления снаружи. Генератор кода не разделил множители и сумматоры, находящиеся внутри блока MATLAB Function.
Оценка критического пути включена в модели. При аннотировании критического пути блок функции MATLAB выступает в качестве барьера для этой оптимизации. Если критический путь находится внутри функционального блока MATLAB и если необходимо выделить критический путь, используйте MATLAB Datapath архитектура.

Создание кода HDL для HDL_DUT_distpipe, выполните следующую команду:
makehdl('hdlcoder_MLFB_share_pipeline/HDL_DUT_distpipe')
При открытии отчета о распределенных трубопроводах видно, что генератор кода перемещал трубопроводы внутри HDL_DUT_distpipe подсистема, но не распределяла трубопроводы внутри функционального блока MATLAB.

На этом рисунке показано, как распределенная конвейерная обработка перемещала регистры трубопроводов внутри подсистемы.

Чтобы улучшить область и время вашего дизайна, используйте MATLAB Datapath архитектура. Для HDL_DUT_sharing подсистема может сочетать совместное использование ресурсов с конвейерированием тактовой частоты и совместно использовать ресурсы в функциональном блоке MATLAB и в функциональном блоке MATLAB с другими блоками.
Для совместного использования ресурсов:
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 внутри 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.
Можно использовать оптимизацию распределенного конвейера с помощью Distributedpipe_MLFB подсистема. Включите иерархическую распределенную конвейерную обработку на верхнем уровне и установите для архитектуры HDL функции MATLAB значение MATLAB Datapath с Pipelining, установленным на 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 Подсистема.
