exponenta event banner

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

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

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

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

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

2.8.1

Серьезность

Очень рекомендуем

Описание

Чтобы убедиться, что постоянные переменные в блоке функции MATLAB соответствуют регистру на целевом устройстве FPGA, обновите постоянную переменную в конце кода MATLAB ® в блоке функции MATLAB. Не обновляйте постоянную переменную до того, как ее значение будет считано или использовано функцией.

Например, этот код 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

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

2.8.2

Серьезность

Обязательный

Описание

Если модель Simulink ® содержит функциональные блоки MATLAB внутри цикла обратной связи и использует постоянные переменные, компиляция или моделирование модели может привести к ошибкам алгебраического цикла. Для моделирования модели и создания кода HDL используется непрямой канал.

В некоторых случаях постоянная задержка в блоке функции MATLAB внутри цикла обратной связи вызывает ошибку алгебраического цикла. При использовании прямого канала выходной сигнал блока напрямую зависит от входного сигнала. Если флажок «Разрешить прямой проход» снят, вывод блока зависит от внутреннего состояния и свойств и не зависит от ввода. Непрямая семантика сквозной передачи предотвращает ошибки алгебраических циклов, делая вывод зависимым только от состояния.

Например, откройте модель. 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 hdlcoder_MLFB_avoid_algebraic_loops/Subsystem_AlgLoop_Issue/MATLAB Function использует постоянную переменную внутри блока функции MATLAB.

open_system(blkname)

Чтобы избежать этой ошибки, используйте непрямой канал. Чтобы указать непрямой проход в командной строке, создайте MATLABFunctionConfiguration объект с помощью get_param функция, а затем изменить значение свойства AllowDirectFeedthrough:

MLFBConfig = get_param(blkname, 'MATLABFunctionConfiguration');
MLFBConfig.AllowDirectFeedthrough = 0;

См. также MATLABFunctionConfiguration.

Чтобы указать непрямой проход из пользовательского интерфейса, выполните следующие действия.

  1. Откройте функциональный блок MATLAB MATLAB Function1.

  2. Открытие диалогового окна «Порты и диспетчер данных». В редакторе MATLAB ® выберите «Редактировать данные».

  3. В диалоговом окне «Ports and Data Manager» снимите флажок «Allow direct feedthrough».

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

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

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

2.8.3

Серьезность

Очень рекомендуем

Описание

fimath свойства определяют правила выполнения арифметических операций с объектами fi. Определить fimath свойства, которые управляют арифметическими операциями, используйте fimath объект. Просмотр значения по умолчанию fimath параметры свойств, выполните следующую команду:

F = fimath
F = 


        RoundingMethod: Nearest
        OverflowAction: Saturate
           ProductMode: FullPrecision
               SumMode: FullPrecision

Дефолт fimath параметры уменьшают ошибки округления и переполнения. Однако генерация кода HDL для функционального блока MATLAB, который использует эти настройки, может привести к дополнительному использованию ресурсов на целевом устройстве FPGA. Чтобы избежать дополнительной логики, используйте hdlfimath. hdlfimath функция - это утилита, определяющая fimath свойства, оптимизированные для генерации кода HDL. Просмотр значения по умолчанию hdlfimath settings, выполните следующую команду:

H = hdlfimath
H = 


        RoundingMethod: Floor
        OverflowAction: Wrap
           ProductMode: FullPrecision
               SumMode: FullPrecision

Генерация кода HDL для функционального блока MATLAB, который использует эти настройки, позволяет избежать использования дополнительных ресурсов и сохранить область на целевом устройстве FPGA.

Чтобы задать эти параметры настройки для функционального блока MATLAB:

  • Дважды щелкните блок MATLAB Function и выберите Edit Data в редакторе MATLAB.

  • В диалоговом окне «Ports and Data Manager» выполните следующие действия:

    • Рассматривайте эти унаследованные типы сигналов Simulink как объекты fi, выберите Fixed-point & Integer.

      Если используется значение по умолчанию Fixed-point установка, типы данных с фиксированной точкой, заданные с помощью объектов fi и встроенных целочисленных типов, таких как int8 и int16 к ним относятся по-разному. При использовании встроенных целочисленных типов тип выходных данных для вычислений целочисленных типов становится таким же, как и тип входных данных. Битовая ширина не расширяется для выполнения числового вычисления.

    • MATLAB Fimath, выберите «Указать другое» и введите 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, можно выполнить проверку настроек функционального блока MATLAB.

См. также

Блоки

Функции

Связанные темы