VHDLのelseの使い方

ハードウェア記述言語の演習中

先日,割とでかめなストレスを背負うことになった.

なんと,if文でエラーが出たのです.しかも解決に1時間もかけてしまった.

いやいやいや,あんた.うそでしょ.5年にもなってif文でミスるのかい!

如何にまだまだ学生であるか実感させられましたね.死にたくなった.

今後絶対忘れないためにもここに記しておく.

同期型RESET・ENABLE端子付きD-FF

横文字いっぱいだね.

でも別に難しくなくて,

  • 同期型=「出力はクロックに同期するよ」
  • RESET=「出力をやり直すよ」
  • ENABLE=「スイッチだよ」

と言っているだけなので書き直せば

「出力がクロックに同期して,かつやり直せて,スイッチもついてるD-FF」

です.完成したプログラムコード

まずは完成プログラム.

--ライブラリ宣言
 LIBRARY ieee, tina;
 use ieee.std_logic_1164.all;
 use std.textio.all;
 USE tina.primitives.all;

--エンティティ宣言
 entity DFFR1 is
 port(D, CLK, RESET, ENABLE :in std_logic;
      Q, Q_NOT              :out std_logic);
 end DFFR1;

--アーキテクチャ宣言
 architecture Behavioral of DFFR1 is
 signal tmp : std_logic;
 begin
     process(CLK,RESET,ENABLE)
         begin
            if(ENABLE='1') then
            {
               if(RESET='0') then
               {
                  if(CLK'event and CLK='0') then
                     tmp<='0';
               }
               else
                     tmp <= D;
               end if;
            }
            else
               tmp <= '0';
            end if;
    end process;
 Q <= tmp;
 Q_NOT <= not tmp;

end Behavioral;

このプログラムの,赤字のところ

正解プログラム
if(RESET=’0′) then
{
if(CLK’event and CLK=’0′) then
tmp<=’0′;
}
else
tmp <= D;
end if;
ですね.これを自分は
不正解プログラム
if(RESET=’0′) then
{
if(CLK’event and CLK=’0′) then
tmp<=’0′;
}
end else;
tmp <= D;
end if;
 としてしまった.
C言に精通している人であれば
「凡ミス乙wwwwwwwwwwwwwwww」
案件ではあるのだけれど,これ実は結構面白いことだと思うのです.つまり
elseというのはif文の一部であって

elsifのように新たなif文生成の機能は一切持たない
ということを示しているんですよ.
VHDLには通常C言語にあるif,elseのほかに
elseだった場合に判定する条件式(=elsif)
を用いてすでにあるif文の内部に条件式を新規に書き込むことができる
のですが,それには適宜end if;が必要だったのです,
しかし,単純に否定の場合の処理を記述する場合には
elseと書いて後に処理を書き込むだけでいいんですね.
自分の中でのVHDL像が固まってきた一見だった.
同じようなことに困っていたら是非,活用してほしい.