目次
ハードウェア記述言語の演習中
先日,割とでかめなストレスを背負うことになった.
なんと,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(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;
{
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像が固まってきた一見だった.
同じようなことに困っていたら是非,活用してほしい.