---
# System prepended metadata

title: 開源FPGA_Verilog

---

# 開源FPGA/Verilog 入門學習研討與工作坊
課程講義：https://drive.google.com/file/d/1G1jGkdioWYk1VALm7GKb-FsMcFeSeGeX/view?usp=sharing
課程檔案：
1. [ 9:00-10:00 開源 FPGA Toolchain 簡介 ]
### FPGA Toolchain
- FPGA開源工具介紹
- Project IceStorm 介紹
- APIO 與 VSCode 開發環境
- Icestudio 圖像式開發環境
- F4PGA/SymbiFlow
### FPGA Dev Kits
- Lattice iCE40
    - iCE40HX1K:iCestick
    - iCE40UP5K :OK :iCE40pro
- OK:iCE40pro 電路設計介紹
- PMOD 電路設計介紹
    - VGA, NeoPix,RGB LED
    - HDMI, 7-Seg,....
- OpenSource IceStorm 工具鏈介紹
- 簡單易用的 APIO 與 VSCode Verilog 開發環境
- 適合教學的圖形開發環境 ：IceStudio IDE
2. [ 10:00-11:00 三款開源 CPU 設計介紹 ]
### FPGA CPU Examples
- 數位邏輯設計與Verilog基礎
    - Minimal CPU & Verilog-in-30min
- 三款 FPGA CPU/Verilog 範例
    - 8bit - NES
    - 16bit - J1A Forth SOC
    - 32bit - RISC-V picorv32 + LCD
- Lattice iCE40-UP5K 晶片的應用電路設計
- WiFiBoy FPGA 玩學機 OK:iCE40Pro 電路設計
4. [ 13:00-14:00 簡單易學 OK-8 CPU 設計 ]
### Minimal CPU Design
- OK-8 CPU/Verilog 設計
    - 極精簡CPU框架
    - ISA指令集設計
- PSG 聲音產生器
    - Programmable Sound Generator
- OK-8 + PSG 範例
- OK-8 CPU 原始程式解析
- OK-8 如何做 Blink 範例
- OK-8 如何加入有趣的 Sound Generator 範例
5. [ 14:00-16:00 FPGA 工作坊 ]
### FPGA Workshop
- APIO-VSCode 開發環境安裝
    - Blink & OK-8 實作
- OK:iCE40Pro Bitstreams 範例
    - J1A Forth 的實驗
    - RSIC-V Picorv32
- Icestorm 圖像開發環境安裝
    - PMOD 實驗 (NeoPix)
## 開源 FPGA Toolchain 簡介
### Opensource FPGA Toolchain
- FPGA 是什麼
    - Logic Input -> Field Programmable Gate Array -> Logic Output
- 有什麼好處
    - Flexibility
    - Accessibility
    - Longevity
    - Community
### FPGA Tool/Flow 數位邏輯設計工具與流程
- Synthesis（合成：產出netlist） -> Placement & Routing（自動佈局與繞線：產出tileinfo） -> Bitstream Generation（位元流生成：產出bitstreams）
APIO 安裝環境
![](https://hackmd.io/_uploads/HkJvYLKR2.png)
## 三款開源 CPU 設計介紹
![](https://hackmd.io/_uploads/SJMmEuFA2.png)
![](https://hackmd.io/_uploads/rkzNNuYAn.png)

## 簡單易學 OK-8 CPU 設計
**CPU規格：**
- 一個暫存器 ACC，一個 PC （Program Counter）
- ROM、RAM 各有16個bytes
- 只有4個指令：LOAD x, ADD x, STORE x, HALT
    - 8bits 指令格式為 "ooxxxxxx":oo=opcode, xxxxxx=operand
1. Verilog的電路，是由一塊塊module組合連接而成的：
```verilog
module MinimalCPU (input clk, output led);
    // ...
endmodule
```
2. 數位邏輯電路設計，要先認識「reg暫存訊號線」。
```verilog
reg[7:0] PC = 8'b00000000;
reg[7:0] ACC = 8'b00000000;
reg[7:0] ROM[0:15];
reg[7:0] RAM[0:15];
```
3. 給ROM 輸入一段小程式。(指令格式 ooxxxxxx)
```verilog
initital begin
    ROM[0] = 8'b00000001;
    ROM[1] = 8'b01000010;
    ROM[2] = 8'b10000011;
    ROM[3] = 8'b11000000;
end
```
4. 做一個「在clk正元觸發指令」的電路
clk 訊號是CPU的「心動時刻」
```verilog
always @(posedge clk) begin
    IR = ROM[PC];
    opcode = IR[7:6];
    operand = IR[5:0];
    // ...
    PC = PC+1;
end
```
5. 剛才做的電路有三個沒有定義
```verilog
reg [7:0] IR;
reg [1:0] opcode;
reg [5:0] operand;
```
7. 現在要開始解析、執行指令。
```verilog
always @(posedge clk) begin
    IR = ROM[PC];
    opcode = IR[7:6];
    operand = IR[5:0];
    
    case(opcode)
        2'b00: ACC = operand; // LOAD
        2'b01: ACC = ACC + operand; // ADD 
        2'b10: RAM[operand] = ACC; // STORE
        2'b11: led = 0; // HALT
    endcase
    
    PC = PC+1;
end
```
7. 有一個小漏洞，HALT時，PC不能再加一了。
```verilog
if(opcode != 2'b11) PC = PC+1;
```
8. 最小CPU程式碼完成了
```verilog
module MinimalCPU(input clk, output led);
    reg[7:0] PC = 8'b0000000;
    reg[7:0] ACC =8'b0000000; 
    reg[7:0] ROM[0:15];
    reg[7:0] RAM[0:15];
    initial begin
        ROM[0] = 8'b00000001;
        ROM[1] = 8'b01000010;
        ROM[2] = 8'b10000011;
        ROM[3] = 8'b11000000;
    end
    reg[7:0] IR;
    reg[1:0] opcode;
    reg[5:0] operand;
    always @(posedge clk) begin
        IR = ROM[PC];
        opcode = IR[7:6];
        operand = IR[5:0];
        case(opcode)
            2'b00 ACC = operand;
            2'b01 PC = ACC + operand;
            2'b10 RAM[operand] = ACC;
            2'b11 led = 0;
        endcase
        if(opcode != 2'b11) PC = PC + 1;
    end
endmodule
```
## 開源 CPU & OK-8 實務操作
#### vscode 
![](https://hackmd.io/_uploads/SyrWDctAn.png)
```shell
$pip install apio
$apio install -a
$apio drivers --ftdi-enable
$iceprog "the path of game"
```
select Dual RS232-HS
Driver FTDIBUS -> libusbK

vscode install extension
1. IceStorm
ctrl + shif + p -> create the fpga project
2. Verilog-HDL/SystemVerilog

#### icestudio
![](https://hackmd.io/_uploads/BySMwqYC3.png)

