VHDL入門
基板設計の仕事をしたり、転職しているうちに論理回路から遠ざかって、私はVHDLへの取り組み
が遅くなった。次世代の言語が話題にのぼっているのに、いまさらながらのVHDL入門である。
デザインウェーブなどの雑誌を見ていて、あせりを感じていた。みんなとっても難しそうな事をしてい
る。西村芳一さんは、神のようだ。
はっきり言って、基本的なツールが変わる事にはとまどいを感じる。ずっとクラゲを並べて回路図を描いて
いたのに、言語でやる事になるとは・・・。新しい事を覚えるには時間を要する。だが、生産性が上がる
のなら、乗り換える価値はじゅうぶんにあると決心した。(さっさと乗り換えればいいのに、ちょっと頭が
カタイかもね)
HDLのメリットは、機能が記述できることである。RTLでも記述できるが、それじゃ回路図と本質的には
変わらない。表現の違いだけだ。HDLのそのメリットを活かしてこそ、使う意味がある。
ソフトウェアでいえば、アセンブラと高級言語のCとの違いに似たものがあるかもしれない。
●むかしばなし
最初の会社にいた頃は、主にGALを使っていて、ツールはDOS版のABELだった。フロッピー1枚
あれば、DOS、テキストエディタ、ABELを入れて、どこでも作業ができた。ABELが吐き出したJED
ファイルを、たしかデータI/O社の2900という書き込み機に転送して、GALを焼いていた。
ABELには、テキストエディタで論理式を書いて、食わせていた。論理式は回路図と1対1で、私は
上司から渡された回路図を論理式に変換して入力する作業をしていた。回路図は膨大な量になる
こともあって、たとえば70個ほどのGALをひとつの巨大な基板に載せたりした。
論理式の例:
!RAMCS = A15;
!ROMCS = !A15 & !A14;
!というのは負論理を意味している。つまりアドレスのビット15がHならRAMCSがLになるので
RAMがチップセレクトされる。すなわちRAMは、8000H〜FFFFHに配置される。同様に、ROMは
アドレスのビット15がLで14がLだから、0000H〜3FFFHに配置される。この範囲のアドレスを
アクセスした時にのみROMがチップセレクトされるわけだ。
ありがちなZ80システムでは、もっとおおざっぱに、A15がLかHかでROMとRAMの空間を分けて
いるから、NOTゲート1個でじゅうぶんだが、ここでは、あくまでも説明のためと理解頂きたい。
当時は、まだ駆け出しで、とにかく勉強をしていた。列車通勤をしていたので、毎日1冊以上は
本を読む事にしていた。よく読んだのは小林芳直さんの「PLDの論理回路設計法」と「ASICの論理
回路設計法」である。買ったのは学生時代で、カネがなかったから、1冊二千円ぐらいの本を買うのも
一大決心だった。献血で図書券をもらい、「定本ディジタル・システムの設計」という本を買った事も
ある。
自分で使う機会はなかったが、XILINXのCPLDというかFPGAを使っている人もいた。回路図CADの
FutureNetだったか忘れたが、とにかく回路図を入力して、XACT(たぶん)にかけていた。コンパイル
には結構時間がかかっていたと思う。当時は、まだ486DX4−100MHzのマシンが主流だった。
Pentiumマシンは数台しかなく、奪い合いになっていた。私のようなピヨピヨの若造が使っていると、
先輩から「ナマイキだ、どけどけ」と言われたものである(笑)。
●VHDLへ
「ひみつ3」では、MAX7128の2個分満タンの論理を、回路図で何十ページも入力していた。プータロー
でヒマだったからできたと思う。
いまは公私ともに複数のプロジェクトを抱えて、他に勉強しなければならない事もあるし、時間がない。
この状況でいかに時間を作るか。設計よりも何よりも、時間を作る事がもっとも重要な最優先のテーマ
と言えよう。
論理回路をパズル感覚で、紙の上で、ああでもない、こうでもないと、色々いじくるのは面白いが
最終的に物ができなければしょうがない。しかも速くできなければ意味がない。VHDLを活用して、
細かい部分に気を取られずに、大規模なシステムを効率的に構築できればと思う。
VHDLを意識し始めたのは、意外にも数年前である。トラ技を毎月とっていたし、そういう言語がある
のは知っていた。言語といっても、パルテノンとか、Verilog−HDLとか、AHDL(アルテラ独自)とか、
いろいろあってどれを覚えたらいいのかわからなかった。この先、すぐになくなってしまうようなものを
覚えても脳の記憶容量の無駄だと思って、どれを選んだらいいのか迷い、第一歩が踏み出せなかった。
確かCQ出版のデザインウェーブという雑誌が創刊されて、一時、定期購読していた。えらく高い雑誌
だった。その後しばらくして、やっぱり高いと思って購読をやめたのだが、ここ数年前から再び購読してい
る。興味深い内容が多くてためになると思っている(あくまでも私の感想です・・・って、まるでテレビの
通販番組みたいだな・・・)。
まあ、意識していたのは確かで、いずれ必要になるかもしれんと、
・A VHDL Primer VHDL言語入門
Jayaram Bhasker著/CQ出版社/¥3,200/ISBN4-7898-3286-4
が最初に買った本か。
すぐ必要でもないのに、こんなに高い本を買うのは少々抵抗があった。しかも内容を見ても
サッパリわからなかった。数ページで眠くなっていた。
その後も、目についた本はとにかく手に入れていた。地方だから、こういう専門書はどこにでも売って
いないし、すぐ買っておかないとあとで手に入らない。ネット通販を利用せざるを得ないときもあった。
わざわざ空港から長崎市内への直行バスを利用して、紀伊国屋書店まで、往復で本が買えるぐらい
交通費を払って通っている。
そのへんに転がっている本だけでも、次のようなものがある(感想は、あくまでも個人的なものであり
その本の絶対的な評価ではありません)。
・VHDLによるマイクロプロセッサ設計入門
仲野巧著/CQ出版社/¥3,200/ISBN4-7898-3363-1
→ 高校生の頃から、独自のCPUを作ってみたいと思っていたので、胸がキュンとするような
タイトルであった(笑)。
プロセッサを作るという目標があって、それに向かって何が必要か、どうしたらいいかを
書いてあるようだ。すなわち、実際的でわかりやすいと思う。
ただ、マイクロプログラムをROMで実現しているのはひとつの方便ではあるが、個人的には
邪道だと思う。ラクをしていると思う。ワイヤードロジックで地獄を見なさい(笑)。
・VHDLによるハードウェア設計入門
長谷川裕恭著/CQ出版社/¥2,233/ISBN4-7898-3287-2
→ この本も、「A VHDL Primer VHDL言語入門」と同じ頃に出版されたようだが、私が買った
のは最近だった。
リファレンス的な使い方になるかな。そのへんにあれば、必要な時に役立つ感じ。
・VHDLによるディジタル回路入門
並木秀明・永井亘道著/技術評論社/¥3,980/ISBN4-7741-1252-6
→ 分厚い本で、目立っていた。しかし教科書ぽくてあまり面白くない。CD−ROMも開封してい
ない。値段も高い。従来の論理回路をVHDLに置き換えただけのような気がする。
通読するには退屈な本だと思う。まるで枕を買ったようだ。
それと、ネットでいろいろ調べたりしたが、さすがに先駆者たちは頭が良い。私などバカアホクソマヌケ
だから、いまごろチンタラチンタラ、取り組み始めたばっかりだ。私が本を読んで理解できなくて迷っている
そのずっと前に、先駆者たちは、ポイントを要領よくまとめてWebに掲載し、いろんなものを作っている。
私は、サンプルのソースファイルを見て勉強させて頂いている。
デザインウェーブを毎号買っているので、もうほかに本を買わなくてよかろうと思っている。
’98年8月号から’99年12月号に連載されていた「VHDLによる大規模ディジタル回路設計入門」は、
すばらしくわかりやすいと思った!最近のお気に入りで、記事をコピーしてファイルにとじて、あちこち
持ち歩いて読んでいるぐらいだ。よく見たら本になっていた。
・HDLによる高性能ディジタル回路設計
森岡澄夫著/CQ出版社/¥2,520/ISBN4-7898-3395-X
デザインウェーブを持っているからあえて買わなくて良かろう。そうでなくても、CQ出版社と、日刊工業
新聞社には貢ぎすぎている。本棚を見ると「CQ出版社」の文字が目立つし、日刊工業新聞社から通販で
一度に数十万円分も本を買い込んだ事もあった。もちろん自腹で。田舎は専門書が売ってなくて悔しいから
反動でドカーンと買い込んだのだ。
そしてデザインウェーブのフロクで、2002年5月号の「初めてでも使えるHDL文法ガイド」は常に手元
に置いている。できれば最初のほうにVHDLがあれば、私は便利だったが・・・。
それで、どの言語を覚えるかだが、やはりひとつに絞るべきであろうと考えた。Verilog−HDLと、VHDL
のどちらかだ。似ているから、どちらかを覚えればもう片方も大丈夫じゃないかと判断した。最終的には、
VHDLに決めた。目標が決まれば動きやすい。
●第一歩
XILINXでいくかALTERAでいくか。迷うところだが、結局、できる事は同じだろうし、どっちかになる
だろうと(そりゃ、どっちかだろう)。
Max+PlusIIなら、回路図入力専門ながら以前から使っていた。だからこれを使う事にした。
XILINXのツールは、状態遷移図でも入力できると聞き、ちょっと魅力を感じたが・・・慣れが勝って
アルテラとなった。
Max+PlusIIは、無料版ではなく、ちゃんと正規に購入したものを使える環境にある。もう6年ぐらい
前だったか、その頃に、製品に使うために購入したのだが、現在は使わなくて眠っていたのを、VHDL
の勉強のために引っ張り出した。
とりあえず、サンプルのソースファイルをいじって、コンパイルを通してみた。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SAMPLE is
port (
A : in std_logic_vector(3 downto 0);
B : in std_logic_vector(3 downto 0);
C : out std_logic_vector(7 downto 0)
);
end;
architecture RTL of SAMPLE is
signal TMPC : std_logic_vector(7 downto 0);
begin
process (A,B)
begin
TMPC <= A*B;
end process;
C <= TMPC;
end RTL;
これは4ビット同士のかけ算をするプログラム、とは言わないが、論理というのも適切な感じ
がしない。論理といえば従来は回路だった。そのイメージが自分の中では強いのだろう。
コンパイル結果のrptファイルを見たら、ちゃんとAND、ORの組み合わせに展開されていた。
その一部:
_EQ031 = A3 & B3 & _LC3_B1 & _LC7_B1
# !A3 & _LC3_B1 & !_LC7_B1
# !B3 & _LC3_B1 & !_LC7_B1
# !A3 & !_LC3_B1 & _LC7_B1
# !B3 & !_LC3_B1 & _LC7_B1
# A3 & B3 & !_LC3_B1 & !_LC7_B1;
ここで重要なのは、私は、あくまでもかけ算を「A*B」としか書かなかった事だ。かけ算をどうやって
実現するか、私は意識しなかったし、指定してもいない。
たぶんコンパイルオプションか何かでデフォルト値があって、それで上記のような展開になっていると
思われるが・・・。シフト方式もありうると思った。
A*Bと記述した時に、どういう回路に展開されるか意識しなかったという点が重要なポイントだ。
意識させないというのがVHDLの高級言語的なところであるし、欠点でもある。たとえばどうだ、
FPGAに回路がギリギリ入るかどうかという瀬戸際で、少しでも節約したい場合はどうなる。使用ゲート
数の少ない方式を選ぶだろう。あるいは、ゲートはたくさん使っていいからスピードを上げたい場合も
ある。
かけ算の実現方法は、シフト方式か、並列方式が一般的だ。それぞれ長所、短所があり、シフト
方式はZ80のアセンブラでもやったが、やはりハードウェアでも時間がかかる。8ビットなら8ビットの
クロック時間を要する。
いっぽう、並列方式は、いっぺんに各ビットをANDして、足し合わせているのでシフト方式に比べたら
格段に速い。ゲートの遅延のみに依存している。但し、4ビット程度では気にならないが、ビット数が
増えるとゲートを大量に必要とするのが短所だ。
4ビット同士なら256バイトのROMがあれば良いが、8ビット同士ならどうか。かけ算の答えは、8
ビット同士のかけ算なら16ビット幅になる(FFH×FFH=FE01H)。
ROMで実現したら入力アドレスが8ビット×2で、16ビットになる。すなわち64KバイトのROMが
必要だ。8ビット同士のかけ算のためにそこまでリソースを使えるかどうか?
←「あたり前田のクラッカー」を食うMAD(前田)氏
まあ、とりあえず第一歩を踏み出したわけです。いつまでも本ばかり読んでいてもつまんないし、
先に進めません。エラーがゾロゾロ出てきてもいいから、とにかくパソコンに向かってソースを打ち込み
コンパイルしてみる事ですな。
セミコロンが1個余計だった!!とか。
●