最近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の方が受け入れやすいと思う。
コメント