VHDLのおはなし

VHDL本を書店で見かけるようになったのは90年代中頃だったろうか? 辞書のように分厚くて、それだけで読む気が失せる高価なアンチョコ、というのが第一印象で「業務用LSI 設計の技術書は僕には関係ないな、、」と勝手に思い込んでいた。 本を手にとることも無く、しばらくの間忘れ去っていたVHDLに本気で取り組むことになったきっかけは AudioHologram (注1)専用フットスイッチボックスの製作を思いついたことに始まる。

このスイッチング・システムは、2002年初めには既に頭の中にあった具体案を、アメリカ滞在中にとりあえず形にした後、帰国後1年弱の時間をかけて完成させたものだ。当初は、簡単な電子スイッチの集合体だったモノが1年後にはワイヤーラッピングとユニバーサル基盤で組み上げた試作回路と成長し、複雑な電子回路を構成していた。しかし、試作品の悲しさか、、、移動やデバッグによるワイヤー の「ヤレ」が災いしたのか、1年も経たないうちに回路の挙動が不安定になってしまった。そこで、一念発起して回路を刷新、強度と再現性を持たせるために基盤をPCBに置き換え、未完成だったロジックコントローラー部分を設計しなおす事にした。決意間もなく、使い易くて安定したEagleというPCBデザインツールとの出会いを経て、ライブ演奏からのフィードバッ クで得た改良点を取り入れたロジック回路の設計を開始するが、作業を進めるにつれて様々な問題に悩まされることとなってしまった。

最初の躓きは、時代に取り残されていることを自覚していない、不勉強がキッカケとなる。錆び付いた回路製作スキルを復活させるため、参考用に汎用ロジック・デバイスの仕様書を本屋で探してみたが、どうしてもめぼしい獲物を見つけることが出来ない。仕方なく、手元にある参考書をネタに汎用デジタルICを使って「フリップフロップ」を使った回路を設計してみたが、要求される仕様を満たすためにはロジックボードが予想外に大掛かりな構成となってしまうことが発覚。このままでは筐体内部への格納が怪しくなってきた。

何かよい方法はないかと記憶を手繰っていたところ、数ヶ月前、日経Webの記事にCPLDというデバイスが採りあげられていたことを思い出す。その元記事を手繰って、デバイスメーカーのサイトに行きつき、CPLDについての説明を読んでみると、実体は懐かしのPLA(プログラマブル・ロジック・アレイ)に近いデバイスだという印象を受ける。 しかも、フューズ切断用のライターは必要なく、何度でも書き直せるという。配線の記憶はフラッシュロムで行われるため、保守も簡単。しかも1000回以上の書き込みが可能らしい。そのうえ、データを書き込む為のアプリケーションはデバイスのメーカーが無償で提供してくれているので、ダウンロードする手間さえ厭わなければ、金をかけることなく回路を設計することが出来そうだ。(ただし、150Mbも容量があるためDLには一苦労する。書き込みにはパラレルポートのあるパソコンが必須) 苦労してDLを行った後、アプリケーションをインストールして、実際に回路の設計を始めてみた。 当初は論理記号エディターで、回路を設計するつもりだったが、程なく中規模以上のシステムを組む場合に、シンボルを使って設計してしまうと、トータルの図面面積が広大となり、編集するだけでも大変手間がかかってしまうことが発覚した。これでは何時まで経っても埒があかないのは明白で、何かヒントを得られないか?と本屋を物色していたところ、見つけたのがVHDLに関するトラ技の別冊の入門書であった。(初歩のHDL設計学習帳・ISBN-7898-3740-8) ようやく、長いイントロダクションの終わりである

VHDLとはテキストによるハードウエア記述言語で、これによってデバイスを設計するこ とが出来るという。早速、入門編と応用編の二冊を買い込んで、仕事の合間に読むことにした。それによると、複雑な回路構成もテキストで記述することで、シンボル表記に頼った設計よりもシンプルな環境で開発を行える、とあった。プログラミングが大嫌いな僕には、この説は眉唾物だったが、
かといってスパゲッティー状態のロジック記号で回路設計を貫徹する気にもなれない。半失業状態でヒマはいっぱいあるので、モノは試しだ。勉強のために、簡単なコードを書いてみることにした。(この手の 言語には他にVelilog-HDLというのも存在するが、その説明は割愛)

まず、VHDLの記述を行う前に全体の回路仕様を決定する。最初は、16ポートあるスイ ッチの1回路分を設計すればよいので、作業は比較的シンプルだ。オルタネイトに動作するプリセット可能なスイッチ機構をロジック記号で構成していく。慣れない作業(知識が錆付いている)のため、思ったより試行錯誤を必要としたが、こんな場合は 「らくがき帳」を作ってアイデアを殴り書きをするのがお勧めだ。鉛筆で殴り書きすることは、発想転換のための最短距離だったことは間違いない。苦労して回路の仕様を決定した後は、いよいよVHDLを記述していく。 その前に、使用するデバイスと互換性のある開発用アプリケーションをPCにインストールする必要がある。僕の場合はXilinxの製品を使う予定なので、WebPackというアプリケーションをWebから Down Load した。ただ、これが大きな容量のファイルなので、通信環境に恵まれない人はCDを送 ってもらった方がよいと思う。他の有名どころとしてはAlteraという会社あるので、どちらか好きな方を選べばよいだろう。(Alteraのアプリのほうが賢いという説もあり。ただし、取り扱いは難しそうだ)

インストール後には、デスクトップに機能別にショートカットが現れる。 「WebPACK」を起動すると、ブラウザのようなものが立ち上がるので、最初にFile メニ ューから NewProject を作成する。作成時に使用環境を聞いてくるので、Project Property で Device family, Device, Device Flow を選択する。Device Flow とは使用言語の仕様のことで、僕の場合はVHDLを選択した。次に Project メニューから New Surce を作成、ソースは VHDL Module とする。ここでは、回路図による設計も選択できるが、今回は敢えてVHDLに挑戦することにした。(実は最初はSchematicで設計しようとしたのだが、 あまりの煩雑さに断念してしまった) ソースの名前を書き込めば新しいファイルが作成される。 初心者のため、VHDLに関して自信を持って詳しく書けないのが申し訳ないが、開発の経過を参考に簡単な例を挙げていくことにする。

まず、プログラムの先頭に、どのような回路を記述するのか見出しを書く。 テキスト部分はハイフン -- で表す。
-------------------------------------------------
-- set CK ff ---------------------------------
-------------------------------------------------

そのあとにライブラリ使用宣言を書いて、設計をスタートする。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

いろいろと仕様があるようだが、簡単な回路の場合は殆どこれでオッケーだ。 そして本文記述となるが、まずはモジュール名(「パーツ」の名前)を宣言し、その後、エン ティティー部で入出力ポートを定義する。この例の場合は、mux4 がパーツの名前で、 swBus,out0,out1out2out3 が端子の名前、in std_logic_vector (3 downto 0) , out std_logicが端子の属性となる。 

entity mux4 is

Port ( d16: in std_logic_vector (15 downto 0);
swBus: in std_logic_vector (3 downto 0);
out0: out std_logic;
out1: out std_logic;
out2: out std_logic;
out3: out std_logic);

end mux4;

そして、アーキテクチャー部で回路の構成を記述していく。アーキテクチャー部ではここでは例示していないが、when〜else 文と with〜select 文を使うことができる。これらはデータセレクタとして機能する。

architecture RTL of mux4 is

begin

out3 <= ((d16(15) or d16(14) or d16(13) or d16(12)) or (swBus(0) and (d16(3) or d16(2) or d16(1) or d16(0))) or (swBus(1) and (d16(7) or d16(6) or d16(5) or d16(4))) or (swBus(2) and (d16(11) or d16(10) or d16(9) or d16(8))));

out2 <= ((d16(11) or d16(10) or d16(9) or d16(8)) or (swBus(0) and (d16(3) or d16(2) or d16(1) or d16(0))) or (swBus(1) and (d16(7) or d16(6) or d16(5) or d16(4))) or (swBus(3) and (d16(15) or d16(14) or d16(13) or d16(12))));

out1 <= ((d16(7) or d16(6) or d16(5) or d16(4)) or (swBus(0) and (d16(3) or d16(2) or d16(1) or d16(0))) or (swBus(2) and (d16(11) or d16(10) or d16(9) or d16(8))) or (swBus(3) and (d16(15) or d16(14) or d16(13) or d16(12))));

out0 <= ((d16(3) or d16(2) or d16(1) or d16(0)) or (swBus(1) and (d16(7) or d16(6) or d16(5) or d16(4))) or (swBus(2) and (d16(11) or d16(10) or d16(9) or d16(8))) or (swBus(3) and (d16(15) or d16(14) or d16(13) or d16(12))));

end RTL;

この回路はスイッチ16ch分の入力を4組のグループに分割し、それぞれのパートに直接接続される4本の入力と、他の3組*4の入力がイネーブル用のコントロールswBusを介 して相互接続されている。(わかるかな?) 内容は後発優先ためのリセット回路で、プログラムチェン ジ信号を扱う為のスイッチ表示形態を決定する。プログラムチェンジとコントロール・チェンジが混在する設定の場合を考えて、4グループに分けたリセット回路を作っているわけだ。 アーキテクチャー部の中の process から end process; で括られた部分をプロセス文という。プロセス文の中では if〜then〜else 文を使うことができる。process(rstd,d,Q) の括弧内はセンシティビティーリストと呼ばれ、状態変化を検知する箇所を設定する 。rstd,d の両端子は入力となる。動作を追っていくと、rstd が "H" の時に、Q は "L"に なり、それ以外の場合(rstd = "L")の場合で尚且つ、d が"H"に立ち上がるエッジで Q のデータが 反転される。コードの中で、'event というのがエッジのディテクタである。 ここの例ではT-FF (スイッチ・コントロール回路の一部)になる。

-- --The section of T-FF --  
process(rstd,d,Q)   
begin    
if rstd = '1' then Q <= '0';
elsif (d'event and (d = '1')) then  Q <= not Q;   
end if;  
end process;

例示したように,プログラム内には and, not という論理演算子も使用することができる。

このように、VHDLではコンポーネント化されたパーツを組み合わせて並列に取り扱えるので、シンボルを扱うロジック図よりも整理された概念で開発を行える。 VHDLの記述を完了後に文法のチェックを行う。混乱を避けるためには、各コンポーネントを個別に検査することをお勧めする。必要があれば、あとで紹介するシミュレーター で動作チェックを行えばよいだろう。

各パーツの動作を個別に確認した後、コンポーネントを入れ子状態にし てシステムを作り上げていく。 部分的な動作確認は tbw file を作成して行う。tbw file とは、Project メニューから New Source を選択して作成するシミュレーター用のロジック波形ファイルだ。ファイルのアイコンを クリックすると、テストベンチ波形を作成するウインドウが現れる。各入力端子用に 入力信号を書き込み、保存する。tbw ファイル選択時に Process for Current source ウインドウに表示される ModelSim Simulator をクリックすると、シミュレーターが起動 され、入力波形に対する出力状態を確認できる。

最後の行程ではファイル全体の Synthesize(合成)を行う。合成時に不具合がある場合はその部分にアラ ート(!)が表示される。 合成後、インプリメンテーションを行う。この場合は予めチップの端子を任意の場所に予約することが出来るので、事前に基板側の配置を決定しておく必要がある。WebPack4の場合はDesign Entry Utility の中の、 User Constrains から Edit Implimentation Constraints を選択し、端子の予約を行う。実際には、Impliment Design を行った後に端子を再配置するのが合理的だ。 端子の配置に無理がある場合はアラートが表示される。ゲートの使用率が高い場合は アラートの出る確率も高くなってしまう。WebPackのヴァージョンによってアラート状況は何故か変化するが、経験から必ずしも新しいヴァージョンのアプリケーションで成功率が上がるわけではないようだ。端子の取り回しに無理があるとインプリメンテーション時のトラブルが頻発するので、注意すること。これを回避するためには端子の配置を変更することが手っ取り早いのだが、チップの動作スピードや、各パラメーターの最適化設定をこまめに行うことで、ある程度は問題を解決できる。

シミュレート完了後、実際にチップにデータを焼き込為む過程で、PCにはパラレルポートが必須となる。僕の場合はs30がメインという変則的なPCユーザー(本来はマック 使い)だったので、パラレルポート増設の必要があった。まず、注意が必要な点は、IBM純正のシリパラ変換ドックはWebpackとは互換性がないということだ。パラレルポート増設のためには専用PCカード(qualtecSPP100)の購入が必須となる。また、使用しているPCのOSによってはアプリケーションの動作が保証されていない場合があるので、こちらも注意が必要だろう。WebPackユーザーの場合、WinMe上ではWebPack4.2(旧型)までしか動作が保証されていない点を考慮しよう。また、Win2k では最新ヴァージョンを使用していてもBIOS設定でUSB周りをいじらなければ動作しなか ったりと、扱いは一筋縄ではいかないようだ。僕もWebで検索をかけて探し回ってよう やく関連情報を見つけたが、動作完了までの敷居は高い。幸い、DesignWaveのム ック本が発売されているので、シリアル増設の手法を参考にすると良いだろう。

さて、いよいよCPLDへのデータ焼きこみプロセスとなるが、初心者で知識も不足しているので最初は大事を見て、ブレッドボードとJTAGポート用変換ケーブルのキットを購入している。 変換ケーブルは複雑な構造ではないので、自作も可能ではあるが、とりあえず間違いのないキットを選択することもアリだろう。 焼きこみ前の最大のハードルは、CPLDの基板への実装だ。簡単な回路の場合はPLCCパッケ ージの製品を選択できるが、端子数が多く、多数のFFが必要な回路の場合、PQFPパ ッケージの製品を購入しなければならない。このチップは表面実装パッケージで端子 間の距離が0.65mmと細かく、シロートが基盤にハンダ付けすることは困難だ。そこで 多少なりとも工程を簡単にするために、PQFP/PGA変換ソケットなるものを入手して使っ ている。これにもいくつかタイプがあるのだが、チップの取り外しが可能な製品は 単価が1万円を超えてしまうので使用不可。ハンダ付けが必要なタイプでも5000円を越えてしまうので 、現状はチップ本体よりソケットのほうが高いというオカシナ状況になっている。今回は経験も無いので安全策をとりつつ、予算を抑える意味でハンダ付けタイプのPGA変換ソ ケットを購入している。ハンダ付けのコツは、、、まず、端子にドバッと一気にハンダを盛 った後、フラックスでハンダを流しつつ吸い取り機で一気に吸い取るという「荒業」 が必要だ。これの手法で大抵はきれいにチップをハンダ付けできる。また、PGAのソケットは品薄で入手困難だが、132ピンのソケットの端子を抜いて代替品としている。ジャンク屋で出物を見つけるのが賢い方法だ。運がよければ相当お金を節約できるので、頑張って探そう。 チップをコネクタに実装できたら、いよいよ焼きこみとなる。焼き込みには専用のボード を作ったほうが安心なので、PGAソケットに必要な配線を施し、(CPLDのアプリケーショ ンノートを参照する)JTAGポート用コネクター(10ピン)を経由してデータを焼き込む。電源は5Vを供給する。作業はDevice Programmingというアプリケーションを (WebPacKと一緒にインストール済み)起動して焼きこむデバイスを選択、実行するだけだ。たまにCPLDを認識できないことがあるが、デバイスドライバーでPCカードが 機能しているかを確認後、不具合を発見できない場合はPCを再起動すること。

結果はちゃんと動いているが、正直言ってドキドキものだった。WebPackとModelSimの相性は良いようで、シミュレート通りの挙動を示しているのが優秀である。最近のシミュレーターは侮れない。 なるほど、近頃汎用ロジックの影が薄いわけだ、と納得した次第だ。

(注1)AudioHologram とは、立体的に構築された音響によるライブパフォーマンスの総称。コアになるシステムは、ライブ演奏をリアルタイムに録音し加工するパートと 音響を複数のスピーカーに配分するパートで構築されている。ソロ演奏が基本のこの作品は、音に定常的な指向性を持たせないことがコンセプト。観客は特定のリスニ ングポイントにこだわる必要はない。演奏中の音響は刻々と変化するので、自分の好みの音が得られる場所を探してください。