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 コード内では clk
、reset
、および 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
をもちます。
コードを生成すると、HDL Coder はクロック信号、リセット信号、およびクロック イネーブル信号を作成します。これらの信号は HDL コード内では clk
、reset
、および 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
モデルで異なるサンプル時間を使用する場合、または速度および面積の最適化を有効にする場合、モデルはマルチレートになります。マルチレート モデルからのクロック バンドルの生成の詳細については、マルチレート モデルからのコード生成を参照してください。