組合せ回路のRTL記述
ムーアマシンはFFと組合せ回路から成るが、簡単な組合せ回路の方から説明する。
◇
組合せ回路とはAND-ORといった論理素子をつないだ回路で、入力の値が決まると即、出力の値も決まる。したがって組合せ回路をRTL記述するには、出力や途中の信号を変数とし、変数への代入文を論理式やif文,case文で書けばよい。
tmp = a & b; y = tmp | c;
|
if(c) y = 1; else y = a & b; |
例えば、
という回路は次のようなRTL記述になる。
右辺が変化したら随時代入: d0_wire = a & b; 右辺が変化したら随時代入: d1_wire = ~d0_wire; |
ソフトウェア言語では代入文は上から順に実行されるが、RTL記述では右辺が変化すると随時代入されるので、代入文を書く順序は任意でよい。また随時代入だから代入をループさせると発振するか記憶素子(ラッチという)になってしまうのでHDLではそのような記述はしてはいけないし、そもそも回路として不都合。例えば下図の回路はb=0のときはよいが、b=1のときは発振する。
◇
Verilog言語では、素子の出力を素子の入力へ即伝える信号線をwire変数で表し、wire変数への代入はassign文というもので書く。
wire d0_wire, d1_wire; assign d0_wire = a & b; assign d1_wire = ~d0_wire; |
また論理式でなくif文やcase文を書く場合はfunction文という多入力1出力の関数のようなものを使う。
assign d1_wire = comb(.x(a),.y(b)); function comb(input x,input y); case({x,y}) 2'd0: y = 1'b1; 2'd1: y = 1'b1; 2'd2: y = 1'b1; 2'd3: y = 1'b0; endcase endfunction |
実は組合せ回路の書き方はもう1つ、reg変数とalways文で書く方法があるのだが、その方法を使わなくても困ることはないし、また次項で説明するFlipFlopの書き方とまぎらわしいので使わない方がよい。