Main Content

HDL Coder でのクロック バンドル信号の生成

クロック バンドル信号はクロック信号、リセット信号、およびクロック イネーブル信号で構成されます。コードの生成中に、HDL Coder™ は、設計で使用する永続変数や Delay ブロックなどのシーケンシャル要素に基づいて、クロック バンドル信号を生成します。既定では、単一の基本クロックと単一の基本リセットによって、設計のすべてのシーケンシャル要素が駆動されます。

MATLAB コードとクロックの関係

MATLAB® で永続変数を使用する場合、HDL Coder はクロック バンドル信号を生成します。永続変数は、関数の呼び出し間でその値がメモリに保持される、MATLAB 関数のローカル変数です。コード生成では、関数は永続変数が空の場合に初期化しなければなりません。詳細については、persistent を参照してください。

永続変数 n を使用する次の MATLAB コードについて考えます。

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

コードを生成すると、HDL Coder はクロック信号、リセット信号、およびクロック イネーブル信号を作成します。これらの信号は HDL コード内では clkreset、および clk_enable という名前です。HDL コードを生成する方法の詳細については、MATLAB からの基本の HDL コード生成と FPGA 合成を参照してください。

次のコードはモデルに対して生成された Verilog コードを示しています。MATLAB 永続変数の動作と一致させるため、HDL コードは always ブロックを使用します。クロック信号の正のエッジで、リセットが low でイネーブル信号が high のとき、1 ns の遅延の後、値 tmp が変数 n に代入されます。

`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 の 1 サンプル時間単位が HDL コードの 1 クロック サイクルにマッピングされるということです。

たとえば、2 サンプル時間単位の後に入力の単項マイナスを出力する次のモデルについて考えてみます。入力は出力データ型として int32 をもちます。

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

コードを生成すると、HDL Coder はクロック信号、リセット信号、およびクロック イネーブル信号を作成します。これらの信号は HDL コード内では clkreset、および clk_enable という名前です。コードを生成する方法の詳細については、Simulink モデルからの HDL コードの生成を参照してください。

次のコードはモデルに対して生成された Verilog コードを示しています。Simulink Delay ブロックの動作に一致させるため、HDL コードはそれぞれの Delay ブロックに対して always ブロックを使用します。クロック信号の正のエッジで、リセットが low でイネーブル信号が high のとき、入力は 1 単位遅延の後に出力に渡されます。単項マイナスを計算する前に、1 つの always ブロックが入力を 1 ns だけ遅延させます。他の always ブロックは 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

モデルで異なるサンプル時間を使用する場合、または速度および面積の最適化を有効にする場合、モデルはマルチレートになります。マルチレート モデルからのクロック バンドルの生成の詳細については、マルチレート モデルからのコード生成を参照してください。

参考

|

関連するトピック