exponenta event banner

Формирование сигналов синхросигналов в кодере HDL

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

Код MATLAB и отношение часов

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

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

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

При создании кода кодер HDL создает сигналы синхронизации, сброса и включения синхронизации. Эти сигналы называются clk, reset, и clk_enable в коде HDL. Сведения о том, как генерировать код HDL, см. в разделах Создание базового кода HDL и Синтез FPGA от MATLAB.

Этот код показывает созданный код Verilog для модели. Для соответствия поведению постоянной переменной MATLAB код HDL использует блок always. На положительном фронте синхросигнала, когда сброс низкий и сигнал разрешения высокий, значение 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 ® и генерации сигналов пакета синхросигналов можно использовать различные типы блоков задержки, диаграмм Stateflow ® или постоянных переменных в функциональных блоках MATLAB или системных блоках MATLAB. Генератор кода сопоставляет время выборки, указанное в модели, с циклами синхронизации в конструкции HDL. По умолчанию модель является одинарной, что означает, что одна единица времени выборки в Simulink соответствует одному такту в коде HDL.

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

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

При создании кода кодер HDL создает сигналы синхронизации, сброса и включения синхронизации. Эти сигналы называются clk, reset, и clk_enable в коде HDL. Сведения о создании кода см. в разделе Создание кода HDL из модели Simulink.

Этот код показывает созданный код Verilog для модели. Для соответствия поведению блока задержки Simulink код HDL использует блок всегда для каждого блока задержки. На положительном фронте тактового сигнала, когда сброс является низким, а разрешающий сигнал является высоким, вход передается на выход после единичной задержки. Один блок всегда задерживает ввод на 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

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

См. также

|

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