ムーアマシンのRTL記述
ここまでで準備ができたのでムーアマシンの書き方を説明する。
この図のムーアマシンをVerilogで書くと次のようになる。
/* moore.v */ module moore (input clk // 入出力ポートの宣言 ,input rst ,input[L:0] d_in ,output[M:0] d_out );
reg[N:0] d_reg; // 内部変数の宣言
// FFとその入力組合せ回路の記述 always @(posedge clk or posedge rst) begin if(rst) d_reg <= 'd0; else d_reg <= fnc1(d_reg,d_in); end
// 組合せ回路の記述 assign d_out = fnc2(d_reg);
endmodule |
・1つの回路はmoduleという単位で書かれる。C言語の関数のようなものと思えばよい。
・入力ポートと宣言した信号は、そのまま変数として代入文の右辺やif文の条件式で使える。
・出力ポートと宣言した信号は、wire変数として何か代入しなければならない。
・内部変数は最初に全部宣言しておく。
◇
・FFはalways文で記述する。論理合成ツールにFFと認識してもらうためには、クロックclkと非同期リセットrstをこのテンプレートどおりに書かなければならない。
// clkの立上がりまたはrstの立上がり時にbegin-end内を実行するという意味 always @(posedge clk or posedge rst) begin if(rst) // 非同期リセット: rst=1ならば0を代入する d_reg <= 'd0; else d_reg <= fnc1(d_reg,d_in); // clkでの動作: 値を代入する end |
ここで非同期リセットとはクロックよりも優先して強制的にFFの値を確定させるグローバルな信号である。
◇◇
・組合せ回路はassign文で記述する。右辺は論理式またはfunction文で書く。
// 1行の式で書ける組合せ回路はfunction文を使う必要はない assign parity = ^d_reg; |
// 複雑な組合せ回路はfunction文を使う assign d_out = fnc2( dreg ); function[M:0] fnc2 // fnc2は出力 (input[N:0] d); // 入力の宣言 case(d) 'd0: fnc2 = d[M:0]; 'd1: fnc2 = d[M+1:1]; ... default: fnc2 = 'bx; endcase endfunction |