Spartan 3AN Starter Kitで、FPGAの第一歩を踏み出すためにLチカをした時のまとめです。

この記事は、Kazoo04 Advent Calendar 2014 – Qiitaの3日目の記事です。
これからFPGAを始める人の参考になれば嬉しいですが、ざっくりした解説、説明になっているので詳しいことはググってください。

FPGAとは

プログラム可能な電子回路を実装できるチップのことです。
製品出荷後に回路の構成を変更することができ、チップを生産するよりも安価のため、最近では流通量がさほど多くない機器によく使われている。PT2やPT3などでも使われています。
電子回路を自由に構成できるので、単純なORとかANDの論理回路を作ったり、パソコンで言うCPUを実装してLinuxとかAndroidなどを動かすこともできます。

FPGAには色んな種類がありそれぞれ内部クロックの周波数が違かったリ、アナログデバイスを扱えたりと性能に差はありますが、基本的に同じです。
今回は、研究室の先輩から借りた「Spartan 3AN Starter Kit」を使ってみます。

Spartan 3AN Starter Kitについて

Spartan 3AN Starter Kitとは、Xilinx社のFPGAであるSpartan 3ANというFPGAを搭載し、開発がしやすいよう様々なインターフェースやクロックを実装したボードの事です。評価ボードとも呼ばれます。

実際にFPGAを製品に用いる場合には、FPGAと電源周りと最低限必要なインターフェースのみを実装します。

Spartan 3AN Starter Kitには以下の様なインタフェースが実装されています。
xilinx-spartan-3an-starter-kit

Spartan 3AN Starter KitにはLED、LCD、RS-232などが実装されていますが、これは単純にピンがFPGAに接続しているだけでRS-232でUART通信をする場合には専用の回路を書かなければなりません。

Spartan 3AN Starter Kitは今では扱っているお店がなさそうですが、同じインタフェースがあれば(作れば)どのFPGAでも動作するはずです。
今回はハードウェアのHello, World!とも言えるLチカ(LEDを一定時間ごとに光らせる)を実装してみたいと思います。

回路の流れ

全体的な回路の流れは以下のようになります。

電子回路では動作のキッカケとなる入力が必要なのですが、ここでは一定時間ごとにHIGHになるクロックを利用します。Spartan 3AN Starter Kitにはあらかじめ50MHzの発振器が実装されています。

  1. 50MHzのクロック信号の立ち上がりを基準に回路を動作させる。
  2. カウントレジスタの値を1増やす。
  3. もしカウントレジスタが50000000回(50M)になったらLEDレジスタの値を反転させる。

回路をコードで書く

Xilinx社のFPGAの開発にはISEとかVivadoというIDEを使います。

ISEでは論理合成をするために、UCFとHDLファイルが必要になります。
UCFファイルは、FPGAに接続するピンとVerilogモジュールで使用するワイヤーを定義します。
HDLファイルでは、ハードウェア回路の動作を記述します。今回はVerilogという言語を用いて開発します。他にもVHDLとかがあります。

Verilogを書く際には、Verilogはハードウェア記述言語であるという点を踏まえて置かなければなりません。Verilogで書いたものはすべて回路になります。例えVerilogの文法があっていたとしても回路上無理な設計はできません。

このことを踏まえてUCFとVerilogを書きます。

UCFファイルでE12ピンに配置されているクロックをCLOCK_50Mとして扱うNET宣言をします。LEDも同様です。

電子回路で値を保持するためには、メモリやフリップフロップ回路を用います。Verilogではregと書くとレジスタ変数を宣言することが出来ます。内部ではフリップフロップ回路が生成されます。また、バス幅を指定することによって指定されたbit分の幅をもったレジスタ変数を宣言することも出来ます。

この回路では、50000000回のカウントを記録する必要がありますが、2の25乗は10進数で33554432、2の26乗は10進数で67108864、のため26bit幅のレジスタ変数を宣言する必要があります。

また、代入に=<=という演算子が使われていますが前者は同期代入で後者は非同期代入となります。説明は割愛します。


RTL(レジスタ転送レベル)設計に落とすと以下の用な設計になります。
Screenshot 2014-12-02 22.21.12

アーキテクチャレベル(メーカーによって異なる)の設計は以下の用な設計になります。
Screenshot 2014-12-02 22.22.19

レジスタを多用したりすると回路数が多くなり、論理合成にも時間がかかるのですがこのような配置をコードを書くだけでやってくれるのはとても便利な時代になったものです。

実行してみる

さて、このコードを実際にSpartan 3AN Starter Kitに焼いてみた結果、以下のように動きます。

ちゃんと1秒おきにチカチカしてるのが分かるかと思います。

おわりに


Chromecastの他にもFPGAでVGA出力とかもまとめる予定です!

サークルはApplestで、場所は3日目火曜日 西地区 く 20aになりますので是非よろしくお願いします!