今週は HDL を用いてフリップフロップを記述する。学部の講義において、フリップフロップはインバータループから構成されることを学んだ。しかし、HDLによる設計においてはフリップフロップとしてインバータループを記述することはなく、決まった書き方をする。Verilog-HDL では、フリップフロップは手続きブロックを用いて記述される。
Dフリップフロップ回路の記述例を図1に示す。
module DFlipFlop(D, Q, CLK); input D, CLK; output Q; reg Q; // 手続きブロック内で値が決定する信号線の宣言 always@(posedge CLK) // フリップフロップを作るときの決まり文句 // 「クロック立ち上がり時はいつも」という意味 begin // 手続きブロックの開始 Q <= D; // 入力値 D を Q に代入(記憶)する // 手続きブロック内での代入記号は '<=' end // 手続きブロックの終了 endmodule |
図1: Dフリップフロップ
記述が終わったらシミュレーション実験されたい。先週と同様に実施できる。ただし、Clock Information は Single Clock とし、CLK を選ばれたい。
次に、非同期リセット信号線付きの Dフリップフロップの記述例を図2に示す。非同期リセット信号は負論理であることが多い。つまり常時 1 を与えておくものとし、リセット時のみ 0 を与えるタイプのものが多い。
module DFlipFlop(D, Q, CLK, RST); input D, CLK, RST; output Q; reg Q; always@(posedge CLK or negedge RST) // 「クロック立ち上がり時またはリセット時はいつも」という意味 begin // 手続きブロックの開始 if(!RST) // 手続きブロック内では if 文が使用できる begin // RST がオフのとき、つまり、リセット時 Q <= 1'b0; // 1ビットの0 // n'b〜 はnビットの2進数表現された定数値を表す end else begin // クロック立ち上がり時 Q <= D; end end // 手続きブロックの終了 endmodule |
図2: リセット信号付きDフリップフロップ
手続きブロックにおける代入文の右辺においては、入力値 D や、定数値の他、出力値 Q も用いることができる。この場合 Q は、「クロックが立ち上がる直前の Q の値」と解釈される。また、これらを組み合わせた式を記述することもできる。例としてトグルフリップフロップの記述を図3に示す。
module TFlipFlop(T, Q, CLK, RST); input T, CLK, RST; output Q; reg Q; always@(posedge CLK or negedge RST) begin if(!RST) begin // RST がオフのとき、つまり、リセット時 Q <= 1'b0; // 1ビットの0 end else begin // クロック立ち上がり時 if(T) begin // T がオンのとき Q <= ~Q; // Q に記憶されている値を反転した値を記憶 end else begin // T がオフのとき Q <= Q; // Q に記憶されている値をそのまま保持 end end end endmodule |
図3: Tフリップフロップ
module Counter(Q, CLK, RST); input CLK, RST; output [7:0] Q; // Q[7]〜Q[0] の8本の信号線からなるバス reg [7:0] Q; always@(posedge CLK or negedge RST) begin if(!RST) begin // リセット時 Q <= 8'b00000000; // 8ビットの0 end else begin // クロック立ち上がり時 Q <= Q + 8'b00000001; end end endmodule |
図4
難波 一輝 (助教・伊藤・北神・難波研究室)
工学部1号棟4階409号室、内線3255、043-290-3255、namba@ieee.org