Tang Primer 25KのSoMを載せるボードを作る

　Tang Primer 25K（Sipeed）はFPGAチップとしてAroraシリーズのGW5A（GOWIN）を搭載しています<sup>(1)</sup>．
 FPGAチップと電源IC，Flash ROMはSoMに搭載されています．このSoMを利用するメインボードを自作するための情報を記します．

![tang25k.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/6d8b72c2-58b5-1466-e401-b74307f5ee9f.jpeg)

 　具体的には，自作したボードを使ってLEDの点滅を行います．
  次にモータを回すためのボードも作ります．
  
# コンフィグレーション　-Configuration-
## GW5Aで使えるコンフィグレーションの種類
　GW5Aのコンフィグレーション方法として，
- MSPI（Master SPI)
- SSPI（Slave SPI)
- Master Serial
- Slave Serial
- Master CPU
- Slave CPU
- JTAG
などが用意されています．

　Tang Primer 25Kに搭載されている GW5A-MG121N は，MSPIとJTAGに対応しています．

＜GW5A シリーズ FPGA 製品回路図 ユーザーガイド
UG987-1.1.2J, 2024-03-13, P12＞

### コンフィグレーションモードはMODEピンで設定する
　どのコンフィグレーション方法を使うかは，MODEピンの設定で切り替えられます．
回路規模が小さめのデバイスは，`MODE[1:0]` で設定します．（MG121Nはこちら）
回路規模が大きめのデバイスは，`MODE[2:0]` で設定します．
　JTAGでコンフィグレーションする場合は，MODEの設定は無視されます．

 
＜GW5A シリーズ FPGA 製品回路図 ユーザーガイド
UG987-1.1.2J, 2024-03-13, P12＞


## Tang Primer 25Kの場合
　Tang Primer 25Kに搭載されている GW5A-LV25MG121 は，<del>JTAGによるコンフィグレーションのみに対応しています．</del>
　下記のドキュメントが間違っておりました．JTAGとMSPIに対応しているようです．
　Tang Primer 25KではSoMにしろDockにしろボード上には，MODEピンは引き出されていません．チップ内部で結線されており，2'b01の固定値になっているので，デフォルトでMSPIモードで起動します．

＜GW5A シリーズ FPGA 製品回路図 ユーザーガイド
UG987-1.1.2J, 2024-03-13, P26＞


# 基板製作 -How to make a board-
　SoMには60ピンのコネクタ DF40C-60DP-04V(51) が2つ搭載されています<sup>(3)</sup>．このコネクタと対になるレセプタクルは，DF40C-60DS-0.4V(51) です．
　SoM側がプラグ，Dock側がソケットです．

　筆者は，SoMのほぼ全ピンを引き出す基板を作って，LED点滅で動作を確認しました．
![GKvOfSQbYAEa8SJ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/5467b0c9-196a-3caa-eaa4-652b98165e19.jpeg)

SoMの裏面
![tang25k-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/6389fd7b-2068-7614-a0ae-edfcfcb2b43e.jpeg)


# コンフィグ方法1：MSPI -Master SPI-
## 配線 -Wiring-
　SoMに搭載されたフラッシュ・メモリからビットストリームを読み込んでコンフィグレーションする方法です．
　Tang Primer 25K（Sipeed）のSchematicsによると，コンフィグレーションに関係するバンク4/5/10は，SoM内でVDD_3V3に接続されており，各バンクへ電源が供給されている．従って，次のピンだけ接続すれば，コンフィグレーションを含め一連の動作を確認できる．

 ＜Tang_Primer_25K_52300_Schematic.pdf<sup>(3)</sup>＞
 
SoM(GW5A) | 接続先 | 説明
--- | --- | ---
D8_RECONFIG | 5.1k -> VDD_3V3 | PullUP
E8_READY | 5.1k -> VDD_3V3 | PullUP
D7_DONE | 5.1k -> VDD_3V3 | PullUP(プルアップしなくてもよいと思われ）
VCCIO0/1 | VDD_3V3 | バンク0/1の電源
H5_IOT61A | LED Anode | 動作確認用LEDアノード
GND | LED Kathode | 動作確認用LEDカソード

＜UG987-1.1.2J，P8＞


## 手順 -procedure-
　予めDockなど，SoMとは別なボードを使って，SoMのフラッシュメモリにコンフィグレーションデータを書き込んでおく（もしくは次のJTAG接続による方法を使ってフラッシュに書き込む）．
電源を入れると，SoM上のフラッシュのデータでコンフィグレーションされる．
　筆者は， `H5` でLEDを点滅させるデザインを書き込んでおいた．
　前述の通り，コンフィグレーション・モードは MODE1 になっているので，電源を入れると自動的にMSPI経由でコンフィグレーションされる（コンフィグレーション・データは，SoM上のフラッシュメモリから読み出される）．

# コンフィグ方法2：Configuration by using JTAG
　AE-FT2232を使ってJTAG接続する．

## 配線 -Wiring-

 SoM側（Tang Primer 25K） | FT2232側
 --- | ---
JTAG-TCK | AD0(5.1kでプルダウン)
JTAG-TMS | AD3
JTAG-TDO | AD2
JTAG-TDI | AD1

![ae.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/2418a9c9-3adc-eedc-176e-2775be67e304.jpeg)


＜UG987-1.1.2J，P16＞

## 手順 -procedure-
　書き込みには openFPGALoader を使う．
Windowsでは，openFPGALoaderを使う場合，ドライバは WinUSB にする．
Zadigでドライバを入れ替える．
(Gowin Programmerを使う場合は，WinUSBでは動かないと思われる）

　次のコマンドで，GW5Aが見えればOK．
 
```
$ openFPGALoader --detect
```

![ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/b57fdca2-09b6-bdb1-7c3f-18f71997eb97.png)

### SRAMに書き込み -Write to SRAM-
　ビットストリームのファイルが `pmod_led.fs` であれば，次のようにすると書き込める．

```
$ openFPGALoader pmod_led.fs
```

https://twitter.com/Lathe_Mariel/status/1779142397567614987

### フラッシュに書き込み -Write to flash memory-
 openFPGALoaderに `-f` オプションを付けると，ビットストリームをフラッシュ・メモリに書き込みます． 

```
$ openFPGALoader -f pmod_led.fs
```

# BLDCモータ制御用ボードの製作 -Make board for BLDC-
　LED点滅に成功し，SoMを使えることが分かったので，元々作りたかったボードを作ってみます．
　モータ制御用のゲートドライバICに信号を出すためのボードです．
　ドライバ・ボード（ゲートドライバICが載っている）に重ねて使うボードを作るのですが，元々載っていたSTM32マイコンボードを換装する用途なので，自作するボードにはNUCLEO用のピンヘッダも搭載します．
　他にも，5VのDC-DCコンバータや，A-Dコンバータ，スイッチ，CANトランシーバ・モジュール（WS2812B，RJ45付）を自作基板上に載せます．

 ![1715343482427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/8b7fdca0-c605-a34e-b4f7-6fcb68dac954.jpeg)

## コンフィグ
　コンフィギュレーション動作をディレイできるように， `Ready` ピンを引き出しておきました．ピンヘッダとジャンパ（黄）でプルアップするか，GND直結するかを選べるようにしておきました．
 （ GW5Aは， `Ready` がHiになるまでコンフィグレーションが始まらない）
 　やってみた結果，基本的にはプルアップしておけば，特に起動シーケンスを気にしなくても正常にコンフィグレーションされるようです．条件によるかもしれませんが，試した範囲では，`Ready` ピンをオープンにしておいても，コンフィグレーションされていました．
  Windowsの場合，ドライバをFTDIUSBにしておけば，GOWIN EDAに付属するProgrammerからも書き込みできます．その場合はProgrammerの設定で，Through GAOの方を選びます．SRAM，Flashともに書き込みできました．

## 動作

　そして，モータもバッチリ回りました．

https://twitter.com/Lathe_Mariel/status/1789867677726454138

## 回路図 -Schematics-
![tang25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/4feaf749-4783-cbe1-89d2-6a54c9bd8e83.png)



## 参考文献
(1)Sipeed Wiki Tang Primer 25K
https://wiki.sipeed.com/hardware/en/tang/tang-primer-25k/primer-25k.html
(2)FPGA.tokyo，写真館
https://fpga.tokyo/primer25k/
(3)Tang Primer 25K Schematic
https://dl.sipeed.com/shareURL/TANG/Primer_25K/02_Schematic
(4)物理図面
Tang_Primer_25K_52300_Dimension.pdf
(5)JLCPCB
https://jlcpcb.jp/capabilities/pcb-capabilities
(6)全体の構成
https://fpga.tokyo/bldc2/