短期間でHDLを学習する

 導入課題では、乗算器の設計を通して組み合わせ回路を、FIFOの設計を通して順序回路をそれぞれ学び、最後にステートマシンの設計を経て、短期間でHDLのコーディングスタイルを身に付けます。

 「乗算器の設計」では、Wallace Treeを用い、FA(全加算器)とHA(半加算器)だけを組み合わせて、8bit×8bit=16bitの乗算器を作ります。この課題ではただひたすら組み合わせ回路を書いていくだけなので、特に頭を使う部分はありませんが、verilogの文法に則って回路を記述する練習になります。

 次は「FIFOの設計」に移ります。FIFOはFirst In, First Outの略で、先入れ先出しのデータ構造(つまりキュー)です。この課題では、キューのデータ構造を実現するレジスターと制御用フラグの論理をHDLで記述することになります。先に述べた順序回路で作っていくことになるので、僕を含め多くの人がここで苦戦しました。

 最後に、「ステートマシンの設計」です。作成した乗算器モジュールとFIFOモジュールを組み合わせて、ステートマシンを用いてそれらに送る制御信号を作成することで、FIFOに入れた2つの8bit数を乗算して違うFIFOに格納し出力する回路として完成させます。

一番の山は「FIFOの設計」

 僕にとっても、また他の多くの学生にとっても、導入課題の一番の山は「FIFOの設計」でした。順序回路を用いるため、入門者にとっては非常に複雑な設計をする必要があるのです。

 FIFOでは、書き込み信号、読み込み信号、それぞれのVALID(データが正しいことを示す1bitの信号)、FIFOの残数カウンター、FIFOのアンダーフローやオーバーフローを示すFIFO_UNDERやFIFO_OVERなど、たくさんの信号線がそれぞれ関わりあいながら1クロックごとに変化します。このような複雑な状態遷移を頭の中で考えるのは非常に難しいことです。従って、順序回路の項で示したようなタイミングチャートを書き、それぞれの信号がどのような振る舞いをすべきなのかを把握した上で、その振る舞いをさせるにはどのような回路(構造)にすればよいかを考えていく必要があります。

 回路をHDLで記述したら、今度はシミュレーションツールを使い、実際に思った通りの振る舞いをしているかどうか、タイミングチャートを見ながらチェックしていきます。「FIFOの設計」では、このシミュレーションツールでの結果と自分の書いたコード、そしてお手本となるタイミングチャートを見比べて、うまく動いていないところを洗い出し、書き直していきます。しかし、シミュレーションツールも使い始めで、ディスプレイ1面に示されたそれぞれの信号線のグラフから必要な情報を見付けるのは、慣れないうちは大変な作業でした。

ステートマシンはHDLの基本的なデザインパターン

 「FIFOの設計」で無事動くFIFOが組めたら、次は最初に組んだ乗算回路と接続し、最終的に8回乗算を行う回路を作ります。この回路では、(1)8bit+8bit=16bitのデータを8つFIFO_Aに受け、(2)FIFO_Aがいっぱいになったら1つずつ乗算回路に流し込みながら計算結果をFIFO_Bに格納し、(3)FIFO_Bから計算結果を順番に出力する、という動作をする必要があります。ここで「ステートマシン」を設計する必要が出てきます。

 ステートマシンとは、入力と現在の状態によって次の状態が決まる順序回路の一種です。現在の回路が、先に記した(1)~(3)のどの状態なのかを把握し、それに従ってそれぞれのモジュールを制御することがこの課題でのステートマシンの役目です。

 ステートマシンを作成する場合、まず必要な状態のピックアップを行い、状態遷移図(もしくは状態遷移表)を作ってすべての場合における遷移条件を把握した後、それを順序回路としてHDLで記述します。ステートマシンはHDLを書く上での基本的なデザインパターンの1つで、これを学習して取りあえず導入課題は終了になります。