В этом примере показано, как использовать блоки внутри Подсистемы For Each в вашей Simulink™ модели, а затем сгенерировать HDL-код.
Чтобы неоднократно выполнять один и тот же алгоритм над отдельными элементами или подрешетками входных сигналов, используйте блок For Each Subsystem. Набор блоков в Подсистеме тиражирует алгоритм, который применяется к отдельным элементам или поровну разделённым подрешеткам входных сигналов. Используя блок For Each Subsystem, вы не должны создавать и соединять реплики блока Subsystem, чтобы смоделировать один и тот же алгоритм. Для каждой подсистемы:
Поддерживает векторную или 2-D матричную обработку, которая сокращает время симуляции вашей модели. Можно обрабатывать отдельные элементы или подрешетки входного сигнала одновременно.
Улучшает читаемость кода при помощи цикла for-generate в сгенерированном HDL-коде. Цикл for-generate уменьшает количество строк кода, что в противном случае может привести к сотням строк кода для больших векторных сигналов.
Поддерживает генерацию HDL-кода для всех типов данных, блоков Simulink™ и предопределенных и пользовательских системных объектов.
Поддерживает оптимизацию внутри и внутри блока, такие как совместное использование ресурсов и конвейеризация. Возможность параллельной обработки блока For Each Subsystem в сочетании с оптимизациями, которые вы задаете, обеспечивает высокую эффективность на целевом устройстве FPGA.
Откройте foreach_subsystem_example1
модель. Вы видите этот простой алгоритм, смоделированный внутри блока For Each Subsystem.
Когда вы симулируете модель, вы видите, что входные сигналы In1
и In3
разделены на подрешетки. Чтобы увидеть этот раздел, дважды кликните блок For Each. Параметры блоков Размерность и Partition Width задают размерность, через которую распределяется входной сигнал, и ширину каждого среза раздела соответственно. На основе размеров входного сигнала и заданного вами разбиения, For Each Subsystem определяет количество итераций, которые ему требуется для вычисления алгоритма.
В этом примере входные сигналы In1 и In3 размера 8 разбиты на четыре подрешетки, каждый из которых имеет размер 2. Входной сигнал In2 размера 2 не разбит. Чтобы вычислить алгоритм, Подсистеме For Each требуется четыре итерации с каждой итерацией, повторяющей алгоритм на каждом из четырех подрешетки In1 и In3.
Подсистема For Each упрощает моделирование векторизованных алгоритмов. Этот рисунок показывает, как можно смоделировать тот же алгоритм, создав несколько образцы подсистемы. Эта модель может стать графически сложной и трудной для обслуживания.
Подсистема For Each поддерживает 2-D матричный вход для генерации HDL-кода. Для примера, foreach_subsystem_example2
модель показывает простую многоканальную операцию фильтра. Генерация HDL-кода не поддерживается для матриц в вход и выход портах HDL DUT, поэтому модель разделяет каналы в контур подсистемы DUT.
Подсистема For Each усредняет выборки по каждому каналу. Сгенерированный HDL-код будет содержать три копии логики внутри For Each Subsystem, и каждая работает с вектором 4x1.
Блок не поддерживает типы комплексных данных, как входы для генерации HDL-кода. Чтобы ввести комплексный сигнал, можно преобразовать этот сигнал в массив сигналов, а затем ввести в блок.
Чтобы выполнить тот же алгоритм как на действительной, так и на мнимой частях сигнала:
Разделите сигнал на действительные и мнимые части при помощи блока Complex to Real-Imag.
Создайте сигнал вектора, который состоит из действительной и мнимой частей при помощи блока Mux.
Затем можно ввести этот вектор в блок For Each Subsystem и повторить одни и те же расчеты как на вещественной, так и на мнимой частях. На выходе For Each Subsystem можно преобразовать выход вектора назад в комплексный сигнал. Используйте блок Demux, чтобы разделить действительную и мнимую скалярные части, а затем введите скаляры в блок Real-Imag to Complex.
Чтобы сгенерировать HDL-код, в foreach_subsystem_example1
модель, щелкните правой кнопкой мыши по Subsystem_Foreach
блокировать и выбрать HDL-код > Сгенерировать HDL для подсистемы.
Чтобы увидеть сгенерированный HDL-код для Subsystem_Foreach
блок, в MATLAB™ Командном окне, нажмите Subsystem_Foreach.vhd
файл. В фрагменте кода VHDL этот цикл for-generate отображается в HDL-коде. Этот цикл создает четыре образцов подсистемы, причем каждый образец выполняет алгоритм на подмассе 2 подрешетки входов In1 и In3.
Можно задать оптимизации, которые изменяют содержимое подсистем, экземпляры которых Для каждой Подсистемы. В таких случаях генератор кода не использует циклы for-generate в HDL-коде. HDL-код не содержит циклов for-generate, если у вас есть:
Шина или комплексные входные сигналы.
Совместное использование ресурсов и потоковая оптимизация подсистемы.
Векторные входы, которые разбиваются на нескалярные сигналы в коде Верилога. Чтобы получить циклы for-generate в коде Verilog, разбейте векторный сигнал на скаляры.
Чтобы оптимизировать алгоритм, содержащийся в Каждой Подсистеме, можно включить оптимизацию, такую как совместное использование ресурсов и потоковая передача в DUT, которая содержит Каждую Подсистему. Для примера с помощью оптимизации совместного использования ресурсов можно совместно использовать несколько образцы Подсистемы, созданных Подсистемой Для Каждого. Эта оптимизация повторно использует алгоритм, смоделированный Подсистемой, для нескольких образцов и уменьшает использование области на целевом устройстве.
Примечание.Когда вы включаете оптимизацию для каждой подсистемы, сгенерированный HDL-код не содержит циклов for-generate.
В этом примере показано, как использовать оптимизацию совместного использования ресурсов в Подсистеме For Each. Чтобы поделиться ресурсами, выберите блок Subsystem, который содержит Для каждой Подсистемы, а затем укажите Коэффициент Совместного Использования. В этом примере щелкните правой кнопкой мыши по Subsystem_Foreach
и выберите HDL-код > Свойства блоков HDL. Установите значение коэффициента совместного использования равным 4, поскольку функция For Each Subsystem генерирует четыре образцов Подсистемы. Затем сгенерируйте HDL-код для Subsystem_Foreach
блок.
Чтобы увидеть эффект оптимизации совместного использования ресурсов, в командной строке введите gm_foreach_subsystem_example1
чтобы открыть сгенерированную модель. В сгенерированной модели вы видите, что оптимизация разделяет четыре образцов подсистемы, сгенерированные For Each Subsystem, в одну Подсистему For Each Subsystem_Instance1
.
Если вы дважды кликните For Each Subsystem_Instance1
блок, вы видите алгоритм, вычисленный для подрешетки size 2 входов In1 и In3.
Дополнительные сведения об оптимизации совместного использования ресурсов см. в разделе Совместное использование ресурсов.