AHDLの概略


概要

 ハードウエア記述言語AHDL (Altera Hardware Description Language) の概略を説明する。 ここでは、主なもののみを説明している。


AHDLの構造

 AHDLの基本構造は下記のようになる。 最低限度必要なのは、 SUBDESIGNBEGINからENDまで。

-- これはコメント
% これもコメント %
--
-- 「TITLE」は省略できる
TITLE "タイトル";
--
-- 定数を定義する。なくても良い。
-- 複数個定義する時は、CONSTANT行を複数個並べる。
CONSTANT 定数名 = ;
--
-- 名称はファイル名と同じにする。
SUBDESIGN 名称
--
-- 入出力の記述
-- 方向は下記のいずれか。
--   INPUT (入力)
--   OUTPUT (出力)
--   BIDIR (双方向)
(
  端子名1 : 方向;
  端子名2 : 方向;
)
--
-- 変数を定義する。なくても良い。
VARIABLE
  変数名1 : ;
  変数名2 : ;
--
-- 回路本体の動作を記述する。
BEGIN
END;

定数

AHDLの定数
種類 備考
10進数 123  
16進数 H"abcd"  
2進数 B"0101"  
定義済の定数 VCC 1
定義済の定数 GND 0

演算子と優先順位

AHDLの演算子と優先順位
優先順位 演算子 意味
1 - 単項マイナス
! NOT
2 + 加算
- 減算
3 == 等しい
!= 等しくない
< 小さい
<= 小さいか等しい
> 大きい
>= 大きいか等しい
4 & AND
!& NAND
5 $ XOR (排他的論理和)
!$ XNOR
6 # OR
!# NOR

デフォルト値の設定

 変数や端子の値を代入しなかった場合に使用する デフォルト値を設定する。 BEGINENDの間に書く。

BEGIN
  DEFAULTS
    変数 or 端子 = 式 or 値;
  END DEFAULTS;
END;


構文

IF文

IF 条件1 THEN
  式など;
ELSIF 条件2  THEN
  式など;
ELSE
  式など;
END IF;

CASE文

CASE  IS
  WHEN 定数1 => 式など;
  WHEN 定数2 => 式など;
END CASE;

真理値表

TABLE
  入力変数 => 出力変数;
  入力定数1 => 出力定数1;
  入力定数2 => 出力定数2;
END TABLE;


データ型

ノード (NODE)

 AHDLで変数のように代入したり参照したりして使用する。 ただし、実際の回路では、 電線、あるいは電線の分岐に対応する。

-- NODEを使ったサンプル
SUBDESIGN nodesample;
(
  in1 : INPUT;
  in2 : INPUT;
  out : OUTPUT;
)
VARIABLE
  a, b : NODE;
BEGIN
  a = in1 & in2;
  b = in1 # in2;
  out = a $ b;
END;

D-Flip Flop (DFF)

入/出 端子名 内容
入力 d データ
clk クロック。立ち上がりでデータを格納。
prn プリセット。低レベルで1を格納。
clrn クリア。低レベルで0を格納。
出力 q データ
-- DFFを使ったサンプル
SUBDESIGN flipflop;
(
  in : INPUT;
  ck : INPUT;
  out : OUTPUT;
)
VARIABLE
  f : DFF;
BEGIN
  f.prn = VCC;
  f.clrn = VCC;
  f.d = in;
  f.clk = ck;
  out = f.q;
END;

D-Flip Flop with Enable(DFFE)

入/出 端子名 内容
入力 d データ
clk クロック。
ena enable。enaが高レベルの時クロックの立ち上がりでデータを格納。
prn プリセット。低レベルで1を格納。
clrn クリア。低レベルで0を格納。
出力 q データ

T-Flip Flop (TFF)

入/出 端子名 内容 [1]との対応
入力 T Tが高レベルの時、clkの立ち上がりでデータを格納。 なし。T=高レベルになる。
clk T
prn プリセット。低レベルで1を格納。 なし。prn=高レベルになる。
clrn クリア。低レベルで0を格納。 なし。clrn=高レベルになる。
出力 q データ q

[1] 宮田武雄 "速解 論理回路" コロナ社


グループ

 複数の端子、変数などをグループ化して使うことができる。 バスや複数ビットのレジスタなどで便利である。 グループは、

  名前[範囲]
  (式1, 式2, ..., )
のように書く。 「a[3..0]」と「(a3, a2, a1, a0)」は同じ意味である。 また、「a[]」はグループ「a」の要素全てを示す。 「a[2]」はグループではなくグループの一要素となり、 これは「a2」と同じになるので要注意。


(作成: 2003年10月8日, 最終更新: 2003年10月16日)