はじめに

なぜこのブログを書いたか?

FPGAとは論理仕様をプログラムすることによって、論理回路半導体チップ上に合成してくれるデバイスである。本ブログでは最終的に簡単なCPUを合成することを目的としてFPGA開発を行っていく。本ブログはFPGAを触ったことのない人を対象として図や絵を用いてできるだけわかりやすく書いてみようと思う。ただし、僕は別にFPGAを研究している教授でも、企業の中でFPGAを使っている人でもないため(大学院のとき研究にちょっと使っていた)、間違った情報も多々含まれていると思う。そのため、間違った情報や、分かりにくかった点などは指摘していただけると嬉しい。

何が書いてあるか?

このブログの方針として、あまり理論的なことには触れない。それはとりあえず手を動かしてみてロジックを作ってみるのが面白いと考えたためである(気が向いたらappendixの形で追記するかもしれない)。 最低限ロジックを組むにあたっての要素ごとの振る舞いの説明(何を入れたら何が出てくるのか)はするつもりである。 また、自分の望み通りのロジックを合成するためのテクニカルな書き方、詰まりそうなバグ等も載せていく。 本ブログは後半、Intel社のFPGA(旧Altara社)開発環境を用いて進めていく。Xilinx社のFPGAを使っている人には申し訳ない。 内容自体はどちらのFPGAにも当てはまる抽象的な説明から入る。Xilinx社の開発環境にも同等機能が実装されているので参考にはなると思う。

どのような手順で進めていくか?

本blogではVerilogHDLというハードウェア記述言語を用いてFPGAを開発を行っていく(OpenCL等の高位合成系は使用しない。そちらはweb上にたくさん入門記事がある)。 まず最初に、VerilogHDLと、合成されるロジックの関係を説明する。 その説明を理解してもらった後、実際に複数のサンプルロジックを合成し、入力・出力波形を見て合成できていることを確認する。 実機のFPGAボードがあれば嬉しいが、結構高いので(だいたい安いものでも6000円位する)動作確認は基本的にシミュレータのみを用いて行う。 実機のFPGAを用いた動作確認は最後の最後にちらっと出すかもしれない。

目次

基本ロジック編

  • 論理回路の基礎
  • カウンタを用いたPWM生成器(いわゆるLチカ)
  • カウンタを用いたPWM生成器実機編(ノイズキャンセラ)
  • ステートマシンとは
  • ステートマシンを用いたなにか
  • 他論理要素(FIFO、マルチプレクサ、バレルシフタ)

非同期並列計算編

  • マスタ・スレーブ通信
  • Avalon-MM、Avalon-ST
  • 非同期クロックドメイン間通信
  • DCFIFOの仕組み
  • クロックバイオレーションの評価
  • クレジットベースの通信

簡単なMIPSのCPU制作編

...

他テクニカルなネタ

  • log_2 xのマクロ
  • for文を用いた論理合成
  • モジュールへのネーミング
  • シミュレータの導入方法
  • Intel社の提供する開発環境Quartus導入方法

参考文献

  • FPGAの原理と構成
  • Verilog‐HDLによる論理合成の基礎―合成に向いたコーディングを考える