verilog,VHDL~if文とcase文の記述方法~

論理回路

最近VHDLに触れる機会が増えてきて、verilogとの違いに困惑している私です。

今回はverilogとVHDLのif文とcase文のそれぞれについて構文と例をまとめておこうと思います。

まず、verilogのif文は、ifの後ろに記載した条件式を評価し、trueであればその次の処理を実行し、そうでなければelseの後ろに記載した処理を実行します。

verilogHDLの構文

if 条件式Ⅰ
 処理①
else if 条件式Ⅱ
 処理②
else
 処理③

verilogHDLの例

if (en == 1’b1)
 x <= a;
else if (en2 == 1’b1)
 x <= b;
else
 x <= c;

次に、VHDLのif文は、ifの後ろの条件式を評価し、trueであればthenの後ろの処理を実行し、そうでなければ次のelsifの後ろの条件式を評価し、trueであれば次のthenの後ろの処理を実行する。それもちがうのであればelseの後ろの処理を実行する。

VHDLの構文

if 条件式Ⅰ then
 処理①
elsif 条件式Ⅱ then
 処理②
else
 処理③
end if;

VHDLの例

if (en = ‘1’) then
 x <= a;
elsif (en2 = ‘1’) then
 x <= b;
else
 x <= c;
end if;

注意点は、VHDLはverilogと違いelse if が繋がってelsifとなっているところ、if文の最後にend ifと記載しなければいけないこと。VHDLはめんどい。。。

続いて、case文の構文と例をまとめていこうと思う。

verilogで記載するcase文は、caseの後の値と一致した文の処理を実行する。verilogで値がとりうることができるすべてに対して処理を記載しなくても文法エラーにはならない。しかし、論理合成をする際に予期しない動きをしてしまう可能性があるので、必ずdefaultの処理をいれるようにする。特に、入れたい値がなければ空白のままで問題はない。

verilogHDLの構文

case 信号
 信号の値1: 処理①
 信号の値2: 処理②
 …
 default: 処理③
endcase

verilogHDLの例

case (sel)
 3’b000: x <= a;
 3’b001: x <= b;
 3’b010: x <= c;
 3’b011: x <= d;
 3’b100: x <= e;
 default: ;
endcase

次にVHDLのcase文について、case文の後ろの信号の値が一致した処理を実行する。VHDLはVerilogと異なり、信号がとりうる値をすべて記載しなければ文法エラーとなってしまう。しかし、信号のビット幅が大きくすべての値を列挙するのはめんどくさいときもある。そんなときは、when othersを記載して、その処理をnullとしておけば問題ない。

VHDLの構文

case 信号 is
 when 信号の値1 => 処理①
 when 信号の値2 => 処理②
 …
 when others => 処理③
end case;

VHDLの例

case sel is
 when “000” => x <= a;
 when “001” => x <= b;
 when “010” => x <= c;
 when “011” => x <= d;
 when “100” => x <= e;
 when others => null;
end case;

case文に関しては、しっかり記述しないと文法エラーになってしまうVHDLの方が合成時のミスが少なる安心はある。

しかしながら、構文はverilogの方が受け入れやすいと思う。

コメント

タイトルとURLをコピーしました