English / 日本語

Gregory J. Durnan, PhD, CEng, FIMarEST

jABEL — ABEL HDL → JEDEC コンパイラ
San Diego, CA, USA · お問い合わせ · durnan.org

jABEL — ABEL の式を入れれば、信頼できる GAL が出てくる

小さな GAL には今でも魅力がたくさんあります。GAL16V8、GAL20V8、GAL22V10 は安価で、ブレッドボードにそのまま挿せるスルーホールの DIP パッケージ、5 V 動作、電源投入と同時に動き出し、74 シリーズのゲートやデコーダ、カウンタを何個もまとめて 1 チップに置き換えられます。部品自体は今も製造・流通しています。静かに姿を消したのはソフトウェアの方です。昔の ABEL コンパイラはDOS のツールで、その後はこれらのデバイスをとうにサポート対象から外したベンダーのツール群の一部になってしまいました。

そこで作ったのが jABEL です。ABEL-HDL (論理式、セット、WHEN/THEN/ELSE、ステートダイアグラム、真理値表、テストベクタ)を読み込み、TL866/XGecu などの一般的なプログラマでチップに書き込める JEDEC ヒューズファイルを出力する、小さな単体の Java プログラムです。対象は、今でも買える 3 種類のデバイスだけ。その 3 種類をきちんと扱います。

余談:jABEL はもともと、私が自分用に作った簡単な ABEL→JEDEC 変換ツールでした。チップに書き込める程度には動いていたのですが、プログラマの「ベリファイ」が保証するのはチップがファイル通りのヒューズを保持していることだけで、そのヒューズが式どおりの論理になっているかまでは分かりません。きちんと検証してみると、チェックサムの誤り、入力列の割り当てミス、22V10 のレジスタ設定ビットの反転が見つかりました。バージョン 0.5 は、自分の出力を徹底的に疑う姿勢でゼロから書き直したもので、以下の内容はすべてその「疑い深さ」がテーマです。
デバイスパッケージ入力出力主な用途
GAL16V820 ピン DIP最大 16最大 8グルーロジック、ゲート、小規模カウンタ
GAL20V824 ピン DIP最大 20最大 8同上、入力がより多い用途(アドレスデコーダ)
GAL22V1024 ピン DIP最大 22最大 10大きな論理式、ステートマシン、リセット/プリセット

はじめての ABEL プログラム

入門には、考えうる最小の設計がいちばんです。GAL16V8 の中に AND ゲートを 1 つ作ってみましょう。jABEL を起動し(abel-jedec.bat をダブルクリック、または java -jar app/abel-jedec.jar を実行)、 Editor Open を押して次のように入力します。

module demo;
title 'Simple demo for the editor';

  demo device 'p16v8';      " 使用するチップ
  a,b pin 2,3;              " 入力 2 本
  y pin 15;                 " 出力 1 本

equations
  y = a & b;

test_vectors
  ([a,b] -> [y])
  [0,0] -> [0];
  [0,1] -> [0];
  [1,0] -> [0];
  [1,1] -> [1];

end demo;

ABEL ファイルはどれも同じ形をしています。宣言部でチップを指定し、各信号にピンを割り当てます。 equations で出力の動作を記述します。& は AND、# は OR、 ! は NOT、$ は XOR です。そして test_vectors に期待する結果を書きます。矢印の左が入力の組み合わせ、右がそのときの出力です。ダブルクォート以降はコメントになります。

GAL16V8 12345 678910 2019181716 1514131211 a b GND VCC y = a & b
この設計がチップに求めること:ピン 2・3 が入力、ヒューズで作る AND ゲート、ピン 15 が出力

次に Create Output を押します。jABEL はソースを解析し、論理を最小化し、GAL の動作モードを選び、すべての積項を配置して、得られた JEDEC ヒューズマップを右側に表示します。

demo の ABEL ソースと JEDEC ヒューズマップを表示した jABEL のメインウィンドウ
左にソース、右にヒューズマップ、下に判定結果

重要なのは下の 3 行です。Fuse checksum 0BF4 はファイルに格納されたチェックサム(C0BF4* の行)で、プログラマにも同じ値が表示されます。Fuse map checked against the equations: OK は、jABEL が 今書き出したヒューズだけから GAL16V8 のモデルを組み立て、あらゆる入力の組み合わせで動かして、式と照合したという意味です。 Test vectors: 4 run, 0 failed は、4 つの期待値がそのシミュレーション上のチップでも成り立ったことを示します。

歴史との答え合わせ:この小さな AND ゲートは、EZ-ABEL 4.32 に付属していた最初のサンプル ERSTES.ABL("erstes" はドイツ語で「最初の」)と同じ設計です。jABEL が出力する JEDEC ファイルは、EZ-ABEL が 1998 年に書き出したものとヒューズ 1 本単位まで一致します。ヒューズマップもチェックサム C0BF4 も同じです。

「ロジックアナライザ」で見る

Timing Diagram を押すと、テストベクタが波形として再生されます。卓上ロジックアナライザのような黒地に白の表示です。入力は指定したとおりの値、出力はシミュレーション上のチップが実際に出した値です。出力がベクタと食い違うと赤で表示されます。

demo のタイミング図:4 ベクタにわたる a、b、y
y が High になるのは a と b が両方 1 になるベクタ 4 だけ。仕様どおりです

わざと間違えてみてください。最後のベクタの期待値を [0] に変えて Create Output をもう一度押すと、レポートと波形の両方がそれを指摘します。間違いを教えてくれるツールは、いつも「完了」としか言わないツールより価値があります。

3 つのフォルダと 3 つのボタン

jABEL は作業内容をプログラムの隣にある 3 つのフォルダに分けて保存するので、完成品と試作品が混ざることはありません。

2 つ目の設計:クロックのある回路

入門ガイドは続いて、イネーブル、同期クリア、トライステート出力付きの 2 ビットカウンタに進みます。ここでレジスタ、セット、WHEN が登場します。

  Q = [q1, q0];               " セット:2 本のピンを 1 つの数値として扱う

equations
  Q.clk = clk;                " ピン 1 のクロックで動くレジスタ
  Q.oe  = !oe;                " ピン 11 が Low の間だけ出力オン

  when clr then Q := 0;
  else when en then Q := Q.fb + 1;
  else Q := Q.fb;

  carry = q1 & q0 & en;

:= は「次のクロックエッジで」、テストベクタ中の .c. は「クロックを 1 パルス入れる」という意味です。タイミング表示ではクロックがエッジの矢印付きで描かれ、セットは 16 進のバスとして表示されます。カーソルをドラッグすれば各時点の値を読み取れます。

2 ビットカウンタのタイミング図:クロック、0 1 2 3 0 と数える Q バス、carry
0→1→2→(保持)→3→0 とカウントし、3 で carry が High、OE を解除すると出力はハイインピーダンス(破線)に

チップはどれくらい埋まっている?

GAL は小さいので、最後には必ず「まだ収まるか?」が気になります。Usage タブがその答えです。出力セル、積項、入力ピンの使用数と空き、出力ピンごとに積項をどれだけ使ったかを示すバー、そして同じ設計が他の 2 デバイスにも収まるかどうかが表示されます。

カウンタの Usage タブ:出力 8 中 3、積項 63 中 6
カウンタが使う積項は 63 中 6。まだ十分な余裕があります

ヒューズを信頼できる理由

JEDEC ファイルは数千個の 1 と 0 の並びです。目で確認する人はいませんし、プログラマが確認するのはチップがファイルどおりの内容を保持しているかどうかだけです。そこで jABEL は毎回自分自身を検証し、リリース前には独立したツールとも照合しました。

ヘルプを内蔵

Info メニューには 2 つのガイドがあります。数十種類の旧式 PAL を扱った昔のマニュアルの写しではなく、この 3 デバイスのために書き下ろしたものです。Writing Your First ABEL Programme(F1)は空のエディタから書き込み済みのチップまでを案内し、ABEL Language Guide は jABEL が受け付ける言語全体を解説します。セットと算術演算、ドット拡張子、レジスタ、ステートマシン、真理値表、各デバイスのピン配置と動作モード、そして古い PAL 設計の移植方法(JK、T、SR フリップフロップを D 式に書き換える方法を含む)まで扱っています。

jABEL の Info メニュー
Info メニュー
jABEL のヘルプウィンドウに表示した入門ガイド
ヘルプウィンドウに表示した入門ガイド

ガイドに載っている完全な作例(デコーダ、リセット/プリセット付き 22V10 シフトレジスタ、信号機のステートマシン、プライオリティエンコーダ、T フリップフロップのカウンタなど)はすべて ABELfiles に収録されており、それぞれのテストベクタに合格しています。

パッケージの内容

正直な制限事項:jABEL が対応するのは意図的に GAL16V8、GAL20V8、GAL22V10 (および ATF16V8B、ATF20V8B、ATF22V10C、PALCE16V8 などの互換品)だけです。レジスタはシリコンと同じく D 型で、JK、T、SR の動作は D 式として記述します(書き方はガイドで説明しています)。また、本来の ABEL-HDL と異なり名前の大文字・小文字を区別しません。Q と q は同じ信号として扱われ、衝突する場合は黙って統合せずにエラーで知らせます。
謝辞:デバイスのヒューズ配置表は、オープンソースのアセンブラ GALasm と Galette のものに従っています。また、テストでは Galette を独立した基準として使用しました。ABEL 言語そのもの、そしてガイドの多くの裏付けは、Data I/O と Xilinx による ABEL-HDL の原典資料、および John Wakerly 著 Digital Design: Principles and Practices に基づいています。

まとめ

jABEL は、今でも役に立つこの小さなチップたちに、モダンで無料の、ウィンドウ 1 つで完結するワークフローを提供します。ABEL を書き、Create Output を押し、正直なレポートを読み、波形を確認し、検証済みの JEDEC ファイルをプログラマに送る。引き出しに GAL が眠っている方、昔の PAL 設計をよみがえらせたい方、あるいは手に取れるチップでプログラマブルロジックを独学したい方にとって、その作業をもう一度楽しいものにしてくれるはずです。

jABEL はご依頼に応じてお送りしています。下のフォームから、作りたいものについて少し教えてください。

#ABEL #ABELHDL #GAL16V8 #GAL20V8 #GAL22V10 #JEDEC #ProgrammableLogic #PLD #DigitalDesign #Java #OpenSourceTools #TL866 #GregoryJDurnan #DurnanOrg #GregDurnanRF #RFEngineering