組合せ回路の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の書き方とまぎらわしいので使わない方がよい。


[] [] []