GWに外出できないので(というか旅に出る以外はインドア派なので)、前から入門してみたいと思っていたFPGAボードを入手して早速遊んでみた。選んだのはIntel (Altera)のDE0-CV。本当は学生のうちに買っておけば学割がきくので、いつか買おうと思っていたのだがコロナ騒ぎと引越でなんかうやむやになって今に至ってしまった。
マルツパーツや千石でも売っていたと思うが、今回はSoliton Wave Shopというところで購入した。20000円(税抜)+送料。マルツが22500円(税抜)、千石が約26000円(税抜)なので、結構安いと思う。Digikeyだと18000円位だが、FedExとかUPSとかで直接届くと受け取りが面倒なのでおとなしく国内代理店を使った。(でも今思うと在宅勤務だから関係ないなぁ、と)
環境構築
付属しているのはよく分からないジャンパー線と電源アダプタ、USBケーブル。とりあえず電源を繋いで左上の赤いボタンをONにすると電源が入って7セグLEDと10個位あるLEDが点滅する。デフォルトでこのプログラムが書き込まれているらしい。
で、実際に開発するにはIntelのFPGAのページから
https://www.intel.co.jp/content/www/jp/ja/software/programmable/quartus-prime/download.html
Quartus Primeというのを入手する。Lite(無償)、Standard(有償)、Pro(有償)の3つがあるが、当然LiteでOK、というか有償のやつは高すぎて買えない。ダウンロードにはユーザー登録が必要なので適宜登録する。一応事業主として登録するみたいだが人数が1名の個人事業主という体で進めれば大丈夫そう。
ダウンロードは色々あるがPCには余裕があるので一括でダウンロードして全部インストールした。多分最低限必要なのは本体とCyclone Vのdevice supportファイルだと思う。
Hello worldプロジェクト
まず書き込みの流れをつかむためにLEDを点灯させる簡単なプロジェクトを作成した。手順としてはQuartusを起動し、Homeタブ上のNew Project Wizardを押す。あるいはFileメニューからNewを押し、新しいプロジェクトを選択しても良いみたい。その後ウィザード形式で進む
- 保存先:見たとおり、保存先のフォルダとプロジェクト名を入れる。フォルダはサブフォルダができるわけではないので自分で格納するフォルダを作っておくと良い
- Project Type: Emptyでok
- Add Files: なしでok
- Faimily, Device, ..: Boardタブを選択し、DE0-CVボードを探す
- EDAなんとか: Simulationだけ設定しておくとよい?

上記の設定で生成するとDE0_CV_golden_topというVerilogファイルなど必要なファイルが自動生成される。勝手に生成されるファイルが長ったらしくてあんまり好みじゃないがピン配置とかを手動で設定するのはだるいのでとりあえずこのまま
デフォルトのコードを全部削除して以下に書き換える。Verilogは不慣れなのであまりきれいじゃないと思うがご容赦を
(あとsyntax highliterがVerilogに対応していない?まぁいいか)
module blinker (
input wire [3:0] KEY,
output wire [9:0] LEDR
);
reg flag;
wire clk;
wire clr;
always @(posedge clk or negedge clr)
begin
if(~clr)
flag=0;
else
flag=~flag;
end
assign clk = KEY[0];
assign clr = KEY[1];
assign LEDR[0] = (flag)?0:1;
assign LEDR[1] = (flag)?1:0;
assign LEDR[2] = (flag)?0:1;
assign LEDR[3] = (flag)?1:0;
assign LEDR[4] = (flag)?0:1;
assign LEDR[5] = (flag)?1:0;
assign LEDR[6] = (flag)?0:1;
assign LEDR[7] = (flag)?1:0;
assign LEDR[8] = (flag)?0:1;
assign LEDR[9] = (flag)?1:0;
endmodule
最初よく分からなかったことは下にまとめた
- Verilogのinput, outputと物理的なピンはどう対応するのか:プロジェクトフォルダに自動生成されている.qsfというファイルがある。ここにset_location_assignmentで始まる行がたくさんあり、ここにピン番号とVerilog上の変数名(?wireとかの名前)が書かれている
- LEDの変数名は?:LEDR[0], [1], [2], …という感じ。qsfファイルを見れば分かる
- 押しボタンの変数名は?: KEY[0], [1], [2], [3]で読み込める。これもqsfファイルを見れば分かる
- C言語でいうmain()みたいなエントリーポイントはどこ?:プロジェクト設定でエントリーポイントになるモジュールを決める。デフォルトだとDE0_CV_gold_topになっているが、その辺のモジュールは消したのでプロジェクトを右クリックしてSettingsを開き、GeneralのTop-level entityにこの場合はblinkerを設定する
準備できたらコンパイルする。Processing→Start compilationを押す。シンプルな割にやたら時間がかかる(1分, 8コア 7820Kにて)。終わると書き込みファイルができるのでToolsのProgrammerを開き、[Hardware setup]から接続してあるUSB Blasterを選び、元のウィンドウでStartを押せば書き込める。書き込みが成功するとボタン操作に反応するはず
タイミングによってはUSB Blasterが見えない事がある。なぜかは知らない。
また、今回試した環境だとUSB接続の順番が良くなかったのかドライバーが自動で当たらなかった。手動でデバイスマネージャーからQuartusのインストールフォルダにあるドライバーファイルを探してインストールすれば大丈夫だった。また、当然ながら電源が入っていないと(赤いボタンON=青LED点灯状態じゃないと)認識しない