目的
同期回路と設計上の注意点の続編?、勢いで書いただけです。
同期回路を意識したVerilogの書き方について述べる。
Wikipediaにあるように論理回路は組み合わせ回路と順序回路からなる。Verilogではそれぞれ分けて書くことが望ましい。
同期回路の構成要素
下記に同期回路の構成要素を列挙しそれぞれVerilogでどう書くか例を挙げる。
DFF
下記は1bitのDFFの記述の例、クロック(CLK)とリセット(RESETN)をつけるのがよい。
DFFへの入力はDINから渡す。DFFへの入力はノンブロック代入がよい。
reg DFF;
always@(posedge CLK or negedge RESETN)
if(!RESETN)
DFF <= 0;
else
DFF <= DIN
簡単な順序回路(カウンタ)なら論理を書いても問題ない。
reg [3:0] CNT;
always@(posedge CLK or negedge RESETN)
if(!RESETN)
CNT <= 0;
else
CNT <= CNT + 1
ラッチ回路
ラッチ回路は使わない方がいいが下記の記述で作成できる。
reg DFF;
always@(CLK or DIN)
if(CLK)
DFF <= DIN
論理ゲートを使った組み合わせ回路
下記は加算器の例、c=a+bを行う。
assign文の場合
wire [3:0] a;
wire [3:0] b;
wire [3:0] c;
assign c = a + b;
always文の場合、ブロッキング代入が望ましい。
wire [3:0] a;
wire [3:0] b;
reg [3:0] c;
always @*
c = a + b;
ステートマシン
下記はステートマシンの例、組み合わせ回路と順序回路をそれぞれ使用する。
NSTATは組み合わせ回路でSTATは順序回路である。
reg [2:0] NSTAT;
reg [2:0] STAT;
always @*
case (STAT)
3'b000: NSTAT = 3'b001;
3'b001: NSTAT = 3'b010;
3'b010: NSTAT = 3'b100;
defaut: NSTAT = 3'b000;
endcase
always@(posedge CLK or negedge RESETN)
if(!RESETN)
STAT <= 0;
else
STAT <= NSTAT