Эти инструкции иллюстрируют рекомендуемые настройки при использовании персистентных переменных в блоках MATLAB Function в вашей модели. Блок MATLAB Function доступен в библиотеке блоков User-Defined Functions. Персистентная переменная в блоке MATLAB Function действует похожая на элемент задержки в вашей модели Simulink®.
Каждая инструкция имеет уровень серьезности, который указывает на уровень требований податливости. Чтобы узнать больше, смотрите Уровни серьезности Руководств по моделированию HDL.
2.8.1
Строго рекомендуемый
Чтобы убедиться что персистентные переменные в блок-диаграмме MATLAB Function к регистру на целевом устройстве FPGA, обновите персистентную переменную в конце кода MATLAB® в блоке MATLAB Function. Не обновляйте персистентную переменную, прежде чем ее значение будет читаться или использоваться функцией.
Например, этот код MATLAB не рекомендуется, потому что функция обновляет персистентную переменную FF0
обновляется, прежде чем значение читается при выходе.
function FF_out0 = fcn(FF_in) %#codegen persistent FF0 if isempty(FF0) FF0 = zeros(1, 'like', FF_in); end % Incorrect order of FF update FF0 = FF_in % Output FF0. FF_out0 is NOT delayed FF_out0 = FF0;
Этот код MATLAB рекомендуется, потому что значение записано в FF0
в конце кода.
function FF_out0 = fcn(FF_in) %#codegen persistent FF0 if isempty(FF0) FF0 = zeros(1, 'like', FF_in); end % Output FF0 FF_out0 = FF0; % Write FF update at the end of the code FF0 = FF_in
ID инструкции
2.8.2
Серьезность
Обязательный
Описание
Когда ваша модель Simulink® содержит блоки MATLAB function в обратной связи и использует персистентные переменные, компилирование или симулирование силы модели генерируют алгебраические ошибки цикла. Чтобы симулировать модель и сгенерировать HDL-код, используйте непрямое сквозное соединение.
В определенных случаях персистентная задержка блока MATLAB function в обратной связи вызывает алгебраическую ошибку цикла. Когда вы используете прямое сквозное соединение, выход блока непосредственно зависит от входа. То, когда Позволяют прямое сквозное соединение, очищено, выход блока зависит от внутреннего состояния и свойств и не зависит от входа. Непрямая проходная семантика предотвращает алгебраические ошибки циклов, заставляя выходные параметры зависеть только от состояния.
Для примера откройте модель hdlcoder_MLFB_avoid_algebraic_loops
.
modelname = 'hdlcoder_MLFB_avoid_algebraic_loops'; blkname = 'hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function1'; open_system(modelname)
Когда вы симулируете модель, алгебраическое сообщение об ошибке цикла отображено. Блок MATLAB function hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function
использует персистентную переменную в блоке MATLAB function.
open_system(blkname)
Чтобы избежать этой ошибки, используйте непрямое сквозное соединение. Чтобы задать непрямое сквозное соединение в командной строке, создайте MATLABFunctionConfiguration
объект при помощи get_param
функция, и затем изменяет значение свойства AllowDirectFeedthrough
:
MLFBConfig = get_param(blkname, 'MATLABFunctionConfiguration');
MLFBConfig.AllowDirectFeedthrough = 0;
См. также MATLABFunctionConfiguration
.
Задавать непрямое сквозное соединение от пользовательского интерфейса:
Откройте блок MATLAB function MATLAB Function1
.
Открывает диалоговое окно Ports и Data Manager. На Редакторе MATLAB® нажмите Edit Data.
На диалоговом окне Ports и Data Manager, ясном, Позволяют прямой проходной флажок.
См. также Предотвращают Алгебраические Ошибки Цикла в функции MATLAB и Блоках Stateflow (Simulink).
Модель теперь симулирует без алгебраических ошибок. Можно теперь сгенерировать HDL-код для блока Subsystem Subsystem_AlgLoop_Issue
.
open_system(modelname) set_param('hdlcoder_MLFB_avoid_algebraic_loops', 'SimulationCommand', 'Update') makehdl('hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue')
### Generating HDL for 'hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue'. ### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_MLFB_avoid_algebraic_loops', { 'HDL Code Generation' } )">hdlcoder_MLFB_avoid_algebraic_loops</a> for HDL code generation parameters. ### Starting HDL check. ### Begin VHDL Code Generation for 'hdlcoder_MLFB_avoid_algebraic_loops'. ### Working on hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function1 as hdlsrc/hdlcoder_MLFB_avoid_algebraic_loops/MATLAB_Function1.vhd. ### Working on hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue as hdlsrc/hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue.vhd. ### Creating HDL Code Generation Check Report file:///tmp/BR2020ad_1302590_239645/publish_examples4/tpda08cca6/ex34676816/hdlsrc/hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue_report.html ### HDL check for 'hdlcoder_MLFB_avoid_algebraic_loops' complete with 0 errors, 0 warnings, and 0 messages. ### HDL code generation complete.
2.8.3
Строго рекомендуемый
fimath
свойства задают правила для выполнения арифметических операций на объектах fi. Задавать fimath
свойства, которые управляют арифметическими операциями, используют fimath
объект. Видеть fimath
по умолчанию настройки свойства, запуск эта команда:
F = fimath
F = RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
fimath
по умолчанию настройки уменьшают погрешности округления и переполнение. Однако генерация HDL-кода для блока MATLAB Function, который использует эти настройки, может подвергнуться дополнительному использованию ресурсов на целевом устройстве FPGA. Чтобы избежать дополнительной логики, используйте
hdlfimath
. hdlfimath
функция является утилитой, которая задает fimath
свойства оптимизированы для генерации HDL-кода. Видеть hdlfimath
по умолчанию настройки, запустите эту команду:
H = hdlfimath
H = RoundingMethod: Floor OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision
Генерация HDL-кода для блока MATLAB Function, который использует эти настройки, избегает дополнительного использования ресурсов и сохраняет область на целевом устройстве FPGA.
Задавать эти настройки для блока MATLAB Function:
Дважды щелкните по блоку MATLAB Function и выберите Edit Data на редакторе MATLAB.
В диалоговом окне Ports и Data Manager, для:
Treat these inherited Simulink signal types as fi objects, выберите Fixed-point & Integer
.
Если вы используете Fixed-point
по умолчанию установка, типы данных с фиксированной точкой, заданные при помощи fi, возражает и встроенные целочисленные типы, такие как
int8
и int16
обработаны по-другому. Когда вы используете встроенные целочисленные типы, тип выходных данных для вычислений целочисленного типа становится тем же самым как типом входных данных. Битная ширина не расширена, чтобы выполнить числовое вычисление.
MATLAB Function fimath, выберите Specify Other и затем введите hdlfimath
.
Чтобы выполнить округление операций, которые отличаются от значения по умолчанию hdlfimath настройки, задайте эти настройки явным образом при помощи объекта fi, как проиллюстрировано ниже.
A = fi(4.9, 1, 8)
A = 4.8750 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 8 FractionLength: 4
B = fi(2.3, 1, 10)
B = 2.2969 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 10 FractionLength: 7
C = fi(A+B, 'RoundingMethod', 'Nearest', 'OverflowAction', 'Saturate')
C = 7.1719 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 12 FractionLength: 7 RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
Чтобы убедиться, что fimath настройки заданы согласно hdfimath для блока MATLAB Function, можно осуществить Проверку проверки на настройки блока MATLAB function.