Используя Персистентные Переменные и Объекты fi В блоках MATLAB function для генерации HDL-кода

Эти инструкции иллюстрируют рекомендуемые настройки при использовании персистентных переменных в блоках MATLAB Function в вашей модели. Блок MATLAB Function доступен в библиотеке блоков User-Defined Functions. Персистентная переменная в блоке MATLAB Function действует похожая на элемент задержки в вашей модели Simulink®.

Каждая инструкция имеет уровень серьезности, который указывает на уровень требований податливости. Чтобы узнать больше, смотрите Уровни серьезности Руководств по моделированию HDL.

Обновите персистентные переменные в конце функции MATLAB

ID инструкции

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 

Избегайте Алгебраических Ошибок Цикла от Персистентных Переменных в блоках MATLAB function

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.

Задавать непрямое сквозное соединение от пользовательского интерфейса:

  1. Откройте блок MATLAB function MATLAB Function1.

  2. Открывает диалоговое окно Ports и Data Manager. На Редакторе MATLAB® нажмите Edit Data.

  3. На диалоговом окне Ports и Data Manager, ясном, Позволяют прямой проходной флажок.

См. также Предотвращают Алгебраические Ошибки Цикла в Блоках Stateflow и функции MATLAB.

Модель теперь симулирует без алгебраических ошибок. Можно теперь сгенерировать 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.

Используйте Установку hdlfimath и Задайте Объекты fi в блоке MATLAB function

ID инструкции

2.8.3

Серьезность

Строго рекомендуемый

Описание

fimath свойства задают правила для выполнения арифметических операций на объектах fi. Задавать fimath свойства, которые управляют арифметическими операциями, используют a 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.

Смотрите также

Блоки

Функции

Похожие темы