$30で始めるFPGA2. BeMicro Max10 FPGA Eva Kit
2
MAX10という安価なFPGA搭載。ちっちゃい。
MiniUSBでPCとつなぐだけ
– USB-Blaster内蔵
USB-BlasterはUSB経由でFPGAにプログラムするためのシステムです。
– USBつなぐと電源もON
ボードとケーブル以外、DVDも説明書も何もついていないという割り切りの良さ
ただし搭載FPGAが10M08なので、回路はあまり入らない
で…
6. 目次的な
6
事前準備
MAX10 FPGAについて
S/WによるLED制御
– Quartus IIを使ってみる
– Qsysを使ってみる
– Nios IIプロセッサを使ってみる
Nios II Software Build Toolsを使ってみる
SignalTap IIで波形を見てみる
H/WによるLED制御
– Lチカモジュールを準備
– IP登録してみる
全部入りサンプルを触ってみる
ModelSimでSimulationしてみる
おまけ
(追記するかも?)Nios IIにオレオレ命令を追加してみる
(追記するかも?)RTOSを入れてみる
8. Quartus IIのダウンロード
8
Quartus II Web Editionの最新版をダウンロードします。
– こちらからどうぞ
http://dl.altera.com/?edition=web
DevicesはMAX10だけでOKです。
– もちろん全部ダウンロードしても可
– 「一式ファイル」タブから全部入りが入手可
現在最新版はV14.115.0です。
アップデートタブをクリックして最新版アップデートも入手しましょう。
– これでV14.1.115.0.2になります。
これだけでOK
ここ
12. FPGAについて
12
www.google.com
www.amazon.co.jp
詳しくはそのうち書くとして…
FPGAとはなんぞや
– Field Programmable Gate Arrayの略です。フィールドでプログラム可能なゲートアレイ、ですね。
– ゲートアレイはNAND素子が敷き詰められたLSIの一種で、そこに配線層を加えてNAND同士を繋げ
るだけで回路が作れる、という代物です。配線層だけ設計すれば良いので、比較的安く作れました。
– FPGAでは、NAND素子の代わりにLEが敷き詰められています。
世代が進むに従って、LE以外のもの(メモリやDSP等)も実装されるようになってきました。
LEとはなんぞや
– Logic Elementの略です。
– 基本的には4bit address入力/1bit data出力の小さなSRAMと、その1bitの出力に接続されるFlip
flop、及び配線で構成されます。
そのSRAMのことをLUT(Look Up Table)と言ったりします。
– 起動時にLUTの中身を書いてやれば、4入力1出力の組み合わせ回路と同等になります。
– これを沢山つなげれば、何でも回路作れそうですよね。実際そうです。
– そのLUTことSRAMの中身を設定するために、FPGAは必ずROM等のメモリとセットで運用されます。
後のページでFPGA構成情報とかConfiguration情報とか出てくるのは、このSRAMに設定するデー
タであり、ROMの中身のことです。
24. Qsysとは
24
Qsysでは主にIPコアを取り扱います。
– 以下IPと略します。
– IPとは、ざっくり言うと各種ベンダまたは個人が提供する有償無償の回路モジュールのことです。
Qsysには以下の機能があります。
– IPを選択し、回路に取り込む
– IP同士やクロックリセット等を配線する
– アドレスマップを作る
– 新規IPを登録する
– RTLを生成する
– テストベンチを生成する
– その他
Qsysは2種類の標準バスに対応しています。
– Qsysで扱うIPは基本的にこの2種類のバスのどちらかをI/Fとして持ちます。
ARM社策定AMBAバス(AXI・APB等)
Altera社策定Avalonバス(Avalon-MM・Avalon-ST)
クロック・リセット系のIPは例外です。
– AMBAとAvalonも自由に接続出来ます。
暗黙的に変換ブリッジが挿入されます。
– 非同期ブリッジの挿入も自動です。
検証用IP(Bus Function Model等、BFMと略す)をQsysで接続して、テスト環境を作ることも出
来ます。
非常に便利なので、是非使いこなして下さい。
古いバージョンのQuartus IIではSOPC Builderというのがついていました。こちらを使っ
ている方も是非この機会にQsysを。
30. On-Chip Flash追加
30
On-Chip Flash IPを追加します。Configuration Modeが「Single Uncompressed
Image」となっていることを確認しましょう。後ほど他のモードも試します。
Initialize flash contentのチェックは忘れずに外しておきます。
56. Quartus II Programmer
56
Quartus IIのメニューでTools>Programmerとクリックし、Programmerを立ち上げ
ます。
– USB-Blasterが認識されているはずです。されていない場合はHardware Setupをクリック
ではAuto Detectをクリックしましょう。
63. Nios II SBTを使ってみる
63
ではNios IIのプログラムを作りましょう。Quartus IIメニューからTools>Nios II
Software Build Toolsで起動します。
– コマンドラインやスタートメニューから起動してもOKです。
正体はご存知eclipseです。Workspaceは変えたければ変えてOKをクリック
75. Nios II SBTで実機デバッグ
75
Target Connectionタブをクリックします。
一応右上のRefresh Connectionsをクリックしておきます。
この時点で右下のDebugボタンがグレーアウトしている場合は、System ID checks
の2つのIgnore mismatched system *にチェックを入れてみましょう。
では右下のDebugをクリックして実行開始しましょう。
96. SignalTap IIとは
96
SignalTap IIはFPGAの内部信号を観測するためのツールです。
– ロジック・アナライザをFPGA内部に当てるようなものです。
– ロジック・アナライザ同様、様々なトリガ条件を設定できます。
取得した波形を見るとSimulation波形に似ていますが、サンプリングのタイミングを
指定されたクロックまたは信号で行う(つまりそのクロック以下の周期の信号は記録
できない)ことに注意してください。
波形データは内部SRAMに格納します。従って、FPGAに応じてサイズに制限がありま
す。
波形取得回路を自動挿入します。従って、パンパンにユーザ回路を入れていると使え
ない可能性があります。
114. LED制御モジュール実装例1
114
サンプルコードを準備して下さい。
SystemVerilog文法を使ったので、
ledctrl.svというファイル名でセー
ブします。場所はどこでもOKです
が、管理しやすいところにしましょ
う。
ここではレジスタ設定用のバスとし
てAvalon Memory-Mapped
Interfaceを使いました。
– Avalonのほうが、Out of orderの
概念が無い等仕様がシンプルで、
開発も格段に楽です。
– 最大性能を発揮させたいならAXIか
もしれません。
Avalonスペック通りの信号名にする
ことで、Qsysが色々自動判定してく
れます。
– 負論理は末尾に_nや_xを付ける、
先頭にnを付ける等色々流派があり
ますが、末尾_xはQsysが判定して
くれないようです。
module ledctrl
(
input wire clk,
input wire reset_n,
input wire read,
input wire write,
input wire [7:0] address,
input wire [3:0] byteenable,
input wire [31:0] writedata,
output wire waitrequest,
output reg readdatavalid,
output reg [31:0] readdata,
output reg [3:0] led
);
// <Register specification>
// adr0: [0]: turn on led[0]
// [1]: turn on led[1]
// [2]: turn on led[2]
// [3]: turn on led[3]
// adr1: [7:0]: brightness of led[0]
// [15:8]: brightness of led[1]
// [23:16]: brightness of led[2]
// [31:24]: brightness of led[3]
サンプルコード (1/3)
115. LED制御モジュール実装例2
115
assign waitrequest = 0;
reg [3:0] r_turnon;
reg [3:0][7:0] r_bright;
reg [3:0][7:0] r_cnt;
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
r_turnon <= 0;
else if (write & (address == 0) & byteenable[0])
r_turnon <= writedata[7:0];
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
r_bright <= 0;
else if (write & (address == 1)) begin
for(int i = 0; i < 4; i++)
if (byteenable[i])
r_bright[i] <= writedata[i*8+:8];
end
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
readdata <= 0;
else if (read) begin
case (address)
0: readdata <= {24'h0, r_turnon};
1: readdata <= r_bright;
default: readdata <= 32'hx;
endcase
end
end
サンプルコード (2/3)
116. LED制御モジュール実装例3
116
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
readdatavalid <= 0;
else
readdatavalid <= read;
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
r_cnt <= 0;
else begin
for(int i = 0; i < 4; i++)
if (r_turnon[i])
r_cnt[i] <= r_cnt[i] + 1;
end
end
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
led <= 'hf;
else begin
for(int i = 0; i < 4; i++)
if (r_turnon[i] & (r_cnt[i] <= r_bright[i]))
led[i] <= 0;
else
led[i] <= 1;
end
end
endmodule // ledctrl
サンプルコード (3/3)
137. 全部入りサンプルを使う
137
FPGA開発はハマるポイントが多いです。
– ハード開発自体の難しさ
– ツール使いこなしの難しさ
– 運が悪いとツールやFPGAのバグに当たることも…
そのため、勝負したいポイント以外は出来るだけ手を抜くことが重要です。
– 何しろ実績のある設計・実績のあるメソッドを選んで使うのが良さそう
適切なサンプルをベースとして使うのは良い方法です。
– 全部入りサンプルは候補としてピッタリです。
ここでは、そのボードで使える機能を出来るだけ多くカバーしたサンプルを全部入りと称しています。
– 他にも色々あるので、Design Storeやrocketboards.org、alterawiki等を探してみましょう。
– 私も普段からそうやってます。
149. ModelSimを試す
149
いきなり実機とか、ホントはダメです。
– SignalTap IIがあるとはいえ、実機でのデバッグは大変です。
本来はまずSimulationでデバッグ・検証を行い、実機に移行するべきです。
– 何ならテストファーストが望ましいかも
とはいえ、仕事じゃないですしそこはバランスということで。
Qsysのテストベンチ生成機能及びNios II SBTを使うと、簡単にNios IIのプログラム
実行のSimulationを行うことが出来ます。
テストベンチ・テストベクタをVerilogで色々作らなくても、Nios IIのプログラムで
様々なテストをすることが出来るので楽です。
– 外部モジュールのテストも、前述のPIO IPとかを上手く使えば。
一方、Top moduleのSimulationはそれなりに敷居が高いです。
– 真面目にやるならSDRAMの動作モデルを探してきたりとか。
– とはいえ、色々支援環境があるので、ゼロからSim環境を作るよりは楽です。
– 自動化が進みすぎて、ASIC開発者が使うと混乱するのが玉にキズ
ということで、せっかくModelSimがタダで使えるんですし、使わない手はありません。
– ModelSimはASIC設計等でも使われる、Mentor Graphics社のSimulatorです。
– Web Edition添付のものは、有料のものより動作速度がかなり遅くなっています。
153. テストベンチ修正
153
nios_systemtestbenchnios_system_tbsimulationnios_system_tb.vがテスト
ベンチのTop moduleです。
中身を確認しましょう。Qsysで作ったnios_systemモジュールやクロックリセット生
成モジュール、SDRAM動作モデル等がインスタンス化されているはずです。
自作モジュールをQsysのモジュールの外に付けたい場合、このファイルを編集するの
が良いでしょう。
面倒なのでリセットは共通にしてしまいましょう。下を参考にテストベンチを修正し
て下さい。sdram_pll_areset_conduit_exportのほうは正論理なので注意。
nios_system nios_system_inst (
.clk_clk (nios_system_inst_clk_bfm_clk_clk),
.led_pio_export (nios_system_inst_led_pio_export),
.reset_reset_n (nios_system_inst_reset_bfm_reset_reset),
.sdram_clkout_clk (),
.sdram_pll_areset_conduit_export (!nios_system_inst_reset_bfm_reset_reset), // modified
.sdram_pll_locked_conduit_export (nios_system_inst_sdram_pll_locked_conduit_export),
.sdram_pll_phasedone_conduit_export (nios_system_inst_sdram_pll_phasedone_conduit_export),
.sdram_wire_addr (nios_system_inst_sdram_wire_addr),
.sdram_wire_ba (nios_system_inst_sdram_wire_ba),
.sdram_wire_cas_n (nios_system_inst_sdram_wire_cas_n),
.sdram_wire_cke (nios_system_inst_sdram_wire_cke),
.sdram_wire_cs_n (nios_system_inst_sdram_wire_cs_n),
.sdram_wire_dq (nios_system_inst_sdram_wire_dq),
.sdram_wire_dqm (nios_system_inst_sdram_wire_dqm),
.sdram_wire_ras_n (nios_system_inst_sdram_wire_ras_n),
.sdram_wire_we_n (nios_system_inst_sdram_wire_we_n)
);
154. テストベンチ修正
154
ちゃんとしたSimulationではSDRAMに初期値なんぞ与えませんが、ここでは設定しま
す。このレベルのSimulationではこれで十分です。
– Nios II SBTが生成するSDRAM初期値ファイルはsdram.datという名称なので、以下のよう
に修正します。
もちろんSDRAMに初期値をロードする部分を作りこんでも可です。
実動作では、Nios II用のROMデータを作る際、ブートコピアと呼ばれるプログラムを
ROMからRAMにコピーするコードが自動挿入されそれが最初に起動しますが、今回の
Simulationのフレームワークではこの動作はテスト出来ません。そのため、SDRAMモ
デルに初期値を与えるという方法を取ります。
altera_sdram_partner_module #(.INIT_FILE("sdram.dat")) sdram_my_partner (
.clk (sdram_my_partner_clk_bfm_clk_clk),
.zs_dq (nios_system_inst_sdram_wire_dq),
.zs_addr (nios_system_inst_sdram_wire_addr),
.zs_ba (nios_system_inst_sdram_wire_ba),
.zs_cas_n (nios_system_inst_sdram_wire_cas_n),
.zs_cke (nios_system_inst_sdram_wire_cke),
.zs_cs_n (nios_system_inst_sdram_wire_cs_n),
.zs_dqm (nios_system_inst_sdram_wire_dqm),
.zs_ras_n (nios_system_inst_sdram_wire_ras_n),
.zs_we_n (nios_system_inst_sdram_wire_we_n)
);
155. Nios II SBTでSim準備
155
Nios II SBTを起動します。私は一応test1_2という名前の新しいProjectを作りました。
Main関数をこんな風に修正します。恐ろしいコードですね。後はいつものビルド。
– SDRAMはアドレス0x800000から始まってます。0x900000あたりは誰も使っていないはず。