AHDL入門

AHDLとは,米国ALTERA社のハードウェア記述言語である.同社のFPGAの開発を目的に作られた.
FPGAの市場では,Altera社とXilinx社で世界の5割〜6割のシェアを占めている。
そのため,AHDLはメーカ固有の言語であるにもかかわらず,以前広く使われていた.
VHDLやVerilogの安価なツールが普及してきたこともあり今日で利用者は減っているが,
過去の設計資産を利用する場合などAHDLは今でも利用されている.
AHDLは文法が容易で,論理回路を学習した者にとっては移行しやすいと思われるのでここで取り上げる.


AHDLの文法概説

簡単な論理回路の演習を行うのに必要なAHDLの文法を概説する.
詳細な文法についてはMax+plusIIのヘルプファイルに英文で記述してあるのでそちらをご参照ください.

1. 基本セクション
AHDL は基本的に
(1)サブデザイン・セクション
(2)変数セクション
(3)ロジック・セクション
の3つのセクションにより構成される.

リスト1を例に,各セクションの説明を行う.


リスト1

SUBDESIGN test1
(
	a,clk:	INPUT;
	out: 	OUTPUT;
)
VARIABLE
	d:	 	NODE;
	ff:	 	DFF;
BEGIN
	d=!a;
	ff.d=d;
	ff.clk=clk;
	out=ff.q;
END;



(1)サブデザイン・セクション
入出力ピンおよび双方向ピンをここで定義する.

リスト1より
SUBDESIGN test1
(
		a ,clk:	INPUT;
		out:	OUTPUT;
)

・SUBDESIGN はサブデザインの定義,test1はサブデザイン名で記述する回路によって固有の名前をつける.
またサブデザイン名はファイル名と同じ.ファイルの拡張子は.tdfとする. 
・ピンのリストは括弧( )で囲む.
・ピン名はコンマ(,)で区切り,ピンの種類はコロン(:)に続けて記述し,行の区切りにはセミコロン(;)が必要である.
ここでINPUTは入力ピンの定義,OUTPUTは出力ピンの定義.


(2)変数セクション
変数を使用する場合ここで定義する.

リスト1より

VARIABLE
d: 	NODE ;
ff : 	DFF ;

・入出力以外で回路に使用する配線をノード(NODE)という.
・フリップフロップなどの記憶素子は,変数名,コロンの後に,DFFなどのレジスタ宣言を行う.
ここでDFFはD-フリップフロップを表す.そのほか,DFFE(Eはイネーブル端子付き),
JKFF,SRFF,SRFFE,TFF,TFFEなどが使用できる.
・レジスタ宣言された変数の接続端子をポートという.ポートは”.ポート名”で表現する.

(3)ロジック・セクション
回路の動作をここで明記する.ロジック・セクションはBEGINとENDで囲む.
入出力やノードの配線との接続を記述していく.

リスト1より
BEGIN
		d=!a;
		ff.d=d;
		ff.clk=clk;
		out=ff.q;
END;

!は否定を表す.よって d = !a は,d がaの論理否定(NOT)であることを示している.
ff.d = d は,ff の入力ポートにdが接続されていることを示している.
その他,clkはクロックポート,qは出力ポート.


2.数字・定数

AHDL では,10 進数,2 進数,8 進数,16 進数を使うことができる.
16進数の0370H は AHDLでは H"0370" と記述.これを2進数で表す場合は,B"0000001101110000" となる.
数字や文字列に固有の名前をつけることができる.
(例)CONSTANT IO_ADDRESS = H"0370";


3.組み合わせ論理回路

(1) 論理演算子,算術演算子および比較演算子
演算子	備考
-	負符号
!	NOT(論理演算子)
+	加算(算術演算子)
-	減算(算術演算子)
==	等しい(比較演算子)
!=	等しくない(比較演算子)
<	小さい(比較演算子)
<=	小さいか等しい(比較演算子)
>	大きい(比較演算子)
=>	大きいか等しい(比較演算子)
&	AND(論理演算子)
!&	NAND(論理演算子)
$	XOR(論理演算子)
!$	XNOR(論理演算子)
#	OR(論理演算子)
!#	NOR(論理演算子)


(2)グループの定義
 複数の配線をグループとして扱うことができる.例えばa[3..0]はa3, a2, a1, a0の計4本の配線のグループである.
全グループを表すとき,[]内を省略可である.
(例)a[3..0]でグループを定義した後は,a[]と書いても等価

グループと他のグループの接続が可能だが,両方とも同じビット数でなければならない.
(例) a[3..0] = b[7..4]

グループをVCCやGNDにセットできる.
(例) a[3..0] = VCC;
     

(3)条件判断
a) If 文
IFに続けて条件判断式を記述し,THENに続く記述が条件判断が真の場合,ELSEに続く記述が偽の場合に相当する.
IF文の最後はEND IFでくくる.ELSEIFを用いてIF文を入れ子構造とすることもできる.

(例)
IF high THEN
	level = 1;
ELSE
	level = 0;
END IF;


(3) Case 文
Case 文では,CASE に続く値を評価した後,その値によって有効となる動作を列挙する.

(デコーダの例)
CASE code[] IS
	WHEN 0 => out[] = B"0001";
	WHEN 1 => out[] = B"0010";
	WHEN 2 => out[] = B"0100";
	WHEN 3 => out[] = B"1000";
END CASE;

(4) Table文
Table文を使って真理値表を記述することができる.
割り当てがされていないときの値をDefaults文によって定義できる.

(例)
DEFAULTS
	code[] = B"1111";
END DEFAULTS;
TABLE
	i[1..0]  => code[];
	B"000" => B"0001";	
	B"001" => B"0010";	
	B"010" => B"0100";	
	B"011" => B"1000";
END TABLE;


4. 順序回路

順序回路とは,ある時点での出力がその時の入力とそれまでの経緯に依存するものである.
そのため順序回路の構成には記憶素子(フリップフロップ)が必要となる.

(1)ステート・マシン
AHDLでは状態遷移図や状態遷移表をもとに,ステート・マシンを容易に作成することができる.
変数セクションでステート・マシン宣言を行い,ステート・マシン名,ステート・マシンの状態,
ステート・ビットを宣言する.
リスト2はmoore型のステートマシン記述例である.S0からS3の4状態が定義され,
状態と出力信号zが関連付けられている.

リスト2

SUBDESIGN moore1
(
	clk : INPUT;
	reset : INPUT;
	y : INPUT;
	z : OUTPUT;
)
VARIABLE
	ss: MACHINE OF BITS (z) WITH STATES (s0 = 0, s1 = 1, s2 = 1, s3 = 0);
BEGIN
	ss.clk = clk;
	ss.reset = reset;
	TABLE
		ss, 	y 	=> ss;
		s0, 	0 	=> s0;
		s0, 	1 	=> s2;
		s1, 	0 	=> s0;
		s1, 	1 	=> s2;
		s2, 	0 	=> s2;
		s2, 	1 	=> s3;
		s3, 	0 	=> s3;
		s3, 	1 	=> s1;
	END TABLE;
END;


(2) 非同期式ステート・マシン
AHDL は,非同期式ステート・マシンの実装もサポートしている.
(記述例は省略)


5.階層プロジェクト

省略