🎮

【FPGA】Tang Primer 20KでLチカ

2024/06/11に公開

Tang Primer 20KというFPGAを手に入れたので、遊んでいきたいと思います!!
最初なので、Lチカを試してみます!

はじめに

Tang Primer 20kとは?

Tang Primer 20K とは、Sipeed社が製造しているFPGAのことです。
https://wiki.sipeed.com/hardware/en/tang/tang-primer-20k/primer-20k.html

スペック

コアボード: 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: ファイルのダウンロード

  1. Gowinのホームページにアクセスし、ユーザ登録・ログインを行う。
    ※ダウンロードのためにユーザ登録をする必要があります。
  2. ダウンロードページにアクセスし、Gowin V1.9.9.03 Education をダウンロードする。

2: インストール

  1. ダウンロードしたファイルを展開する。
  2. 展開したファイルにあるGowin_V1.9.9.03_Education_x64_win.exeを実行する。
  3. Next > I Agree > Next > Install > Finish でインストールを進める。
    ※インストールの際に尋ねられるコンポーネントやドライバーは全てインストールするのが好ましいので、チェックボックスにはチェックを入れておきましょう。
  4. インストール完了後に、Gowin_V1.9.9.03_Educationアイコンをダブルクリックし、Gowin EDAの画面が表示されればインストール完了。
    Gowin EDAの画面

Step2: openFPGALoaderのインストール

FPGAに回路情報を書き込むためにopenFPGALoaderをダウンロードします。

Windowsの場合

  1. ダウンロードページにアクセス
  2. openFPGALoader-win.zipをダウンロード
    openFPGALoader-win.zip
  3. ダウンロードしたファイルを展開
  4. コマンドプロンプトを起動し、展開したフォルダ下にあるbinファイルに移動
  5. ファイルの実行
$./openFPGALoader.exe -V
  1. openFPGALoader v0.10.0と表示されれば完了

Linuxの場合

以下のインストールガイドを確認してください。
https://trabucayre.github.io/openFPGALoader/guide/install.html
openFPGALoaderのGitHubページ
https://github.com/trabucayre/openFPGALoader

Step3: EDAでプロジェクト作成

GowinEDAでFPGA回路情報用のプロジェクトを作成します。

  1. Gowin EDAを起動
  2. New Projectのプロジェクトをクリック
    NewProjectアイコン
  3. ウィンドウが表示されるのでOKをクリック
    Project Wizardが起動する
    4.プロジェクト名の設定
    プロジェクト名とファイルを保存する場所へのパスを入力する
    projectの設定
  4. デバイスの設定
    Series: GW2Aにし、GA2A-LV18PG256C8/17を選択する
    Seriesの選択
  5. Summary画面で内容を確認し、問題なければFinishボダンをクリック
  6. General Target Deviceが表示されればプロジェクト作成完了

Step4: 実装

FPGAへの実装を行う

1: 回路情報の記述

  1. New Fileアイコンをクリック
    NewFileアイコン
  2. 表示されたウインドウからVerilog Fileを選択、OKをクリック
    Verilog File
  3. ファイル名とファイルの作成場所を入力
  4. System Verilogファイルが作成される
  5. HDL(ハードウェア記述言語)でコードを記述
    以下は、LEDが0.5秒間隔で点滅するコードです。(クロック信号を基にカウントを行い、0.5秒ごとにIO_voltageの値を反転させる。)
HDL
// モジュールの定義
// 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: 論理合成

コードを論理合成する

  1. Processをクリック
  2. Synthesizeをダブルクリック
    論理合成
  3. 緑のチェックマークになれば論理合成成功

3: 物理制約

コードで定義したポートとFPGAのピンとの接続に関する制約の設定

  1. FloorPlannerをダブルクリック
  2. ダイアログボックスがポップアップする
  3. OKをクリック
    FloorPlanner1
  4. FloorPlannerが起動する
    FloorPlanner2
  5. ピンの設定のためにIO Constraninsをクリック
  6. それぞれのPORTのLocationを以下のように設定する
    Location
    ※TangPrimer20Kの回路図
    https://dl.sipeed.com/shareURL/TANG/Primer_20K/02_Schematic
  7. Ctrl + Sで保存し、FloorPlannerを閉じる
  8. .cstファイルが作成される
    cstファイル

4: 配置&配線

FPGAチップ上にリソースを合理的に割り当てる

  1. Place&Routeをダブルクリック
  2. 緑のマークになれば成功
    place&route

Step5: ビットストリームの書き込み

FPGAにビットストリームを書き込んで動作を確認する
ビットストリーム(bitstream)

  • デジタルデータを連続したビット(0と1)の列として表現したもの

1: FPGAとPCの接続

USB-JTAGと書かれたUSBポートとPCを接続する
JTAG

2: デバイスのスキャン

  1. dip switchの1を下げる
    dip switch
  2. Program Deviceをダブルクリック
  3. scan deviceをクリック
    scan device
  4. デバイスGW2A-18Cを選択し、OKをクリック
    GW2A-18C
  5. デバイスが追加されればよい
    device

3: SRAMへの書き込み

SRAMモード

  • ビットストリームを検証するために使用される
  1. Read Device Codesをクリック
  2. Device Operationを以下に設定
    Access Mode: SRAM Mode
    Opetation: SRAM Program
  3. 3つの点のボックスをクリックし、.fsビットストリームファイルを選択する
    ※ビットストリームファイル: impl -> pnrディレクトリにある
    sram
  4. Saveをクリックして保存
  5. Program/Configureをクリック、プログラムを書き込む
    burn
  6. エラーが出なければ書き込み成功

4: Flashへの書き込み

sramへの書き込みはビストストリームの検証に使用されプログラムを保存することはできない
起動時にアプリケーションを実行したい場合は、フラッシュに書き込む必要がある

  1. Operationの下のボックスをクリック
  2. Device Operationを以下に設定
    Access Mode: External Flash Mode
    Opetation: exFlash Erase,Program thru GAO-Bridge
  3. 3つの点のボックスをクリックし、.fsビットストリームファイルを選択する
    ※ビットストリームファイル: impl -> pnrディレクトリにある
  4. External Flash Optionsでgeneric Flashを選択
    flash
  5. Saveをクリックして保存
  6. Program/Configureをクリック、プログラムを書き込む
    configure
  7. エラーが出なければ成功

【ちょっと雑談】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を点滅することができました。
Lチカ

(論理制約の際にPortのLocationをL14に選択したため4がチカチカする。)

さいごに

お読みいただきありがとうございました!
初めてFPGAを触ったのですが無事にLEDを点滅させることができました。
今後もFPGAで色々試してみようと思います!!

Discussion