---
# System prepended metadata

title: FPGA：System Design概念
tags: [FPGA硬體設計]

---

# FPGA：System Design概念


## System Design 流程
### 1. 需求分析
### 2. 系統架構設計
### 3. RTL設計
### 4. 功能模擬
### 5. 綜合與實作 (Synthesis & Implementation)
### 6. Timing Simulation
### 7. On-board Verification


## 背景:

### 傳統FPGA系統設計流程:
1. 系統需求分析
2. 撰寫各個功能的module (HDL Design)
3. module的連接: 定I/O、接口
4. Simulation(仿真) & Verification(驗證)
5. Synthesis(綜合): HDL轉乘 Gate-Level
6. Implementation: 繞線 & 邏輯單元mapping
7. 硬體驗證功能: bitstream 下載到 FPGA
8. 系統優化

### 新的FPGA系統設計流程:
將2. 3. 4. 取代了
- 2. 撰寫各個功能的 module
   - 傳統：每個功能模組都要手寫 Verilog/VHDL。
   - 新流程：使用 現成的 IP 核（硬件模組已經寫好 HDL）
- 3. module 的連接: 定 I/O、接口
    - 傳統：模組間信號線、總線接口、寄存器連接都要手動編寫 HDL。
    - 新流程：
        - 使用 圖形化設計工具（如 Vivado IP Integrator） 拖拉 IP 核連線，自動生成連接 HDL
        - 或 在 PYNQ 上由軟體（Python）控制模組，完全不需要手寫接口 HDL。
- 4. Simulation & Verification (功能驗證)
    - 傳統：每修改一個 HDL 都要重新做仿真，流程繁瑣。
    - 新流程：軟體層（Python/C）直接控制已封裝的硬件模組，可以快速做 系統級驗證，無需每次都仿真底層 HDL


## 階段一：熟悉平台
### 期望目標：
1. 說明Zynq系統
2. 搞懂PS vs PL
3. 搞懂AXI如何傳送資料
4. 搞懂資料放哪裡（DDR / BRAM）

### 1. Zynq是什麼
- 白話文: Zynq是結合 **ARM處理器** ＋ **FPGA 的可程式化晶片** 的SoC + **記憶體DDR**



##### 1.1 PS vs PL
1. ARM處理器（PS, Processing  System）
    - 包含ARM CPU + 周邊接口
2. FPGA（PL, Programmable Logic）
    - 可程式化邏輯區
4. AXI (Advanced eXtensible Interface)
    - 高速資料通道，PS和PL中間的橋樑
    
### 2. PYNQ 是什麼
PYNQ = Python + Zynq
用 Python 控制 FPGA 上的 IP（硬體功能模組），像調用函數一樣去叫各種通過FPGA加速的應用
- 工具: PYNQ = python庫 + jupyter + Linux
- 分三個層面:
    - 硬體層: FPGA
    - 軟體層: Python + Linux Kernal
    - 應用層: Jupyter Notebook
##### 2.1 硬體層:
在硬體層面，主要是建立 PS 與 PL 之間可互通的架構，並把 FPGA 邏輯封裝成可被軟體控制與切換的模組。
![硬體架構](https://hackmd.io/_uploads/rJmfyFs7Wl.png)

1. PS ↔ PL: 挑選所需要的基礎IP並用AXI連接
2. 設計&整合IP: 寫出帶功能的IP，規範輸入/輸出的格式
3. 建立Overlay(硬體框架): 
    - Overlay 把 FPGA 變成「有插槽的硬體平台」，IP 就像插卡一樣放上去。
    - 把系統中固定會用到的部分作成硬體，之後會把（演算法 / 加速器）放在 overlay 上面。
    - 固定要做成硬體的部分:
        - PS ↔ PL 通訊架構: AXI-lite / AXI-MM / AXI-Stream
        - DMA架構: 負責在 DDR ↔ PL、IP 之間搬資料
        - 記憶體存取模型: DDR/BRAM 的存取方式
4. 封裝成 bitstream: 像建立硬體的加速函式庫
    - 將 (不同功能的IP + Overlay) 封裝成不同 bitstream，在Overlay架構下:
        - 底層Overlay相同
        - 但 上層IP不同，所以要產生不同bitstream
    - 封裝成不同 bitstream，就可以**讓軟體可以動態更換PL邏輯功能**
5. 確認時序
    - 時脈、reset、頻寬、資源配置
##### 2.2 軟體層:
運行在PS中，用Ubuntu 系統 + Python 訪問 FPGA 的處理單元

##### 2.3 應用層:
Jupyter Notebook 提供:
- 快速測試硬體功能
- 快速切換硬體 bitstream

### 3. 記憶體架構：DDR 與 BRAM
##### 3.0 BRAM (Block Ram)
BRAM就是專給PL用的記憶體，小但快

##### 3.1 為什麼需要 DDR？
- FPGA 內部記憶體（BRAM）很快，但很小
- 影像 / CNN / 大量資料 → 一定要外部記憶體

##### 3.2 Zynq 中的 DDR 是誰在管？
- DDR 實體上接在 PS，PS IP 裡有 DDR ，只要在設定中打開DDR就好
- PS 透過 Memory Controller 管理 DDR
- PL 不能直接接 DDR 腳位，PL 要存取 DDR，一定要走 AXI

##### 3.3 PL 怎麼用到 DDR？
- PL 直接作為 AXI Master：
    - 透過PL自己控制 AXI線路，產生 address、valid / ready 等訊號，存取記憶體
- DMA（最常用、最高效）
    - PL 透過 DMA 作為資料搬運器
    - 常用於資料量大的搬運：影像處理、Feature Map
- PS 幫忙搬（效能最差）
    - PS 讀取 DDR，再透過AXI-Lite / AXI-Stream 寫給 PL，也可以把 PL 運算結果送回 DDR
    - 缺點：CPU 負擔大

DDR 是「系統的大倉庫」








## 階段二：[設計可由PS控制的IP](https://hackmd.io/@wu5xshp2SLCaXs8LN7YEVQ/r1oc6TdVZg)
- 目的是**驗證IP功能**
- 要學會：設計一顆可以用的IP
寫一個簡單 FPGA Data Processing IP
使用 AXI-Lite 設計 register
FSM 控制流程
1. Streaming Windowed MAC：乘加
    - 對一個窗口大小(3 $\times$ 3)的、連續輸入的數字與固定的權重做相乘後加總
    - 用途：影像Conv、濾波器
2. Feature Accumulator IP：累加
    - 將多個來源的特徵做累加
    - 以CNN為例：權重乘法完後會到一張3x3的特徵圖，即將3x3中所有特徵直逐步累加，共加8次

## 階段三：PS ↔ PL + DMA（系統整合）
- 目的是**加速系統**
- 要學會：PS ↔ PL 的 DMA dataflow accelerator，並量測實際 throughput 與 latency。




## 附錄：pynq 教學
[PYNQ-Z1](https://www.haleytech.com/en/400/4300)

[教學2](https://blog.csdn.net/qq_39507748/article/details/114433347)


PYNQ 官方網站：http://www.pynq.io/

PYNQ 官方說明文件：https://pynq.readthedocs.io/en/latest/

PYNQ 原始碼：https://github.com/xilinx/pynq

PYNQ 官方workshop：https://github.com/Xilinx/PYNQ_Workshop

