FPGA 入門 その1
まず、FPGAの研究用にTerasic製のDE0 nanoを共立エレショップにて購入しました。
http://eleshop.jp/shop/g/gBAD121/
9800円と大変お安いです。(digikeyですと7470円+送料だそうです。digikeyで買ったほうが良かった?)
ALTERA CycloneIVが載っていて、22,320 LEだそうです。1000LE程度で32bit RISCコアが作れますから22個もCPUコアが載りますね。
USB Blasterを基板上に搭載しているようで、USBケーブルでつなぐだけでプログラムを転送することが出来るようです。
「FPGAボードで学ぶ組み込みシステム開発入門 Altera編」(asin:4774148393)は、あちこちでお勧めされているようなので買いました。
DE0についても書かれているのでDE0 nanoを買って勉強しようという人は、まずはこの本を買うべきだと思います。
第1回 関西FPGA・DE0勉強会(2012/5/19)やってみた
http://d.hatena.ne.jp/ksksue/20120520/1337533844
発表スライドへのリンクなどがあり、勉強になります。DE0 nanoを入門機として買うのは良い選択だったようです。
以下、DE0 nanoで本書に従って学習したときに気づいたことをメモしておきます。
・本書のQuartus IIはv11.0ですが、現在はv12.0sp2らしく、インストールするときにNios IIをインストールするかしないかなどの選択ダイアログは出ませんでした。
・DE0用の説明になっているのでDE0 nanoの場合、FPGAとしてCyclone IV EP4CE22F17C6を選択する必要があります。
・DE0 nano付属のUSBケーブルはぜんまいによる巻き取り式になっているのですが、速攻ネジが破損して巻き取る本体がばらけてぜんまいが飛び出したので本体部分捨てました。
・DE0 nanoには7セグメントがないので本書の手順で進めても動作テストができません。
・LEDが8個ついているのでこれを代わりに使って試します。
・DE0 nanoの付属のCD-ROMのうち、Quartusが入っているほうのCD-ROMはAlteraのサイトから最新版がダウンロードできるのでこのCD-ROM自体が不要。
・USB Blasterのドライバーは、Quartusのインストールフォルダのdriver/ フォルダ配下にある。ゆえにCD-ROMは不要。
・DE0 nano本体を付属のUSBケーブルでPCに接続すると(USB Blasterのドライバーをインストールする前の段階で)LEDライトがゆっくりと点滅する。
デモ用に出荷時にそういうプログラムが書かれているようです。
・DE0 nano付属のQuartusの入っていないほうのCD-ROMはいろいろ入っていて面白い。
Usermanual\DE0_Nano_User_Manual_v1.7.pdf
→ ユーザーマニュアル(英語)
Schematic\de0-nano-c4-rev-c(release_cd_rom)
→ 回路図
Tools\DE0_Nano_ControlPanel
→ LEDの個別のON/OFFテスト、ボタン型スイッチのON/OFFの検出、ディップスイッチのON/OFF状態の検出、メモリ(SDRAM等)の読み書き
などのテストができる。
Tools\DE0_Nano_SystemBuilder
→ 他のTerasic製のadd-onボードなどを載せたときにこれで設定するようです。よくわかりません。
あと、このボードのpin assignファイルは、
Demonstration\DE0_NANO_default\DE0_NANO.qsf
を使うと良いようです。DE0用のものは本書の著者がいじったものが技術評論社のサイトのほうからダウンロードできるようなのだが( http://gihyo.jp/book/2011/978-4-7741-4839-7/support )、DE0 nanoのものはないのでそのまま使います。
・Verilogについては本書では解説が10ページほどしかないです。簡単に文法が載っているだけです。インターネットで検索すればいくらでも情報は出てくるので別の本を買うつもりはいまのところありません。
・DE0 nanoには7segが搭載されていませんので、本書の3章までのサンプルはそのままでは動きません。適当に読み替えて動作確認をします。
・自分でmoduleを書いてQuartusでコンパイルしたときに
Error: Top-level design entity "xxxxx" is undefined.
と表示されました。変数xxxxxはreg宣言していたのですが、この変数が使えないのかと思ったのですが、そうではなかったです。プロジェクト名とmodule名が一致していない場合、このmodule名をtop-level desingとして指定する必要があるようです。Assignments→Settingのところから設定しました。
・自分でmoduleを書いてコンパイルしたとき
Verilog HDL Procedural Assignment error at counter.v(17): object "LED" on left-hand side of assignment must have a variable data type
・20LEぐらいの簡単なプログラムでもコンパイルに20秒ぐらいかかります。HDDからガリガリ聞こえてくるのでSSDならば半分ぐらいの時間で済むのかも知れません。それにしても遅いですね。
・サンプル書いてみました。KEY1を押すと1秒ごとにLEDが2進数的に1ずつ加算され、KEY2を押すとLEDに表示されている2進数的な値が0にリセットされます。
module UPCOUNTER(
input CLOCK_50,
input [1:0] KEY,
// KEY[0] == RESET ,
// KEY[1] == increment
output reg [7:0] LED
);
reg [7:0] counter;
reg [25:0] time_counter;
always @( posedge CLOCK_50 ) begin
if ( ~ KEY[0] ) // reset
counter <= 8'h0;
else if ( EN1HZ ) // increment
time_counter <= 26'b0;
else
time_counter <= time_counter + 1'b1;
if (EN1HZ && ~ KEY[1])
counter <= counter + 8'h1;
LED <= counter;
end
assign EN1HZ = (time_counter == 26'd49999999); // 50MHzを分周して1Hzに
endmodule
以上で本書は終わり。
残りの課題としては…
課題1) verilogのプログラム、もう少し自分で書いてみて勉強する。
課題2) 小さなCPUを自分で設計してみる
課題3) SDRAMコントローラーを設計してみる
課題4) Nios IIの導入
という感じ。