# 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