Эти инструкции иллюстрируют рекомендуемые настройки при использовании стойких переменных в блоках 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
Идентификатор руководства
2.8.2
Серьезность
Обязательный
Описание
Когда ваша модель Simulink ® содержит блоки MATLAB Function внутри цикла обратной связи и использует стойкие переменные, компиляция или симуляция модели могут сгенерировать алгебраические ошибки цикла. Чтобы симулировать модель и сгенерировать HDL-код, используйте nondirect feedthrough.
В некоторых случаях постоянная задержка в блоке MATLAB Function внутри цикла обратной связи вызывает алгебраическую ошибку цикла. Когда вы используете прямое сквозное соединение, выход блока напрямую зависит от входа. Когда Allow direct feedthrough очищается, выход блока зависит от внутреннего состояния и свойств и не зависит от входа. Недирект-семантика препятствует ошибкам алгебраических циклов, делая выходы зависящими только от состояния.
Для получения примера откройте модель 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)
Чтобы избежать этой ошибки, используйте nondirect feedthrough. Чтобы задать nondirect feedthrough в командной строке, создайте MATLABFunctionConfiguration
объект при помощи get_param
и измените значение свойства AllowDirectFeedthrough
:
MLFBConfig = get_param(blkname, 'MATLABFunctionConfiguration');
MLFBConfig.AllowDirectFeedthrough = 0;
См. также MATLABFunctionConfiguration
.
Чтобы задать ненаправленное сквозное соединение из пользовательского интерфейса:
Откройте блок MATLAB Function MATLAB Function1
.
Открывает диалоговое окно Ports and Data Manager. В редакторе MATLAB ® нажмите Edit Data.
В диалоговом окне Ports and Data Manager снимите флажок Разрешить прямую передачу.
Смотрите также Предотвращение Алгебраических Ошибок Цикла в Функциях MATLAB и Блоках Stateflow.
Модель теперь симулирует без алгебраических ошибок. Теперь можно сгенерировать 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. ### Running HDL checks on the model 'hdlcoder_MLFB_avoid_algebraic_loops'. ### Begin compilation of the model 'hdlcoder_MLFB_avoid_algebraic_loops'... ### Applying HDL optimizations on the model 'hdlcoder_MLFB_avoid_algebraic_loops'... ### Begin model generation. ### Model generation complete. ### 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. ### Code Generation for 'hdlcoder_MLFB_avoid_algebraic_loops' completed. ### Creating HDL Code Generation Check Report file:///tmp/BR2021ad_1584584_202060/publish_examples0/tp0be7fb9a/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 and 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, можно запустить проверку параметров блока Check for MATLAB Function.