Tang Primer 25K + HUB75E

# 25K LUTのGOWIN FPGAを搭載する格安ボード
Tang Primer 25K(Sipeed)が発売されました．
Tang Mega 138Kに続き，Sipeedは勢いがありまね（138Kはまともに動かないみたいだけど…）．
138Kのチップを搭載する別なボードも，近々発売されるようです（138Kはまともに動かないみたいだけど…）．

Primer 25Kについては，出たばかりなので まだ予断を許しませんが，今のところ特に不具合の報告もなさそうです．

Sipeedからは，幾つかのサンプルがGitHubに上がっています．
`https://github.com/sipeed/TangPrimer-25K-example`
1. UART
1. HDMI
1. Litex(RISC-V)
1. NES
1. 7セグ
1. HUB75E
1. LCD
1. LED

現時点で，確認できるサンプルは以上です．
今回は，この中のHUB75Eを使うので，上記リポジトリをクローンしておきます．

# 必要な機能はPmodで追加
周辺機能がてんこ盛りだった「Primer 20K＋Dock」と異なり，「Primer 25K＋Dock」はシンプルな構成となっており，そのぶん低価格です．
　Primer 25KのDockには3つのPmodポートが付いており，各々のユーザが必要な機能を追加できるようになっています．
 　Primer 25Kの発売と同時に幾つかのPmod対応ボードが発売されており，今後SipeedはPmod製品を充実させていくのかもしれません．

# 64x64マトリクスLED　HUB75Eに画像を表示(Show something on HUB75E)
　Exampleのプロジェクトを使い，任意の画像をマトリクスLED（HUB75E）に表示してみます． 

## ハードウェア(Hardware)
### Tang Primer 25K
　当然のことながらFPGAボードが必要です．

### HUB75E
　Tang Primer 25Kに，Sipeedで販売されているHUB75Eを接続します．
 AliexpressのSipeedストアで販売されているHUB75Eには，Pmod経由で接続できるように，専用基板と配線（通信線，5V電源線）が付属されています<sup>(2)</sup>．
`https://www.instagram.com/p/C0EQUEVvur4/?igshid=MjJiNWQxZDI5Yg%3D%3D&img_index=1`

### 5V電源
　HUB75Eには，64×64個のLEDが搭載されています．表示する内容（点灯内容）によりますが，MAXで1.8Aくらい流れるので，それなりの5V電源が必要です．

## サンプル
　故障していないことを祈りつつ，まずはリポジトリに含まれているビットストリームを使って動作確認します．
`pmod_hub75e/impl/pnr/HUB75E.fs`
をTang Primer 25Kに書き込むと，次のようにSipeedのロゴが表示されます．
![s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/02de8785-7f59-3725-5b78-51baeb263ac8.jpeg)

## 任意の画像を表示させる
　上記のプロジェクトは，HUB75Eの64×64個のLEDをダイナミック点灯させるものです．
 表示する内容は予めメモリに格納されています．メモリとしては，GowinのIPである `gowin_prom` を利用しています．
 　次に任意の画像を表示するため，サンプルのプロジェクトを改変しますが，まずは表示する画像を用意します．

### 変換
　任意の画像を， `gowin_prom` が読み込めるように変換します．
ここでは，画像 `staba.bmp` を使います．
`pmod_hub75E/readme.md` の中に，変換用のPythonスクリプトが書かれているので，これを適当なファイル名で保存します．
ここでは，`translation.py` としました．
読み込む画像は，スクリプト内にベタ書きしてあるので，適宜スクリプト内の該当の箇所（読み込むファイル名）を編集しておきます．
そして，このPythonスクリプトを実行します．

```
$ python3 translation.py > data.hex
```

画像データが変換された， `data.hex` というファイルができます．

### HUB75Eのサンプル・プロジェクトを開く
　Gowin EDAで， `pmod_hub75e/HUB75E.gprj` プロジェクトを開きます．
 
#### IP Core Generator
　IP Core Generatorを起動します．
![ipcg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/00eea7ed-18e1-e7c8-9fa3-92b5814c0187.png)
 
  `pmod_hub75e/src/gowin_prom/gowin_prom.ipc` を開きます．
  ![open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/a94dcb96-8eb9-7970-7049-69555760769c.png)

 ![prom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/a294d7fe-a7b0-83c9-7387-c64956cfeb70.png)

設定ダイアログが開くので，先ほど生成したファイルを指定します．
![prom2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/eea00787-84f3-d1ab-a897-e66ac3671378.png)
それ以外は，触る必要はありません．
`src/gowin_prom/gowin_prom.v` が自動で生成されます．
次のような形で表示するデータが保持されています．
![data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/25e199e9-a33e-8b5b-ffeb-3dfd5d41be72.png)


合成すると，ビットストリームが生成されます．
（エラーが出る場合，Configuration - Dual-Purpose Pin - Use CPU as regular IO の設定を確認する）

#### 書き込み
HUB75Eに書き込みます．
![starbucks.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369631/c9e306cf-34cc-a1ae-b92d-c3d065d8e4de.jpeg)

あれ？特にHDLの話が出てこなかったぞ．
まぁ，何というか画像表示されちゃったし，致し方なし．


# 参考文献(References)
(1)Sipeed公式WiKi
https://wiki.sipeed.com/hardware/en/tang/tang-primer-25k/primer-25k.html
(2)Aliexpress, Sipeed, Tang Primer 25K
https://ja.aliexpress.com/item/1005006224593018.html?spm=a2g0o.store_pc_groupList.8148356.1.4df223b3sWV7pj&pdp_npi=4%40dis%21JPY%21%EF%BF%A5%201%2C202%21%EF%BF%A5%201%2C202%21%21%218.23%218.23%21%40211b88ef17021398990884289e8070%2112000036357545337%21sh%21JP%212054787332%21
(3)Tang Primer 25Kの写真
https://fpga.tokyo/20231126/primer25k