Генерация сигналов синхроимпульса в HDL Coder

Сигналы синхроимпульса состоят из синхроимпульсов, сбросов и синхроимпульсов. Во время генерации кода HDL- Coder™ создает тактовые сигналы на основе последовательных элементов, таких как постоянные переменные или Delay блоки, которые вы используете в проекте. По умолчанию один главный синхроимпульс и один главный сброс управляют всеми последовательными элементами в проекте.

КОД MATLAB

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

Допустим, этот код MATLAB, который использует постоянную переменную n.

function y = persist_fcn(u)
    persistent n
        
    if isempty(n)
        n = 1;
    end
    
    y = n;
    n = n + u; 
end

Когда вы генерируете код, HDL Coder создает сигналы времени, сброса и включения синхроимпульса. Эти сигналы названы как clk, reset, и clk_enable в HDL-коде. Чтобы узнать, как сгенерировать HDL-код, смотрите Basic HDL Code Generation и FPGA Synthesis из MATLAB.

Этот код показывает сгенерированный код Verilog для модели. Чтобы соответствовать поведению постоянной переменной MATLAB, HDL-код использует всегда блок. На положительном ребре синхросигнала, когда сброс низок и сигнал включения высок, значение tmp присваивается переменной n после задержки 1 ns.

`timescale 1 ns / 1 ns

module persist_fcn_fixpt
          (clk, reset, clk_enable,
           u, ce_out, y);

  input   clk, reset, clk_enable;
  input   u;  // ufix1
  output  ce_out;
  output  y;  // ufix1
..

assign enb = clk_enable;

assign p4tmp_1 = {1'b0, u};
assign tmp = n + p4tmp_1;

always @(posedge clk or posedge reset)
    begin : n_reg_process
      if (reset == 1'b1) begin
        n <= 2'b01;
      end
      else begin
        if (enb) begin
          n <= tmp;
        end
      end
    end

    assign y = n[0];
    assign ce_out = clk_enable;

endmodule  // persist_fcn_fixpt

См. также «Постоянные переменные и переменные стойкого массива».

Simulink Модели и синхроимпульсы

Чтобы смоделировать последовательные элементы в Simulink® и сгенерировать синхросигналы, вы можете использовать различные виды блоков Delay, Stateflow® графики или стойкие переменные в блоках MATLAB Function или MATLAB System блоках. Генератор кода отображает шаги расчета, которые вы задаете в своей модели, чтобы синхронизировать циклы в HDL- проекта. По умолчанию модель является одной скоростью, что означает, что один шаг расчета модуля в Simulink преобразуется в один такт в HDL-коде.

Например, рассмотрите эту модель, которая выводит унарный минус входа после двух модулей шага расчета. Вход имеет int32 как тип выходных данных.

Model that computes unary minus of input after two sample time units.

Когда вы генерируете код, HDL Coder создает сигналы времени, сброса и включения синхроимпульса. Эти сигналы названы как clk, reset, и clk_enable в HDL-коде. Чтобы узнать, как сгенерировать код, см. «Генерация HDL-кода из Simulink».

Этот код показывает сгенерированный код Verilog для модели. Чтобы соответствовать поведению блоков Delay Simulink, HDL-код использует всегда блок для каждого блока Delay. При положительном ребре синхросигнала, когда сброс низок и сигнал включения высок, вход передается на выход после модуля задержки. Один блок всегда задерживает вход по 1 ns перед вычислением унарного минуса. Другой блок всегда вычисляет унарный минус после 1 ns.

`timescale 1 ns / 1 ns

module unary_minus
          (clk, reset, clk_enable,
           In1, ce_out, Out1);

  input   clk, reset, clk_enable;
  input   signed [31:0] In1;  // int32
  output  ce_out;
  output  signed [31:0] Out1;  // int32
 ...

  assign enb = clk_enable;

  always @(posedge clk or posedge reset)
    begin : Delay_process
      if (reset == 1'b1) begin
        Delay_out1 <= 32'sb0;
      end
      else begin
        if (enb) begin
          Delay_out1 <= In1;
        end
      end
    end
 ...

  always @(posedge clk or posedge reset)
    begin : Delay2_process
       if (reset == 1'b1) begin
        Delay2_out1 <= 32'sb0;
      end
      else begin
        if (enb) begin
          Delay2_out1 <= Unary_Minus_out1;
        end
      end
    end 
 ...

endmodule  // unary_minus

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

См. также

|

Похожие темы