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

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

Каждое руководство имеет уровень серьезности, который указывает на уровень податливостей. Для получения дополнительной информации см. HDL-руководства по моделированию уровней серьезности.

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

Идентификатор руководства

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

Идентификатор руководства

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.

Чтобы задать ненаправленное сквозное соединение из пользовательского интерфейса:

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

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

  3. В диалоговом окне 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.

Используйте hdlfimath Setting и Задайте объекты FI внутри Блок MATLAB Function

Идентификатор руководства

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.

См. также

Блоки

Функции

Похожие темы