FPGA ICE40UL1K-CM36A 最小系統板
=======================================
1. [介紹](#介紹)
2. [操作示範](#操作示範)
6. [相關資料](#相關資料)
## 介紹
CDPGA_BX 爲 Lattice 之 iCE40 UL 系列 FPGA (ICE40UL1K-CM36A) 最小系統板(爲 CDCTL_BX 匯流排控製器未燒寫版本),板上資源含有:
- 引出 12 個 IO 埠(其中 4 個與配置埠復用);
- 16 M 時鐘,可經內部 PLL 輸出更高頻率;
- 只需外部供電 3.3 V 即可使用。
Lattice 器件使用較爲便捷:
- 價格便宜,體積小,封裝選擇多;
- 可內部配置,防止破解;
- 無需私有燒錄工具,使用任意 FT232H 系列 USB 轉 SPI 工具即可;
- 開發軟體和燒錄工具免費且相對小巧,支援 Linux 和 Windows 平臺(Linux 版本開發軟體不足 400 MByte)。
模組支持 3 種配置方式:
- 由外部 MCU 或燒錄工具寫入 SRAM, 官方提供 SPI 寫入時序和示例代碼,FPGA 做從,這種方式不限制寫入次數,還可以隨時切換韌體,但掉電韌體會丟失;
- 由外部 SPI FLASH 配置晶片提供,FPGA 做主,上電自動讀取韌體(FLASH 數據可由燒錄工具直接寫入);
- 燒寫 FPGA 內部 NVCM OTP 存儲器,只可燒寫一次,燒錄後上電可默認由內部 NVCM 配置;而且依然可以通過 MCU 配置,但無法再使用外部 SPI FLASH 配置方式。
## 操作示範
示範代碼在 [./code/](./code/) 檔案夾下。
### 建立項目
下載安裝 Lattice iCEcube2 軟體,然後 File -> New Project 以新建項目:
填寫項目名和路徑後,然後點擊 Next 會彈出添加檔案的視窗,
需要添加 HDL 代碼、SDC 時序約束、PCF 管腳定義,完成後點擊 Finish 即可,檔案也可在項目建立完畢之後再添加。
然後點擊 Run Synplify Pro Synthesis 進行綜合:
然後點擊 Run P & R 佈線並生成燒錄檔案:
最後檢查時序是否滿足:
對於 FPGA 開發,只要 RTL 模擬通過,時序約束亦滿足,那麼就基本不會出問題,(譬如 Altera 公司較新版 Quartus 對很多器件都不再支援 post-route simulation)。
### 查看電路
### 下載韌體
通過 FT232H 系列的 USB 轉 SPI 工具連接電路:
(人頭是一個免銲接的轉接板,引出核心板所有引腳,鼻子晶片是 MAX3485, 默認未接入電路)
具體接線方式請參考器件相關資料,譬如:`iCE40 Ultra Breakout Board Users Guide`.
#### Notes:
Linux 用家需要把 ftdi_sio driver 屏蔽,否則會把 FT232H 默認識別爲串口:
```sh
$ cd /lib/modules/`uname -r`/kernel/drivers/usb/serial/
$ sudo mv ftdi_sio.ko ftdi_sio.ko.bk
$ sudo rmmod ftdi_sio
```
The version of previous screenshots was `programmer_3_10_x***-111-2-x86_***-linux`, but the last version `diamond-programmer_3_12-240-2-x86_***-linux` don't support FT232H anymore, we could solve this problem by modify two binary `so` file, change the USB pid string from `6010` to `6014`:
(The last version programmer support FT2232H by default, corresponding to the pid `6010`.)
The last version `diamond-programmer_3_12-240-2-x86_***-linux` has issue for NVCM programming, after processing `NVCM Program, Verigy, Secure`, then check back by `NVCM Read Device Properties`, the `Device Secured` always reported as `OFF`, and the chip will not work at all.
Please use old version `programmer_3_10_x***-111-2-x86_***-linux` for NVCM programming so far. (2021.04.07)
#### 配置外部 Flash
按下圖接好線,打開燒錄工具,會提示掃描失敗,因爲工具不支持自動識別 FLASH 芯片,所以要分別手動點擊 "Device Family" 和 "Device" 選擇 FPGA 型號,
然後雙擊 "Operation" 在彈出菜單中選擇 SPI Flash Programming, 並選擇 Hex 文件和 Flash 芯片型號,確認返回主界面即可進行燒錄。
iCE40 UL 支持市面上大多數 spi nor flash,如果 flash 型號沒有被此燒錄工具收錄,則需要使用第三方工具進行燒錄。
### 模擬測試
你可以使用自己習慣的模擬方式和工具,譬如你可以直接使用 ModelSim, 或者通過 Quartus, ISE 等 IDE 來測試代碼之功能。
這裡僅給出我偏好的方式和官方提供的方式。
#### 通過 python 模擬測試
安裝軟體 `iverilog` (>= v10) 和下載 `cocotb`, 進入 `test_python/` 目錄,通過以下命令即可完成模擬執行:
```sh
$ make
```
最後通過 GTKWave 查看輸出的波形檔案:
修改代碼再次模擬執行後,只需點擊 GTKWave 的 Reload 按鈕即可更新視窗。
關於 cocotb 具體用法請自行前往其項目專頁查閱相關文檔。
#### iCEcube2 模擬測試
iCEcube2 中包含的 Active-HDL 模擬工具僅存在於 Windows 版本,具體使用方式在新的頁面中查看:[iCEcube2 Simulation](icecube2_sim.md).
更新:最新版本的 iCEcube2 2020.12 默認改用 ModelSim 仿真,此章節日後再更新。
## 相關資料
- [原理圖](files/cdctl_bx_sch.pdf)
- [位置圖](files/cdctl_bx_component.png)
- [KiCad library](files/kicad_lib/)
### 尺寸圖
### 焊接方法
除了上面人头板的 CDBITE 免焊接咬合方式:https://github.com/dukelec/cdbus_doc/tree/master/cdbite
还可以直接焊接排针,做成可以插拔的方式:https://blog.d-l.io/solder-half-holes-pcb-with-pin-headers