筑波大学情報学群の実験講座「組み込み技術キャンパスOJT」(以下、COJT)の「ハードウェアコース」(以下、H/Wコース)では、1年間を通してFPGAとH/W記述言語(HDL:Hardware Description Language)による組み込みシステムの開発について学びます。大ざっぱにいえば、春学期は用意された課題(ここでは、学習課題と呼ぶことにします)で基礎を学び、秋学期は学生が自らテーマを決める「自由課題」に取り組みます。

 COJTの醍醐味はやはり自由課題ですが、まずは学習課題で僕たちが取り組んできたことについてお伝えします。

 学習課題は以下の5つで、これらを順番にこなしていくことで徐々に理解が深まるようになっています。

・導入課題
・表示回路
・キャプチャー回路
・描画回路
・サウンド回路

 今回は、導入課題について紹介します。

 COJTに配属された学生がまず取り組むのは、導入課題です。ほとんどの学生はFPGAに触れたことがない状態で入ってくるので、ここでHDLに慣れ、感覚をつかみます。導入課題は4つのセクションに分かれており、学生はそれぞれのセクションで講師にソースコードを提出して、正しく動くかどうかのチェックとアドバイスを受けます。

 HDLコーディングでは、次のように作業を進めます。まず、回路の仕様を決定します。この仕様には、回路がどのような振る舞いをするかというマクロ的な部分から、モジュール内部の信号線(変数)のビット幅(値の範囲)などミクロ的な部分までを含みます。次に、決定した仕様に従って実際にHDLを記述し、コンピューター上で回路動作のシミュレーションをします。シミュレーションのために用いるプログラムも自分で書く必要があり、これをテストベンチと呼びます。最後に専用の設計ツールを用いて,論理合成や配置配線(実機で動かすための準備)を行い、実機(FPGAボード)に書き込み、意図した動作をしているかどうかチェックします。

 ここで、導入課題の説明に入る前に、HDLをよく知らない方の理解を助けるため、HDLを書くという行為について、僕なりの見解を述べたいと思います。

HDLを書くということ

 先に結論からいいますと、「HDLを書く」ことは、「設計をする」ことに他なりません。

 ソフトウエア(以下、S/W)を作るとき、僕たちはコードを書きます。このとき書いているコードは、CPU上で動く「命令の固まり」です。CPUが書かれた命令をたどって遷移を続けるという振る舞いの結果として、S/Wが表現されています。

 ところが、FPGAで動く回路を作るときに僕たちが書くコードは、見た目こそS/W言語なのですが、実際には「回路の構造」です。HDLは、昔であればH/Wエンジニアが手でひたすら書いていた回路論理を、S/W言語の“ような”形態で書けるようにした単なる道具であって、プログラム(命令、処理)をするための言語とは全く種類が違うものなのです。僕も、このことを実感をもって理解したのは本当に最近です。

 そのため、S/W言語で書くのは「命令書」、H/W言語で書くのは「設計書」と考えていただければ、以下の説明が理解しやすいと思います。

 繰り返しになりますが、HDLを書くことは、設計をすることなのです。