Настройте параметр усиления в процессе моделирования

Шаг 1. Создайте простую модель усиления

Чтобы выполнить шаги в качестве примера самостоятельно, сначала создайте модель в качестве примера.

Модель в качестве примера имеет один блок усиления параметром усиления, который настраивается в процессе моделирования.

  1. Откройте Simulink® Block Library и нажмите Commonly Used Blocks.

  2. Добавьте блок Inport.

  3. Добавьте блок Gain. Дважды кликните, чтобы открыть маску блока и изменить значение в параметре Gain к gain.

  4. Дважды щелкните по блоку Gain, чтобы открыть маску блока. Во вкладке Signal Attributes и наборе Output data type к uint8.

    Примечание

    Если вы оставляете Output data type как Inherit: Inherit via internal rule, Simulink Coder™ выбирает тип данных на основе значения по умолчанию Gain параметр, который не может вместить значение при настройке параметра после генерации DPI. Задайте определенный тип для выходного сигнала блока, чтобы избежать неправильной установки типа Simulink Coder.

  5. Добавьте блок Outport.

  6. Соедините все блоки как показано в предыдущей схеме.

Шаг 2. Создайте объект данных для параметра усиления

  1. Создайте объект данных для параметра усиления:

    В командной строке MATLAB® введите:

     gain = Simulink.Parameter
  2. Затем тип:

    open('gain')

    Эта команда открывает диалоговое окно свойства для объекта параметра.

  3. Введите или выберите следующие значения:

    • Value: 2

    • Data type: дважды

    • Storage class: Model default

  4. Нажмите OK.

Для получения дополнительной информации об использовании объектов параметра для генерации кода смотрите Настройку генерации кода C для Элементов Интерфейса модели (Simulink Coder).

Примечание

Установка Storage class к Auto оптимизирует параметр во время генерации кода. Рекомендуемые значения, когда генерирующие настраиваемые параметры DPI:

  • Model default

  • SimulinkGlobal

  • ExportedGlobal

Используйте Model default когда ваш параметр будет специфичен для экземпляра, и выберите между SimulinkGlobal и ExportedGlobal сгенерировать глобальную переменную.

Шаг 3. Сгенерируйте компонент SystemVerilog DPI

  1. На Simulink Apps вкладка нажимают HDL Verifier. Затем на вкладке HDL Verifier нажмите C Code Settings. Диалоговое окно Configuration Parameters открывается на Code Generation.

  2. В System target file нажмите Browse и выберите systemverilog_dpi_grt.tlc.

    • Если у вас есть лицензия на Embedded Coder®, можно выбрать целевой systemverilog_dpi_ert.tlc. Эта цель позволяет вам получать доступ к своим опциям генерации дополнительного кода (на панели Генерации кода в Параметрах конфигурации Модели).

  3. В Toolchain, под Build process, выбирают набор инструментальных средств, который вы хотите использовать из списка. Смотрите Генерируют Кросс-платформенные Компоненты DPI для руководства при выборе набора инструментальных средств.

    Можно опционально выбрать флаги для компиляции. Под Build Configuration выберите Specify из выпадающего списка. Нажмите Show Settings, чтобы отобразить текущие флаги.

  4. В группе Генерации кода нажмите SystemVerilog DPI.

  5. Оставьте и Generate test bench и Customize generated SystemVerilog code очищенными (потому что этот пример изменяет сгенерированный код SystemVerilog, любой испытательный стенд, сгенерированный одновременно, не имеет правильных результатов).

  6. Нажмите OK, чтобы принять эти настройки и закрыть диалоговое окно Configuration Parameters.

  7. В модели в качестве примера щелкните правой кнопкой по усилению и блокам задержки и выберите Create Subsystem from Selection. В данном примере переименуйте подсистему dut.

  8. В Панели инструментов Simulink, на вкладке HDL Verifier, нажимают Generate DPI Component.

  9. В коде Сборки для диалогового окна подсистемы нажмите Build.

    Компонент SystemVerilog сгенерирован как dut_build/dut_dpi.sv в вашей текущей рабочей папке.

Шаг 4. Добавьте настраивающий код параметра в файл SystemVerilog

  1. Откройте файл dut_build/dut_dpi.sv и исследуйте сгенерированный код.

  2. В этом примере, после того, как вы вызываете reset функция, вызовите DPI_dut_setparam_gain функция с новым значением параметров. Например, здесь усиление изменяется на 6:

    DPI_dut_setparam_gain(objhandle, 6);
    
  3. Если асинхронный сигнал сброса высок (идет от 0 до 1), вызовите reset функционируйте снова.

    if(reset == 1'b1) begin
        DPI_dut_reset(objhandle, dut_U_In1, dut_Y_Out1);
        DPI_dut_setparam_gain(objhandle, 6);
    end
    
  4. Код SystemVerilog теперь выглядит так:

    module dut_dpi(
        input clk,
        input clk_enable,
        input reset,
        input real dut_U_In1,
        output real dut_Y_Out1
    );
    
        chandle objhandle=null;
        // Declare imported C functions
        import "DPI" function chandle DPI_dut_initialize(chandle existhandle);
        import "DPI" function void DPI_dut_reset(input chandle objhandle, input real dut_U_In1, inout real dut_Y_Out1);
        import "DPI" function void DPI_dut_output(input chandle objhandle, input real dut_U_In1, inout real dut_Y_Out1);
        import "DPI" function void DPI_dut_update(input chandle objhandle, input real dut_U_In1);
        import "DPI" function void DPI_dut_terminate(input chandle objhandle);
        import "DPI" function void DPI_dut_setparam_gain(input chandle objhandle, input real dut_P_gain);
    
        initial begin
            objhandle = DPI_dut_initialize(objhandle);
            DPI_dut_setparam_gain(objhandle, 6);
        end
    	
        final begin
            DPI_dut_terminate(objhandle);
        end
    
        always @(posedge clk or posedge reset) begin
            if(reset == 1'b1) begin
                DPI_dut_reset(objhandle, dut_U_In1, dut_Y_Out1);
                DPI_dut_setparam_gain(objhandle, 6);
            end
            else if(clk_enable) begin
                DPI_dut_output(objhandle, dut_U_In1, dut_Y_Out1);
                DPI_dut_update(objhandle, dut_U_In1);
            end
        end
    endmodule
    

Шаг 5. Запустите симуляцию с изменением параметра

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