計算機工学特論 A
How to use AHDL Section 2
P28~34
・ デコーダの作成
・ 変数のデフォルトの値の使用
05801603
井田 登士
Creating Decoders デコーダの作成
デコーダとは・・・・
デコーダは組み合わせ論理回路からなっていて入力パター
ンを出力値に変換したり、入力パターンから出力値を決め
たりするものである。
AHDLでは真理値表セクションでデコーダを作成することが可能
例
真理値表を使って7セグメントのディスプ
レイで0~9、A~Fまでの文字を表示する
プログラム
プログラム例
BEGIN
%
-a-
% f|
%
|b
TABLE
%
-g-
% e|
%
%
i[3..0]=>a, b, c, d, e, f, g;
%
|c
-d-
%
%
LED配置
H"0" => 1, 1, 1, 1, 1, 1, 0;
%
コメント
H"1" => 0, 1, 1, 0, 0, 0, 0;
%
H"2" => 1, 1, 0, 1, 1, 0, 1;
%0123456789abcdef %
%
H"3" => 1, 1, 1, 1, 0, 0, 1;
%
H"4" => 0, 1, 1, 0, 0, 1, 1;
H"5" => 1, 1, 0, 1, 0, 1, 1;
SUBDESIGN 7segment
H"6" => 1, 0, 1, 1, 1, 1, 1;
(
)
H"7" => 1, 1, 1, 0, 0, 0, 0;
i[3..0]
: INPUT;
a, b, c, d, e, f, g
: OUTPUT;
入出力宣言
H"8" => 1, 1, 1, 1, 1, 1, 1;
H"9" => 1, 1, 1, 1, 0, 1, 1;
H"A" => 1, 1, 1, 0, 1, 1, 0;
H"B" => 0, 0, 1, 1, 1, 1, 0;
H"C" => 1, 0, 0, 1, 1, 1, 0;
H"D" => 0, 1, 1, 1, 1, 0, 1;
H"E" => 1, 0, 0, 1, 1, 1, 1;
H"F" => 1, 0, 0, 0, 1, 1, 1;
END TABLE;
END;
真理値表
入力パターンが多い場合
このプログラム例のように入力パ
ターンが多数のときは真理値表文
で全てを表現することは難しいので
下線部のようにX(don’t care)を使
うことにより、出力がXの位置にあ
る入力には依存しないようにできる。
SUBDESIGN decode3
(
addr[15..0], m/io
rom, ram, print, sp[2..1]
:INPUT;
:OUTPUT;
)
BEGIN
TABLE
m/io,
addr[15..0]
=> rom, ram,
print, sp[];
1,
B"00XXXXXXXXXXXXXX"
=> 1,
0,
0,
B"00";
1,
B"100XXXXXXXXXXXXX"
=> 0,
1,
0,
B"00";
0,
B"0000001010101110"
=> 0,
0,
1,
B"00";
0,
B"0000001011011110"
=> 0,
0,
0,
B"01";
0,
B"0000001101110000"
=> 0,
0,
0,
B"10";
END TABLE;
END;
Using Default Values for Variables
変数のデフォルト値の使用
ファイル内にノードやグループの値が指定されていない時、その
ノードやグループに対してデフォルトの値を定義することができ
る。デフォルト値がない場合にはデフォルト値はGND(0)となる。
SUBDESIGN default1
(
i[3..0]
:INPUT;
ascii_code[7..0] :OUTPUT;
)
BEGIN
DEFAULTS
ascii_code[] = B"00111111";
END DEFAULTS;
TABLE
i[3..0]
% "?" %
=> ascii_code[];
B"1000"
B"0100"
B"0010"
B"0001"
END TABLE;
END;
=>
=>
=>
=>
B"01100001";
B"01100010";
B"01100011";
B"01100100";
% "a" %
% "b" %
% "c" %
% "d" %
DEFAULT文
入力パターンが、真理値表の左側に示された
パターンのうち一つと一致した場合は表の右
側の出力パターンとなる。入力パターンが左
側のどのパターンにも一致しなかった場合は、
出力はデフォルトのB”00111111”となる。
一つのノードに二つ以上の値が指定された場合
SUBDESIGN default2
(
a, b, c
:INPUT;
select_a, select_b, select_c :INPUT;
wire_or, wire_and
:OUTPUT;
)
BEGIN
DEFAULTS
wire_or = GND;
wire_and = VCC;
END DEFAULTS;
IF select_a THEN
wire_or = a;
wire_and = a;
END IF;
IF select_b THEN
wire_or = b;
wire_and = b;
END IF;
IF select_c THEN
wire_or = c;
wire_and = c;
END IF;
END;
ダウンロード

Document