Параметры реализации блоков позволяют вам управлять деталями кода, сгенерированного для конкретных реализаций блоков. Смотрите Set and View HDL Model and Block Parameters, чтобы узнать, как выбрать реализации и параметры блоков в графический интерфейс пользователя или командной строке.
Имена свойства заданы как векторы символов. Тип данных значения свойства зависит от свойства. В этом разделе описывается синтаксис каждого параметра реализации блока и то, как параметр влияет на сгенерированный код.
Свойства HDL-блоков библиотечных блоков обрабатываются аналогично параметрам маски. При создании экземпляров библиотечных блоков в модели текущие свойства HDL-блоков этого библиотечного блока копируются в образцы этого блока в вашей модели. Свойства HDL-блоков этих образцов не синхронизируются со свойствами HDL-блоков библиотечного блока. То есть, если вы меняете свойство HDL-блока библиотечного блока, изменение не распространяется на образцы из библиотечных блоков, которые вы уже добавили в Simulink® модель. Если вы хотите, чтобы свойства HDL-блока библиотечного блока были синхронизированы с его образцами в модели, создайте Subsystem и затем поместите этот блок внутрь этого Subsystem. Свойства HDL-блоков блоков, которые находятся внутри блока библиотеки, синхронизируются с соответствующими образцами в вашей модели.
Предположим, что библиотека содержит блок Subsystem с архитектурой, установленной на Module
. Когда вы создаете экземпляр этого блока в вашей модели, образец блока использует Module
как архитектура HDL. Если вы измените HDL- архитектуры блока Subsystem в библиотеке на BlackBox
существующие образцы этого Subsystem блока в вашей модели все еще используют Module
как архитектура HDL. Если теперь вы добавляете образцы Subsystem блока из библиотеки в вашей модели, новые образцы блоков получают копию текущих свойств HDL-блоков и, следовательно, используют BlackBox
как архитектура HDL. Если вы хотите, чтобы архитектура HDL Subsystem блока в библиотеке была синхронизирована с ее образцами в модели, создайте подсистему-оболочку с архитектурой HDL, которую вы хотите использовать в этом Subsystem.
The AdaptivePipelining
Параметр подсистемы позволяет вам задать адаптивную конвейеризацию для подсистемы в модели.
Настройка адаптивной конвейеризации | Описание |
---|---|
'inherit' (по умолчанию) | Используйте адаптивную настройку конвейеризации родительской подсистемы. Если эта подсистема является подсистемой самого высокого уровня, используйте настройку адаптивной конвейеризации для модели. |
'on' | Вставьте адаптивные трубопроводы для этой подсистемы. |
'off' | Не вставляйте адаптивные трубопроводы для этой подсистемы, даже если в родительской подсистеме включена адаптивная конвейеризация. |
Чтобы отключить адаптивную конвейеризацию для подсистемы в модели, установите параметр адаптивной конвейеризации, AdaptivePipelining
, в 'off'
для этой подсистемы.
Чтобы узнать, как задать адаптивную конвейеризацию на уровне модели, смотрите Адаптивную конвейеризацию.
Чтобы установить адаптивную конвейеризацию для подсистемы из диалогового окна «Свойств блока»:
Щелкните подсистему правой кнопкой мыши и выберите HDL Code > HDL Block Properties.
Для AdaptivePipelining выберите inherit, on или off.
Чтобы задать адаптивную конвейеризацию для подсистемы из командной строки, используйте hdlset_param
. Например, чтобы выключить адаптивную конвейеризацию для подсистемы, my_dut
:
hdlset_param('my_dut', 'AdaptivePipelining', 'off')
hdlset_param
.The BalanceDelays
Параметр подсистемы позволяет вам задать балансировку задержки в подсистеме в модели.
Настройка BalanceDelays | Описание |
---|---|
'inherit' (по умолчанию) | Используйте настройку балансировки задержки родительской подсистемы. Если эта подсистема является подсистемой самого высокого уровня, используйте настройку балансировки задержки для модели. |
'on' | Задержки сальдо для этой подсистемы. |
'off' | Не балансируйте задержки для этой подсистемы, даже если у родительской подсистемы включена балансировка задержки. |
Чтобы отключить балансировку задержки для любой подсистемы в модели, необходимо задать параметр балансировки задержки уровня модели, BalanceDelays
, в 'off'
. Когда в модели включена балансировка задержки, установка балансировки задержки в отдельных подсистемах игнорируется.
Чтобы узнать, как задать балансировку задержки уровня модели, смотрите Задержки баланса.
Чтобы задать балансировку задержки для подсистемы с помощью диалогового окна HDL Block Properties:
Щелкните подсистему правой кнопкой мыши.
Выберите HDL Code > HDL Block Properties.
Для BalanceDelays выберите inherit, on или off.
Чтобы задать балансировку задержки для подсистемы из командной строки, используйте hdlset_param
. Для примера, чтобы выключить балансировку задержки для подсистемы, my_dut
:
hdlset_param('my_dut', 'BalanceDelays', 'off')
hdlset_param
.The ClockRatePipelining
Параметр подсистемы позволяет вам задать конвейеризацию с тактовой частотой для подсистемы в модели.
Настройка конвейеризации с тактовой частотой | Описание |
---|---|
'inherit' (по умолчанию) | Используйте настройку конвейеризации с тактовой частотой родительской подсистемы. Если эта подсистема является подсистемой самого высокого уровня, используйте настройку конвейеризации с тактовой частотой для модели. |
'on' | Вставьте трубопроводы тактовой частоты для этой подсистемы. |
'off' | Не вставляйте трубопроводы тактовой частоты для этой подсистемы, даже если в родительской подсистеме включена тактовая частота. |
Чтобы отключить конвейеризацию с тактовой частотой для подсистемы в модели, установите параметр конвейеризации с тактовой частотой, ClockRatePipelining
, в 'off'
для этой подсистемы.
Чтобы узнать, как установить конвейеризацию с тактовой частотой на уровне модели, см. Раздел «Конвейеризация с тактовой частотой».
Чтобы установить конвейеризацию с тактовой частотой для подсистемы с помощью диалогового окна HDL Block Properties:
Щелкните подсистему правой кнопкой мыши.
Выберите HDL Code > HDL Block Properties.
Для ClockRatePipelining выберите inherit, on или off.
Чтобы установить конвейеризацию тактовой частоты для подсистемы из командной строки, используйте hdlset_param
. Для примера, чтобы выключить конвейеризацию с тактовой частотой для подсистемы, my_dut
:
hdlset_param('my_dut', 'ClockRatePipelining', 'off')
hdlset_param
.Когда вы используете блоки Multiport Switch, используйте CodingStyle
параметр, чтобы указать, хотите ли вы сгенерировать HDL-код с операторами if-else или case. По умолчанию HDL- Coder™ генерирует операторы if-else. Если в модели есть несколько блоков Multiport Switch, можно выбрать, чтобы задать другое CodingStyle
для каждого блока.
Настройка CodingStyle | Описание |
---|---|
'ifelse_stmt' (По умолчанию) | Сгенерируйте операторы if-else в коде Verilog или when-else в коде VHDL для блока Multiport Switch. |
'case_stmt' | Сгенерируйте операторы case в коде Verilog или case - когда операторы в коде VHDL для блока Multiport Switch. |
Чтобы задать CodingStyle для Multiport Switch с помощью диалогового окна «Свойств блока»:
Щелкните правой кнопкой мыши блок Multiport Switch.
Выберите HDL Code > HDL Block Properties.
Для CodingStyle выберите ifelse_stmt
или case_stmt
.
Чтобы увидеть CodingStyle
заданный для подсистемы из командной строки, hdlget_param
. Например, чтобы увидеть настройки, заданные для блока Multiport Switch внутри подсистемы, my_dut
:
hdlget_param('my_dut/Multiport Switch', 'CodingStyle')
ans = 'case_stmt'
hdlset_param
.The ConstMultiplierOptimization
параметр реализации позволяет вам задать использование canonical signed digit (CSD) или факторизованных оптимизаций CSD для обработки операций умножения коэффициентов в сгенерированном коде.
Следующая таблица показывает ConstMultiplierOptimization
значений параметров.
Настройка ConstMultiplierOptimization | Описание |
---|---|
'none' (По умолчанию) | По умолчанию HDL Coder не выполняет оптимизацию CSD или FCSD. Код, сгенерированный для блока Gain, сохраняет операции умножения. |
'CSD' | Когда вы задаете эту опцию, сгенерированный код уменьшает площадь, используемую моделью, поддерживая или увеличивая тактовую частоту, используя методы канонической цифры со знаком (CSD). CSD заменяет операции умножения на операции сложения и вычитания. CSD минимизирует количество операций сложения, необходимых для постоянного умножения, представляя двоичные числа с минимальным количеством ненулевых цифр. |
'FCSD' | Эта опция использует факторизованные методы CSD (FCSD), которые заменяют операции умножения на сдвиг и складывают/вычитают операции для определенных факторов операндов. Эти факторы обычно являются простыми, но могут также быть числом, близким к степени 2, что способствует сокращению площади. Эта опция позволяет вам достичь большего сокращения площади, чем CSD, за счет снижения тактовой частоты. |
'auto' | Когда вы задаете эту опцию, HDL Coder выбирает между оптимизацией CSD или FCSD. Кодер выбирает оптимизацию, которая приводит к наиболее эффективной по площади реализации, основываясь на количестве требуемых сумматоров. Когда вы задаете |
The ConstMultiplierOptimization
параметр доступен для следующих блоков:
Выгода
Stateflow® график
Таблица истинности
MATLAB Function
MATLAB System
Используйте ConstrainedOutputPipeline
параметр для задания неотрицательного количества регистров для размещения на выходах блоков.
HDL Coder перемещает существующие задержки в вашем проекте, чтобы попытаться удовлетворить вашим ограничениям. Новые регистры не добавляются. Если регистров меньше, чем кодеру нужно, чтобы удовлетворить вашему ограничению, кодер сообщает различие между количеством нужных и фактических выходных регистров. Можно добавить задержки в проект с помощью входа или вывода конвейеризации.
Распределённая конвейеризация не перераспределяет регистры, заданные с ограничением выходной конвейеризации.
Чтобы задать ограниченную выходную конвейеризацию для блока с помощью графический интерфейс пользователя:
Щелкните правой кнопкой мыши блок и выберите HDL Code > HDL Block Properties.
Для ConstrainedOutputPipeline введите количество регистров, необходимое для портов выхода.
Чтобы задать ограниченную выходную конвейеризацию, в командной строке введите:
hdlset_param(path_to_block,
'ConstrainedOutputPipeline', number_of_output_registers)
subsys
, в вашей модели, mymodel
, введите:hdlset_param('mymodel/subsys','ConstrainedOutputPipeline', 6)
The DistributedPipelining
параметр включает распределение регистров трубопроводов, оптимизацию скорости, которая позволяет вам увеличить тактовую частоту путем уменьшения вашего критического пути.
Следующая таблица показывает эффект DistributedPipelining
и OutputPipeline
параметры.
DistributedPipelining | OutputPipeline, nЭтапы | Результат |
---|---|---|
'off' (по умолчанию) | Не задан (nStages значение по умолчанию 0) | HDL Coder не вставляет регистры конвейера. |
nStages > 0 | Кодер вставляет nStages выходные регистры на выходе подсистемы, MATLAB Function блока или диаграммы Stateflow. | |
'on'
| Не задан (nStages значение по умолчанию 0) | Кодер не вставляет регистры конвейера.DistributedPipelining не имеет эффекта. |
nStages > 0 | Кодер распределяет nStages регистрируется внутри подсистемы, MATLAB Function блока или диаграммы Stateflow на основе анализа критического пути. |
Чтобы добиться дальнейшей оптимизации кода, сгенерированного при распределённой конвейеризации, выполните синхронизацию во время синтеза RTL, если это возможно.
Совет
Выходные данные могут быть в недопустимом состоянии первоначально, если вы вставляете регистры конвейера. Чтобы избежать ошибок испытательного стенда, возникающих из-за начальных недопустимых выборок, отключите проверку выхода для этих выборок. Для получения дополнительной информации смотрите Игнорировать проверку выходных данных (количество выборок).
Если вы используете блок Product для матричного умножения в проекте, используйте DotProductStrategy
для определения способа реализации матричного умножения.
The DotProductStrategy
опции перечислены в следующей таблице.
Функции DotProductStrategy Значения | Описание |
---|---|
'Fully Parallel' (по умолчанию) | Расширяет операцию матричного умножения на умножители и сумматоры. Для примера, если вы умножаете две матрицы 2x2, то для вычисления результата в реализации используются восемь умножителей и четыре сумматора. Примечание Для DotProductStrategy должно быть задано значение |
'Serial Multiply-Accumulate' | Использует архитектуру Serial блока Multiply-Accumulate для реализации матричного умножения. В этой архитектуре тактовая частота должна быть быстрее тактовой частоты, заданной в Parallel архитектуре. Тактовую частоту можно увидеть в Сводных данных часов отчета Генерация кода. |
'Parallel Multiply-Accumulate' | Использует архитектуру Parallel блока Multiply-Accumulate для реализации матричного умножения. |
DSPStyle
позволяет вам сгенерировать код, который включает атрибуты синтеза для отображения умножителя в проекте. Можно выбрать, сопоставлять ли множители конкретного блока с DSP или логикой на оборудовании.
Для Xilinx® targets, сгенерированный код использует use_dsp
атрибут. Для Altera® targets, сгенерированный код использует multstyle
атрибут.
The DSPStyle
опции перечислены в следующей таблице.
Значение DSPStyle | Описание |
---|---|
'none' (по умолчанию) | Не вставляйте атрибут синтеза отображения DSP. |
'on' | Вставьте атрибут синтеза, который направляет инструмент синтеза для сопоставления с DSP в оборудовании. |
'off' | Вставьте атрибут синтеза, который направляет инструмент синтеза для сопоставления с логикой в оборудовании. |
The DSPStyle
параметр доступен для следующих блоков:
Gain
Product
Product of Elements с установленной в дереве архитектурой
Subsystem
Atomic Subsystem
Variant Subsystem
Enabled Subsystem
Triggered Subsystem
Model с установленным значением Architecture ModelReference
Если вы задаете выравнивание иерархии для подсистемы, которая также имеет nondefault DSPStyle
установка, HDL Coder распространяет DSPStyle
установка родительской подсистемы.
Если уплощенная подсистема содержит Gain, Product или Product of Elements блоки, кодер сохраняет их nondefault DSPStyle
и заменяет настройки по умолчанию DSPStyle
настройки с уплощенной подсистемой DSPStyle
настройка.
Сгенерированный код для атрибутов синтеза зависит от:
Целевой язык
DSPStyle
значение
SynthesisTool
значение
В следующей таблице показаны примеры атрибутов синтеза в сгенерированном коде.
Значение DSPStyle | Значение TargetLanguage | Значение SynthesisTool | |
---|---|---|---|
'Altera Quartus II' | 'Xilinx ISE' 'Xilinx Vivado' | ||
'none' | 'Verilog' |
|
|
'VHDL' |
|
| |
'on' | 'Verilog' |
|
|
'VHDL' |
|
| |
'off' | 'Verilog' |
|
|
'VHDL' |
|
|
Необходимо задать инструмент синтеза при помощи SynthesisTool
свойство.
Чтобы задать атрибут синтеза с помощью диалогового окна HDL Block Properties:
Щелкните правой кнопкой мыши блок.
Выберите HDL Code > HDL Block Properties.
Для DSPStyle выберите on, off или none.
Чтобы задать атрибут синтеза из командной строки, используйте hdlset_param
. Например, предположим, что у вас есть модель, my_model
, с подсистемой DUT, my_dut
, который содержит a. Блок Gain, my_multiplier
. Чтобы вставить атрибут синтеза в карту my_multiplier
в DSP введите:
hdlset_param('my_model/my_dut/my_multiplier', 'DSPStyle', 'on')
hdlset_param
.Когда вы задаете nondefault DSPStyle
свойство блока, ConstMultiplierOptimization
свойство должно быть установлено в 'none'
.
Входы к компонентам умножения не могут использовать double
тип данных.
Gain константа не может быть степенью 2.
FlattenHierarchy
позволяет удалить иерархию подсистем из HDL-кода, сгенерированного в проекте.
Настройка FlattenHierarchy | Описание |
---|---|
'inherit' (по умолчанию) | Используйте настройку выравнивания иерархии родительской подсистемы. Если эта подсистема является подсистемой самого высокого уровня, не выравнивайте. |
'on' | Выровнять эту подсистему. |
'off' | Не выравнивайте эту подсистему, даже если родительская подсистема уплощена. |
Чтобы выровнять иерархию, вы также должны иметь MaskParameterAsGeneric
значение глобального свойства установлено в 'off'
. Для получения дополнительной информации смотрите Сгенерировать параметризованный HDL-код из маскированной подсистемы.
Чтобы задать выравнивание иерархии с помощью диалогового окна HDL Block Properties:
На вкладке Apps выберите HDL Coder. Появится вкладка HDL Code. Выберите Subsystem и нажмите HDL Block Properties. Для FlattenHierarchy выберите on, off или inherit.
Щелкните правой кнопкой мыши по Subsystem и выберите HDL Code > HDL Block Properties. Для FlattenHierarchy выберите on, off или inherit.
Чтобы задать выравнивание иерархии из командной строки, используйте hdlset_param
. Например, чтобы включить уплощение иерархии для подсистемы, my_dut
:
hdlset_param('my_dut', 'FlattenHierarchy', 'on')
hdlset_param
.Подсистема не может быть уплощена, если подсистема:
A Synchronous Subsystem или использует блок State Control в Synchronous
режим.
А модель-ссылка реализация.
Триггируемая подсистема, когда Использование триггерного сигнала в качестве синхроимпульса включено.
Маскированная подсистема, содержащая любое из следующих значений:
Автобус.
Перечисленный тип данных.
Блоки интерполяционной таблицы: 1-D Lookup Table, 2-D Lookup Table, Cosine HDL Optimized, Direct LookupTable (n-D), Prelookup, Sine HDL Optimized, n-D Lookup Table.
MATLAB System блок.
Блоки Stateflow: Chart, State Transition Table, Sequence Viewer.
Блоки с реализацией pass-through или no-op. Смотрите Pass through, No HDL и Cascade Implementations.
Примечание
Эта опция удаляет контуры подсистемы перед генерацией кода. Он не обязательно генерирует HDL-код с полностью плоской иерархией.
InputPipeline
позволяет задать реализацию с входной конвейеризацией для выбранных блоков. В значение параметров указывается количество входа этапов трубопровода (глубина трубопровода) в сгенерированном коде.
Следующий код задает глубину входного конвейера из двух этапов для каждого блока Sum в модели:
sblocks = find_system(gcb, 'BlockType', 'Sum'); for ii=1:length(sblocks),hdlset_param(sblocks{ii},'InputPipeline', 2), end;
Примечание
The InputPipeline
установка не имеет никаких эффектов для блоков, не имеющих входа порта.
При генерации кода для регистров конвейера HDL Coder добавляет постфиксную строку к именам входных или выходных регистров конвейера. Строка постфикса по умолчанию _pipe
. Чтобы настроить строку постфикса, используйте опцию Pipeline postfix на панели Global Settings / General в панели HDL Code Generation диалогового окна Параметры конфигурации. Кроме того, вы можете передать необходимый постфикс как вектор символов в makehdl
свойства PipelinePostfix
. Для получения примера смотрите Pipeline postfix.
Для блока MATLAB Function можно использовать параметр InstantiateFunctions для генерации VHDL® entity
или Verilog® module
для каждой функции. HDL Coder генерирует код для каждого entity
или module
в отдельном файле.
Опции InstantiateFunctions для блока MATLAB Function перечислены в следующей таблице.
Настройка InstantiateFunctions | Описание |
---|---|
'off' (по умолчанию) | Сгенерируйте код для функций в строке. |
'on' | Сгенерируйте |
Чтобы задать параметр InstantiateFunctions с помощью диалогового окна HDL Block Properties:
Щелкните правой кнопкой мыши блок MATLAB Function.
Выберите HDL Code > HDL Block Properties.
Для InstantiateFunctions выберите on.
Чтобы задать параметр InstantiateFunctions из командной строки, используйте hdlset_param
. Например, чтобы сгенерировать мгновенный код для функций в блоке MATLAB Function, myMatlabFcn
, в вашей подсистеме DUT, myDUT
, введите:
hdlset_param('my_DUT/my_MATLABFcnBlk', 'InstantiateFunctions', 'on')
Если вы хотите сгенерировать мгновенный код для некоторых функций, но не для других, включите опцию, чтобы сгенерировать мгновенный код для функций и использовать coder.inline
. Посмотрите coder.inline
для получения дополнительной информации.
Программное обеспечение генерирует код в строке, когда:
Вызовы функций находятся в пределах условного кода или for
циклы.
Любая функция вызывается с неконстантной struct
вход.
Функция имеет состояние, такое как постоянная переменная, и вызывается несколько раз.
Существует перечисление где угодно в функции проекта.
Для Cascade
можно использовать параметр InstantiateStages для генерации VHDL- entity
или Verilog module
для каждого этапа расчетов. HDL Coder генерирует код для каждого entity
или module
в отдельном файле.
Настройка InstantiateStages | Описание |
---|---|
'off' (по умолчанию) | Сгенерируйте каскадные стадии в одной VHDL- |
'on' | Сгенерируйте |
LoopOptimization
позволяет вам транслировать или разворачивать циклы в коде, сгенерированном из блока MATLAB Function. Потоковая передача циклов оптимизирует площадь; цикл оптимизирует скорость.
Примечание
Если вы задаете MATLAB Datapath
архитектура блока MATLAB Function, можно только разворачивать циклы. Для потоковой оптимизации циклов можно использовать потоковую оптимизацию, задав StreamingFactor. Смотрите Оптимизации HDL через контур блока MATLAB function с использованием архитектуры MATLAB Datapath.
Настройка LoopOptimization | Описание |
---|---|
'none' (по умолчанию) | Не оптимизируйте циклов. |
'Unrolling' | Раскрутка циклов. |
'Streaming' | Потоковые циклы. |
Чтобы выбрать оптимизацию цикла с помощью диалогового окна HDL Block Properties:
Щелкните правой кнопкой мыши блок MATLAB Function.
Выберите HDL Code > HDL Block Properties.
Для LoopOptimization выберите none
, Unrolling
, или Streaming
.
Чтобы выбрать оптимизацию цикла из командной строки, используйте hdlset_param
. Для примера, чтобы включить цикл потоковую передачу для блока MATLAB Function, my_mlfn
:
hdlset_param('my_mlfn', 'LoopOptimization', 'Streaming')
hdlset_param
.HDL Coder не может передать цикл, если:
Индекс цикла отсчитывается. Индекс цикла должен увеличиться на 1 при каждой итерации.
Существует 2 или более вложенных циклов на том же уровне иерархии в другом цикле.
Любая конкретная постоянная переменная обновляется как внутри, так и вне цикла.
HDL Coder может транслировать цикл, когда постоянная переменная:
Обновлен внутри цикла и считан вне цикла.
Считайте в цикле и обновляйте вне цикла.
Используйте LUTRegisterResetType
параметры блоков для управления синтезом LUT в структуру ROM на FPGA.
Значение LUTRegisterResetType | Описание |
---|---|
default | Выходной регистр LUT имеет логику сброса по умолчанию. Когда вы генерируете HDL, LUT будет синтезирован как регистры. |
none | Выходной регистр LUT не имеет логики сброса. Когда вы генерируете HDL, LUT будет синтезирован как ПЗУ. |
Можно задать LUTRegisterResetType
для следующих блоков:
Gamma Correction
Lookup Table
Блок NCO HDL Optimized игнорирует этот параметр.
С MapPersistentVarsToRAM
параметр реализации, можно использовать основанные на ОЗУ отображения для стойких массивов блока MATLAB Function вместо отображения в регистры.
Настройка MapPersistentVarsToRAM | Поведение отображения |
---|---|
| Постоянные массивы сопоставляются с регистрами в сгенерированном HDL-коде. |
| Переменные стойкого массива сопоставлены с ОЗУ. Ограничения см. в разделе Ограничения отображения ОЗУ. |
Когда вы активируете отображение ОЗУ, постоянный массив или определяемый пользователем System object™ частной собственности преобразуется в блок ОЗУ, когда все следующие условия верны:
Каждый доступ для чтения или записи предназначен только для одного элемента. Для примера доступ к подматрице и копии массивов не разрешены.
Логика расчета адреса не зависит от чтения. Например, расчет адреса чтения или записи с использованием данных, считанных из массива, не разрешено.
Постоянные переменные или пользовательские частная собственность системного объекта инициализируются в 0, если они имеют циклическую зависимость. Например, если у вас есть две стойкие переменные, A и B, у вас есть циклическая зависимость, если A зависит от B, и B зависит от A.
Если доступ находится в пределах условного оператора, условный оператор использует только простые логические выражения (&&
, ||
, ~
) или реляционные операторы. Например, в следующем коде r1
не сопоставляется с ОЗУ:
if (mod(i,2) > 0) a = r1(u); else r1(i) = u; end
Перепишите сложные условия, такие как условия, которые вызывают функции, путем назначения их временным переменным и использования временных переменных в условном операторе. Например, чтобы сопоставить r1
в оперативную память перепишите предыдущий код следующим образом:
temp = mod(i,2); if (temp > 0) a = r1(u); else r1(i) = u; end
Значение частной собственности стойкого массива или пользовательского системного объекта зависит от внешних входов.
Например, в следующем коде bigarray
не сопоставляется с ОЗУ, потому что не зависит от u
:
function z = foo(u) persistent cnt bigarray if isempty(cnt) cnt = fi(0,1,16,10,hdlfimath); bigarray = uint8(zeros(1024,1)); end z = u + cnt; idx = uint8(cnt); temp = bigarray(idx+1); cnt(:) = cnt + fi(1,1,16,0,hdlfimath) + temp; bigarray(idx+1) = idx;
RAMSize
больше или равно RAMMappingThreshold
значение. RAMSize
является ли продукт NumElements * WordLength * Complexity
.
NumElements
- количество элементов в массиве.
WordLength
- количество бит, представляющих тип данных массива.
Complexity
является 2 для массивов с комплексным базовым типом; 1 в противном случае.
Если любое из вышеуказанных условий является ложным, постоянный массив или определяемая пользователем Системный объект частной собственности преобразуется в регистр в HDL-коде.
Значение по умолчанию RAMMappingThreshold
- 256. Для изменения порога используйте hdlset_param
. Например, следующая команда изменяет порог отображения для sfir_fixed
модель до 128 бит:
hdlset_param('sfir_fixed', 'RAMMappingThreshold', 128);
Можно также изменить порог отображения ОЗУ в диалоговом окне Параметры конфигурации. Для получения дополнительной информации смотрите раздел «порог отображения ОЗУ ( биты)» в параметрах отображения ОЗУ».
Для примера, который показывает, как сопоставить переменные стойкого массива с ОЗУ в блоке MATLAB Function, смотрите Сопоставление ОЗУ С Блоком MATLAB function.
Используйте MapToRAM
для сопоставления интерполяционных таблиц (LUT) с ОЗУ.
когда Simulate RAM Delay включено., MapToRAM
свойство отключено для блоков Cosine HDL Optimized и Sine HDL Optimized.
Настройка MapToRAM | Поведение отображения |
---|---|
'inherit' (по умолчанию) | Используйте адаптивную настройку конвейеризации родительской подсистемы. Если эта подсистема является подсистемой самого высокого уровня, используйте настройку адаптивной конвейеризации для модели. |
| Интерполяционные таблицы блоков (LUT) сопоставлены с логическими срезами в FPGA. |
| Интерполяционные таблицы блоков (LUT) сопоставлены с ОЗУ. |
OutputPipeline
позволяет задать реализацию с выходной конвейеризацией для выбранных блоков. В значение параметров указывается количество выхода этапов трубопровода (глубина трубопровода) в сгенерированном коде.
Следующий код задает глубину выходного конвейера из двух этапов для каждого блока Sum в модели:
sblocks = find_system(gcb, 'BlockType', 'Sum'); for ii=1:length(sblocks),hdlset_param(sblocks{ii},'OutputPipeline', 2), end;
Примечание
The OutputPipeline
установка не имеет никаких эффектов для блоков, не имеющих выхода порта.
При генерации кода для регистров конвейера HDL Coder добавляет постфиксную строку к именам входных или выходных регистров конвейера. Строка постфикса по умолчанию _pipe
. Чтобы настроить строку постфикса, используйте опцию Pipeline postfix в диалоговом окне Параметров конфигурации, на вкладке HDL Code Generation > Global Settings > General. Также можно использовать PipelinePostfix
свойство с makehdl
. Для получения примера смотрите Pipeline postfix.
Смотрите также Distributed Pipeline Insertion для блоков MATLAB function.
RAMDirective
позволяет вам указать, хотите ли вы сопоставить блоки оперативной памяти в модели Simulink с распределенными ОЗУ, блоками оперативной памяти или памятью UltraRAM. Когда вы выбираете значение для этой настройки, HDL Coder генерирует ramstyle
атрибут в HDL-коде. Этот атрибут задает тип модуля оперативной памяти, который вы хотите использовать инструментом синтеза при выводе блоков оперативной памяти в вашем проекте.
RAMDirective Значение | Описание |
---|---|
none (по умолчанию) | Не генерируйте |
distributed | Сгенерируйте атрибут HDL для отображения блоков оперативной памяти в вашей модели с распределенными ОЗУ. Распределенные ОЗУ создаются с помощью LUT. Эти ОЗУ быстрее, но занимают большее количество срезов на FPGA. Этот код VHDL показывает attribute ram_style: string; attribute ram_style of ram : signal is "distributed"; Этот код Verilog показывает (* ram_style = "distributed" *) |
block | Сгенерируйте атрибут HDL для отображения блоков ОЗУ в вашей модели, чтобы заблокировать ОЗУ. Блок RAM является выделенным модулем памяти на устройстве FPGA. Количество доступных блочных ОЗУ зависит от устройства FPGA, на которое вы развертываете HDL-код. Размеры блока ОЗУ можно Чтобы сопоставить ваши блоки оперативной памяти с блокировкой оперативной памяти:
Этот код VHDL показывает attribute ram_style: string; attribute ram_style of ram : signal is "block"; Этот код Verilog показывает (* ram_style = "block" *) |
ultra | Сгенерируйте атрибут HDL для отображения блоков оперативной памяти в вашей модели в память UltraRAM. UltraRAM является выделенным блоком памяти на целевом FPGA. Количество доступных модулей памяти UltraRAM зависит от устройства FPGA, на котором вы развертываете HDL-код. Модули UltraRAM больше, чем блоковые RAM, и могут быть такими же большими, как и Чтобы сопоставить ваши блоки оперативной памяти с UltraRAM:
Этот код VHDL показывает attribute ram_style: string; attribute ram_style of ram : signal is "ultra"; Этот код Verilog показывает (* ram_style = "ultra" *) |
В HDL RAMs библиотеке, кроме Dual Rate Dual Port RAM, можно задать RAMDirective
свойство для всех других блоков ОЗУ.
Как задать RAMDirective
для блока оперативной памяти из диалогового окна HDL Block Properties:
Щелкните правой кнопкой мыши блок оперативной памяти.
Выберите HDL Code > HDL Block Properties.
Для RAMDirective выберите none, distributed, block или ultra.
Примечание
Для блока Dual Port RAM вы не можете задать ultra
как RAMDirective
поскольку блок не имеет фиксированного поведения чтения.
Как задать RAMDirective
для блока из командной строки используйте hdlset_param
. Для примера задать RAMDirective
на ultra
для блока Single Port RAM внутри подсистемы, my_dut
:
hdlset_param('my_dut/Single Port RAM', 'RAMDirective', 'ultra');
hdlset_param
.Используйте ResetType
параметры блоков для подавления генерации логики сброса.
Значение ResetType | Описание |
---|---|
default | Сгенерируйте логику сброса. |
none | Не генерируйте логику сброса. Сброс не применяется к сгенерированным регистрам. Поэтому несоответствия между Simulink и сгенерированным кодом происходят для некоторого количества выборок во время начальной фазы, когда регистры не полностью загружены. Чтобы избежать ошибок испытательного стенда на начальной фазе, определите количество выборок, необходимых для полной загрузки регистров. Затем установите Ignore output data checking (number of samples) опцию соответственно. См. также Ignore output data checking (number of samples) в Испытательный стенд Simulus и Output Parameters. |
Можно задать ResetType
для следующих блоков:
Chart
Convolutional Deinterleaver
Convolutional Interleaver
Delay
Delay (DSP System Toolbox™)
General Multiplexed Deinterleaver
General Multiplexed Interleaver
MATLAB Function
MATLAB System
Memory
Tapped Delay
Truth Table
Unit Delay Enabled
Unit Delay
Когда вы задаете ResetType none
для блока MATLAB Function HDL Coder не генерирует логику сброса для постоянных переменных в MATLAB® код.
Однако, если вы задаете другие оптимизации для блока, кодер может вставить регистры, которые используют логику сброса. Кодер не подавляет генерацию логики сброса для этих регистров. Поэтому, если вы задаете ResetType none
наряду с оптимизацией других блоков, ваш сгенерированный код может иметь порт сброса на верхнем уровне.
Чтобы подавить генерацию логики сброса для блока, использующего пользовательский интерфейс:
Щелкните правой кнопкой мыши блок и выберите HDL Code > HDL Block Properties.
Для ResetType выберите none
.
Чтобы подавить генерацию логики сброса, в командной строке введите:
hdlset_param(path_to_block,'ResetType','none')
Для примера, чтобы подавить генерацию логики для блока Unit Delay, UnitDelay1
, в пределах подсистемы, mySubsys
, в командной строке введите:
hdlset_param('mySubsys/UnitDelay1','ResetType','none');
Чтобы задать синхронный или асинхронный сброс, используйте ResetType
параметр уровня модели. Для получения дополнительной информации смотрите Сброс типа в Сбросить Настройки и Параметры.
Используйте этот параметр в блоках Min/Max, чтобы задать разделы для последовательной каскадной архитектуры. В настройке по умолчанию используется минимальное количество разделов.
Чтобы сгенерировать это Архитектура... | Установите значение SerialPartition на... |
---|---|
Каскадно-последовательный с явно заданным разбиением | [p1 p2 p3...pN] : вектор N целые числа, где N количество последовательных разделов. Каждый элемент вектора задает длину соответствующего раздела. Сумма векторных элементов должна быть равна длине вектора- входным данным. Значения векторных элементов должны быть в порядке убывания, за исключением того, что последние два элемента могут быть равны. Для примера, для входных параметров 8 элементов, разделов [5 3] или [4 2 2] легальны, но разделы [2 2 2 2] или [3 2 3] вызвать ошибку во время генерации кода. |
Каскадно-последовательный с автоматически оптимизированным разбиением | 0 |
Это свойство также используется для архитектур последовательных фильтров. Для того, как сконфигурировать фильтрующие блоки, смотрите SerialPartition.
Использование SharingFactor
чтобы задать количество функционально эквивалентных ресурсов для сопоставления с одним общим ресурсом. Значение по умолчанию 0. См. Раздел «Совместное использование ресурсов».
Используйте SoftReset
параметры блоков, чтобы указать, генерировать ли аппаратную логику синхронного сброса или локальную логику сброса, которая соответствует поведению симуляции Simulink. Это свойство доступно для блока Unit Delay Resettable или Unit Delay Enabled Resettable блока.
Значение SoftReset | Описание |
---|---|
off (по умолчанию) | Сгенерируйте локальную логику сброса, которая соответствует поведению симуляции Simulink. |
on | Сгенерируйте логику синхронного сброса для блока. Эта опция генерирует код, который более эффективен для синтеза, но не соответствует поведению симуляции Simulink. |
Когда SoftReset
установлено на 'off'
следующий код генерируется для блока Unit Delay Resettable:
always @(posedge clk or posedge reset) begin : Unit_Delay_Resettable_process if (reset == 1'b1) begin Unit_Delay_Resettable_zero_delay <= 1'b1; Unit_Delay_Resettable_switch_delay <= 2'b00; end else begin if (enb) begin Unit_Delay_Resettable_zero_delay <= 1'b0; if (UDR_reset == 1'b1) begin Unit_Delay_Resettable_switch_delay <= 2'b00; end else begin Unit_Delay_Resettable_switch_delay <= In1; end end end end assign Unit_Delay_Resettable_1 = (UDR_reset || Unit_Delay_Resettable_zero_delay ? 1'b1 : 1'b0); assign out0 = (Unit_Delay_Resettable_1 == 1'b1 ? 2'b00 : Unit_Delay_Resettable_switch_delay);
Когда SoftReset
установлено на 'on'
следующий код генерируется для блока Unit Delay Resettable:
always @(posedge clk or posedge reset) begin : Unit_Delay_Resettable_process if (reset == 1'b1) begin Unit_Delay_Resettable_reg <= 2'b00; end else begin if (enb) begin if (UDR_reset != 1'b0) begin Unit_Delay_Resettable_reg <= 2'b00; end else begin Unit_Delay_Resettable_reg <= In1; end end end end assign out0 = Unit_Delay_Resettable_reg;
Количество параллельных путей данных, или векторов, для преобразования в последовательные, скалярные пути данных путем временного мультиплексирования последовательных путей данных и совместного использования аппаратных ресурсов. Значение по умолчанию 0, которое реализует полностью параллельные пути данных. См. также Потоковая передача.
Можно использовать этот режим с Product блоками в Divide и Reciprocal режимах. Это свойство становится доступным, когда вы устанавливаете архитектуру для блоков равной ShiftAdd
. Эта архитектура использует невосстановляющий алгоритм деления, который выполняет несколько операций сдвига и добавления, чтобы вычислить частное. The ShiftAdd
архитектура обеспечивает улучшенную точность по сравнению с методом приближения Ньютона-Рафсона.
Когда вы используете ShiftAdd
архитектура, можно использовать UsePipelines
параметр реализации, чтобы определить, использовать ли конвейерную или непроводящую реализацию невосстановляющего деления.
Настройка UsePipelines | Поведение отображения |
---|---|
| Используйте конвейерную реализацию невосстановляющего сдвига и добавьте операцию для блоков Divide и Reciprocal. Эта настройка добавляет больше задержек в ваш проект, но достигает более высокой максимальной тактовой частоты на целевом устройстве FPGA. Количество вставленных трубопроводов совпадает с количеством итераций, которое требуется алгоритму для вычисления факторного или обратного. |
| Используйте непроводящую реализацию невосстановляющего сдвига и добавьте операцию для блоков Divide и Reciprocal. Этот параметр не добавляет задержки в проект. Поскольку деление и обратное являются ресурсоемкими операциями, для достижения более высоких тактовых частот на целевом FPGA установите UsePipelines на |
Как задать UsePipelines
для подсистемы из диалогового окна HDL Block Properties:
Щелкните подсистему правой кнопкой мыши.
Выберите HDL Code > HDL Block Properties.
Для UsePipelines выберите on или off.
Как задать UsePipelines
для блока из командной строки используйте hdlset_param
. Например, чтобы выключить UsePipelines
для блока Divide внутри подсистемы, my_dut
:
hdlset_param('my_dut/divide', 'UsePipelines', 'off');
hdlset_param
.The UseRAM
параметр реализации включает использование основанного на ОЗУ отображения для блока вместо отображения в сдвиг регистр.
Настройка UseRAM | Поведение отображения |
---|---|
| Задержка преобразуется в сдвиг регистр в сгенерированном HDL-коде, кроме одного случая. Для получения дополнительной информации смотрите Эффекты потоковой и распределенной конвейеризации. |
| Задержка преобразуется в двухпортовый блок ОЗУ, когда верны следующие условия:
Если какое-либо условие является ложным, задержка преобразуется в сдвиг регистр в HDL-коде, если только он не сливается с другими задержками, чтобы сопоставить его с одной ОЗУ. Для получения дополнительной информации смотрите Отображение нескольких задержек с ОЗУ. |
Этот параметр реализации доступен для блока Delay в дискретной библиотеке Simulink и для блока Delay (DSP System Toolbox) в библиотеке DSP System Toolbox Signal Operations.
HDL Coder также может объединить несколько задержек равной длины в одну задержку и затем сопоставить объединенную задержку с одной ОЗУ. Эта оптимизация обеспечивает следующие преимущества:
Увеличение заполнения одной ОЗУ
Совместное использование логики генерации адресов, которая минимизирует дублирование идентичного HDL-кода
Отображение задержек с ОЗУ, когда отдельные задержки не удовлетворяют порогу
Следующие правила определяют, можно ли объединить несколько задержек в одну задержку:
Задержки должны:
Находиться на том же уровне иерархии подсистем.
Используйте ту же скомпилированный шаг расчета.
Иметь UseRAM
установлено на on
, или быть сгенерированным потоковой передачей или совместным использованием ресурсов.
Иметь то же ResetType
setting, который нельзя none
.
Общий размер слова объединенной задержки не может превышать 128 бит.
The RAMSize
объединенной задержки больше или равно RAMMappingThreshold
значение. RAMSize
является ли продукт DelayLength * WordLength * VectorLength * ComplexLength
.
DelayLength
- общее количество задержек.
WordLength
- количество бит, представляющих тип данных объединенной задержки.
VectorLength
количество элементов в вектор задержке. VectorLength
равен 1 для скалярной задержки.
ComplexLength
2 для сложных задержек; 1 в противном случае.
RAMMappingThreshold
для следующей модели это 100 бит.
Блоки Delay и Delay1 объединяются и сопоставляются с двухпортовой ОЗУ в сгенерированном HDL-коде, удовлетворяя следующим условиям:
Оба блока задержки:
Находятся на том же уровне иерархии.
Используйте ту же скомпилированный шаг расчета.
Иметь UseRAM установлено на on
в диалоговом окне свойств блоков.
Иметь ту же ResetType настройку default
.
Общий размер слова объединенной задержки составляет 28 биты, что ниже 128-битного предела.
The RAMSize
Объединенная задержка составляет 112 биты (4 задержки * 28-битный размер слова), что больше порога отображения 100 бит.
Когда вы генерируете HDL-код для этой модели, HDL Coder генерирует дополнительные файлы, чтобы задать отображение оперативной памяти. Кодер хранит эти файлы в том же исходном месте, что и другие сгенерированные HDL-файлы, например, hdlsrc
папка.
Когда UseRAM
является off
для блока Delay HDL Coder по умолчанию преобразует задержку в сдвиг регистр. Однако кодер меняет UseRAM
установка значения on
и пытается сопоставить задержку с ОЗУ при следующих условиях:
Потоковая передача включена для подсистемы с блоком Delay.
Распределённая конвейеризация отключена для подсистемы с блоком Delay.
Предположим, что распределённая конвейеризация включена для подсистемы с блоком Delay.
Когда UseRAM
является off
блок Delay участвует в синхронизации.
Когда UseRAM
является on
блок Delay не участвует в синхронизации. HDL Coder не разбивает задержку, отмеченную для отображения оперативной памяти.
Рассмотрим подсистему с двумя блоками Delay, тремя блоками Constant и тремя блоками Product:
Когда UseRAM
является on
для блока Delay справа эта задержка не участвует в синхронизации.
Следующие сводные данные описывают, пытается ли HDL Coder сопоставить задержку с ОЗУ вместо сдвига регистра.
UseRAM Настройка блока задержки | Оптимизация, активированная для подсистемы с блоком задержки | ||
---|---|---|---|
Только распределенный конвейеризация | Потоковая передача только | Как распределённая конвейеризация, так и потоковая передача | |
На | Да | Да | Да |
Прочь | Нет | Да, потому что сопоставление с ОЗУ вместо сдвига регистра может обеспечить экономичную по площади проект. | Нет |
Предупреждение
VariablesToPipeline
не рекомендуется. Использовать coder.hdl.pipeline
вместо этого.
Параметр VariablesToPipeline позволяет вставлять регистр трубопровода на выходе одних или нескольких переменного MATLAB. Задайте список переменных в качестве вектора символов с пространствами, разделяющими переменные.
См. также Выражения Pipeline MATLAB.