【FPGA】Tang Primer 20KでLチカ
Tang Primer 20KというFPGAを手に入れたので、遊んでいきたいと思います!!
最初なので、Lチカを試してみます!
はじめに
Tang Primer 20kとは?
Tang Primer 20K とは、Sipeed社が製造しているFPGAのことです。
スペック
コアボード: DDR3 SODIMM形状
メインチップ: GW2A-LV18PG256C8/I7
拡張ボード: Dock, Lite
サポートするインターフェース: RGB, DVP, マイクアレイ, タッチ, PMODなど
詳細: Tang Primer 20K製品情報
コンパクトでありつつ拡張性に優れているのが、Tang Primer 20Kの魅力です。
購入先
秋月電子で購入しました。
秋月電子: Tang Primer 20K Dock拡張ボードセット
Aliexpressでも販売していますが、値段が秋月と大差ないことを考えると、店舗で購入できるand無事に届く確率が高い、秋月を使用するのが良いのではないかと個人的には思います。
Step1: IDEのインストール
GowinのFPGAチップをプログラムするために、Gowin IDEをインストールします。
※Windowsの場合になります。
1: ファイルのダウンロード
-
Gowinのホームページにアクセスし、ユーザ登録・ログインを行う。
※ダウンロードのためにユーザ登録をする必要があります。 - ダウンロードページにアクセスし、Gowin V1.9.9.03 Education をダウンロードする。
2: インストール
- ダウンロードしたファイルを展開する。
- 展開したファイルにある
Gowin_V1.9.9.03_Education_x64_win.exe
を実行する。 -
Next
>I Agree
>Next
>Install
>Finish
でインストールを進める。
※インストールの際に尋ねられるコンポーネントやドライバーは全てインストールするのが好ましいので、チェックボックスにはチェックを入れておきましょう。 - インストール完了後に、
Gowin_V1.9.9.03_Education
アイコンをダブルクリックし、Gowin EDAの画面が表示されればインストール完了。
Step2: openFPGALoaderのインストール
FPGAに回路情報を書き込むためにopenFPGALoaderをダウンロードします。
Windowsの場合
- ダウンロードページにアクセス
- openFPGALoader-win.zipをダウンロード
- ダウンロードしたファイルを展開
- コマンドプロンプトを起動し、展開したフォルダ下にあるbinファイルに移動
- ファイルの実行
$./openFPGALoader.exe -V
-
openFPGALoader v0.10.0
と表示されれば完了
Linuxの場合
以下のインストールガイドを確認してください。
Step3: EDAでプロジェクト作成
GowinEDAでFPGA回路情報用のプロジェクトを作成します。
- Gowin EDAを起動
-
New Project
のプロジェクトをクリック
- ウィンドウが表示されるので
OK
をクリック
Project Wizardが起動する
4.プロジェクト名の設定
プロジェクト名とファイルを保存する場所へのパスを入力する
- デバイスの設定
Series:GW2A
にし、GA2A-LV18PG256C8/17
を選択する
- Summary画面で内容を確認し、問題なければ
Finish
ボダンをクリック -
General
Target Device
が表示されればプロジェクト作成完了
Step4: 実装
FPGAへの実装を行う
1: 回路情報の記述
-
New File
アイコンをクリック
- 表示されたウインドウから
Verilog File
を選択、OK
をクリック
- ファイル名とファイルの作成場所を入力
- System Verilogファイルが作成される
- HDL(ハードウェア記述言語)でコードを記述
以下は、LEDが0.5秒間隔で点滅するコードです。(クロック信号を基にカウントを行い、0.5秒ごとにIO_voltageの値を反転させる。)
// モジュールの定義
// Clock: 入力, IO_voltage: 出力
module led(
input Clock,
output IO_voltage
);
// カウンタ部分
parameter count_value = 13_499_999; // 0.5秒を計測する
reg [23:0] count_value_reg ; // 24ビットレジスタ、カウント値を保持する
reg count_value_flag; // カウンタが0.5秒に達したときにフラグを立てる
// カウント部分、クロックの立ち上がり: posedge clockごとに動作する
always @(posedge Clock) begin
// count_value_reg <= count_value: フラグ0 ; 5秒に達していない時: フラグ0
if ( count_value_reg <= count_value ) begin
count_value_reg <= count_value_reg + 1'b1;
count_value_flag <= 1'b0 ;
end
// count_value_reg >= count_value: カウンタをクリア、フラグ1 ; 5秒に達したら: フラグ1,カウンタを0に
else begin
count_value_reg <= 23'b0;
count_value_flag <= 1'b1 ;
end
end
// IO部分
reg IO_voltage_reg = 1'b0;
// クロックの立ち上がりごとに値を反転させる
always @(posedge Clock) begin
if ( count_value_flag )
IO_voltage_reg <= ~IO_voltage_reg;
else
IO_voltage_reg <= IO_voltage_reg;
end
// レジスタの値を出力に割り当てる
assign IO_voltage = IO_voltage_reg;
endmodule
2: 論理合成
コードを論理合成する
-
Process
をクリック -
Synthesize
をダブルクリック
- 緑のチェックマークになれば論理合成成功
3: 物理制約
コードで定義したポートとFPGAのピンとの接続に関する制約の設定
-
FloorPlanner
をダブルクリック - ダイアログボックスがポップアップする
-
OK
をクリック
-
FloorPlanner
が起動する
- ピンの設定のために
IO Constranins
をクリック - それぞれのPORTのLocationを以下のように設定する
※TangPrimer20Kの回路図
https://dl.sipeed.com/shareURL/TANG/Primer_20K/02_Schematic -
Ctrl + S
で保存し、FloorPlannerを閉じる - .cstファイルが作成される
4: 配置&配線
FPGAチップ上にリソースを合理的に割り当てる
-
Place&Route
をダブルクリック - 緑のマークになれば成功
Step5: ビットストリームの書き込み
FPGAにビットストリームを書き込んで動作を確認する
ビットストリーム(bitstream)
- デジタルデータを連続したビット(0と1)の列として表現したもの
1: FPGAとPCの接続
USB-JTAG
と書かれたUSBポートとPCを接続する
2: デバイスのスキャン
- dip switchの1を下げる
-
Program Device
をダブルクリック -
scan device
をクリック
- デバイス
GW2A-18C
を選択し、OK
をクリック
- デバイスが追加されればよい
3: SRAMへの書き込み
SRAMモード
- ビットストリームを検証するために使用される
-
Read Device Codes
をクリック - Device Operationを以下に設定
Access Mode:SRAM Mode
Opetation:SRAM Program
- 3つの点のボックスをクリックし、.fsビットストリームファイルを選択する
※ビットストリームファイル:impl -> pnr
ディレクトリにある
-
Save
をクリックして保存 -
Program/Configure
をクリック、プログラムを書き込む
- エラーが出なければ書き込み成功
4: Flashへの書き込み
sramへの書き込みはビストストリームの検証に使用されプログラムを保存することはできない
起動時にアプリケーションを実行したい場合は、フラッシュに書き込む必要がある
- Operationの下のボックスをクリック
- Device Operationを以下に設定
Access Mode:External Flash Mode
Opetation:exFlash Erase,Program thru GAO-Bridge
- 3つの点のボックスをクリックし、.fsビットストリームファイルを選択する
※ビットストリームファイル:impl -> pnr
ディレクトリにある - External Flash Optionsで
generic Flash
を選択
-
Save
をクリックして保存 -
Program/Configure
をクリック、プログラムを書き込む
- エラーが出なければ成功
【ちょっと雑談】USB-OTGとUSB-JTAGの違い
Tang Primer 20Kの基板上に2種類のUSB接続口があったので、どう異なるのだろうと気になりました。(ただ単に、どちらに接続すればよいか分からなかっただけですが笑)
USB-OTG(On-The-Go)
- 一般的なUSBデバイスの接続に使用
- デバイスがホストとデバイスの両方として機能する
- キーボードやマウスなどのUSBデバイスを直接接続できる
USB-JTAG(Joint Test Action Group)
- デバイスのプログラミングやデバックに特化している
- FPGAやマイクロコントローラなどのデバイスをプログラムorデバックするためのインターフェース
- JTAGプロトコルを使用し、デバイス内部テストやプログラミングを行う
つまり、FPGAにUSB機器を使用したい時はOTGに、FPGAにプログラムを書き込みたい時はJTAGに接続すればよいということが分かりました。
結果
Lチカ成功!!
LTDを点滅することができました。
(論理制約の際にPortのLocationをL14
に選択したため4がチカチカする。)
さいごに
お読みいただきありがとうございました!
初めてFPGAを触ったのですが無事にLEDを点滅させることができました。
今後もFPGAで色々試してみようと思います!!
Discussion