集積システム設計: 設計実習

第2週 順序回路

今週は 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フリップフロップ

やってみよう

  1. RS フリップフロップ、JK フリップフロップを記述してみよう
  2. 記述した回路を FPGA 上に実装してみよう。なお、クロック信号について、入力ピン P39 を用いることにより、ボード上のクロック生成器より 6MHz のクロック信号を得ることができる。
  3. 図4の回路の動作を予想してみよう。また、シミュレーション実験をしてみよう。
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