以下文章來源于OpenFPGA,作者碎碎思
使用 Python/MyHDL 創建自定義 FPGA IP,與 Vivado 集成,并通過 PYNQ 進行控制——實現軟件上的簡單硬件設計。
介紹
硬件開源編程利器MyHDL簡介
傳統上,FPGA 開發意味著編寫 Verilog 或 VHDL 代碼——這些語言功能強大但冗長,與現代軟件工作流程格格不入。如果能用 Python 來描述硬件呢?Python 也是你用于軟件開發、測試和數據分析的語言。
本項目演示了如何使用MyHDL (一種基于 Python 的硬件描述語言)創建自定義 FPGA IP 核,并將其集成到 Xilinx Vivado 中。通過 Python 的強大表達能力和 MyHDL 的硬件轉換功能,我們可以使用熟悉的工具和語法來設計、仿真和部署 FPGA 邏輯。
最終成果:一個支持周期性(基于定時器)和軟件觸發中斷的中斷生成器 IP,通過 AXI4-Lite 與 Zynq UltraScale+ PS 完全集成,可以通過 PYNQ 的 Python 接口進行控制。
為什么選擇 MyHDL?
MyHDL彌合了軟件開發和硬件開發之間的差距:
Python 語法:用熟悉的 Python 代碼編寫硬件描述
仿真支持:在綜合之前,使用 Python 測試硬件邏輯。
代碼生成:自動將 Verilog 代碼轉換為 Vivado 集成所需的格式
模塊化設計:可重用的接口定義和組件
類型安全:硬件感知類型檢查可防止常見錯誤
項目概述
中斷生成器 IP 提供:
兩個獨立的中斷輸出:獨立的中斷 1 和中斷 2 通道
周期性中斷模式:可配置的基于定時器的中斷,帶有 32 位周期計數器
軟件觸發模式:通過寄存器寫入按需生成中斷
基于寄存器的控制:用于配置和狀態監控的 AXI4-Lite 接口
中斷管理:用于靈活中斷控制的狀態寄存器和使能寄存器
先決條件
硬件:

Xilinx KR260 機器人入門套件 網絡連接(用于 PYNQ 訪問)
軟件:
Ubuntu 24.04 LTS(構建主機)
Python 3.12
Vivado 2025.2(或兼容版本)
定制的 Yocto Linux 鏡像,包含 PYNQ
參考:
https://www.hackster.io/wstanislaus/custom-yocto-linux-network-boot-for-xilinx-kr260-e22ac3
Jupyter Notebook 服務器(包含在 PYNQ 鏡像中)
構建依賴項:
sudo apt-get update sudo apt-get install -y python3.12 python3.12-venv make
項目結構:

構建 MyHDL IP
構建過程將基于 Python 的 MyHDL 代碼轉換為 Verilog,以便與 Vivado 集成。
步驟 1:構建 IP
cdmyhdl make all
這條命令:
創建一個 Python 3.12 虛擬環境
安裝 MyHDL 軟件包
將 MyHDL 代碼轉換為 Verilog
輸出:build/interrupt_generator_ip.v
手動構建過程:
# Create virtual environment python3.12 -m venv venv sourcevenv/bin/activate # Install MyHDL pip install --upgrade pip pip install myhdl # Convert to Verilog PYTHONPATH=. python PL/MyHDL/src/interrupt_generator_ip/interrupt_generator_ip.py
生成的 Verilog 文件(interrupt_generator_ip.v)包含完整的 IP 核,帶有 AXI4-Lite 接口,可直接用于 Vivado 集成。
MyHDL IP架構
核心組件:
中斷生成器核心(interrupt_gen.py)實現周期性和軟件觸發的中斷邏輯,管理周期計數器和中斷狀態,提供兩個獨立的中斷輸出。
IP Wrapper ( interrupt_generator_ip.py)將 AXI4-Lite 接口轉換為內部 AxiLocal 格式,實例化中斷生成器內核,并為 Vivado 生成 Verilog 輸出。
AXI 接口(axi_lite.py,axi_local.py)標準 AXI4-Lite 從接口,用于內部路由的簡化本地 AXI 總線
寄存器:

步驟 1:創建新項目
打開 Vivado 并選擇“創建項目”
選擇RTL 項目,然后單擊“下一步”。
設置項目名稱:interrupt_demo
選擇項目路徑
選擇“Do not specify sources at this time”。
點擊“Boards”,然后選擇“Kria KR260 Robotics Starter Kit SOM”。
步驟 2:添加 MyHDL 生成的 Verilog
在 Vivado 中,右鍵單擊Design Sources → Add Sources。
選擇“Add or create design sources”
點擊“Add Files”并導航至build/interrupt_generator_ip.v
點擊“完成”

步驟 3:創建模塊設計
在“ Sources ”窗口中右鍵單擊→創建塊設計
給它起個名字interrupt_demo
單擊“確定”

步驟 4:添加IP核
將以下 IP 核添加到模塊設計中:
Zynq UltraScale+ PS ( zynq_ultra_ps_e)雙擊配置啟用PL-PS 時鐘(100MHz)啟用M_AXI_HPM0_LPD接口啟用IRQ_F2P中斷輸入
中斷生成器 IP (自定義 IP)在模塊設計中右鍵單擊 →添加模塊從列表中選擇這是 MyHDL 生成的 IPinterrupt_generator_ip_0

AXI Smart Memory Controller (axi_smc)通過 AXI4-Lite 將 PS 連接到自定義 IP
AXI 中斷控制器(axi_intc)合并 PL 中斷基地址:0xB0010000

Interrupt Concatenator(xlconcat)組合中斷生成器輸出,連接到 AXI 中斷控制器
Processor System Reset (proc_sys_reset)PL邏輯復位控制器
步驟 5:連接IP核
連接以下部件:
PS → AXI SMC → Interrupt Generator:AXI4-Lite 接口
Interrupt Generator → Interrupt Concatenator:兩個中斷輸出
Interrupt Concatenator → AXI Interrupt Controller:組合中斷總線
AXI Interrupt Controller → PS :IRQ_F2P 中斷輸入
PS → 所有 IP :時鐘和復位信號
步驟 6:創建 HDL 包裝器
右鍵單擊塊設計 →創建 HDL 包裝器
選擇“讓 Vivado 管理包裝器并自動更新”
單擊“確定”
步驟 7:完成積木設計
最終的模塊設計應該如下所示:

步驟 8:生成比特流
步驟 9:導出硬件
File → Export → Export Hardware
Include bitstream
Export to interrupt_demo.xsa
PYNQ 集成
硬件平臺導出后,現在可以使用 PYNQ 的 Python 接口與自定義 IP 進行交互。
步驟 1:將文件復制到 KR260
將以下內容復制到 KR260 開發板:
interrupt_demo.bit→/nfsroot/lib/firmware/
interrupt_demo.hwh→/nfsroot/lib/firmware/
APU/pynq_interrupt.ipynb→/nfsroot/home/xilinx/Notebook/
步驟 2:打開 Jupyter 服務器
在 Ubuntu 構建/開發機器上:
firefox http://172.20.1.2:9090/
找到pynq_interrupt.ipynb并打開它。
步驟 3:加載Overlay
from pynq import Overlay, Interrupt
import asyncio
# Load the FPGA overlay
overlay = Overlay('interrupt_demo.bit')
overlay.download()
# Get the interrupt generator IP
intr = overlay.interrupt_generator_ip_0
# Configure PL clock (100MHz)
overlay.clock_dict['fclk_clk0'] = 100000000
步驟 4:配置中斷
# Register offsets period1 = 0x00 period2 = 0x04 isr = 0x08 ier = 0x0C trigger = 0x10 # Configure interrupt1 for software triggering intr.write(period1, 0) # Disable periodic mode intr.write(ier, 1) # Enable interrupt1 # Configure interrupt2 for periodic interrupts (1 second at 100MHz) intr.write(period2, 100000000) intr.write(ier, 2) # Enable interrupt2
步驟 5:處理中斷
# Create interrupt instances
intr_inst1 = Interrupt('axi_intc', intr_id=0) # interrupt1
intr_inst2 = Interrupt('axi_intc', intr_id=1) # interrupt2
# Async interrupt handler
async def interrupt_handler(interrupt_object, interrupt_bit):
print("Handler task started. Waiting for interrupt...")
# Wait for interrupt
await interrupt_object.wait()
print("Interrupt received!")
# Clear the interrupt (write 1 to the bit to clear it)
intr.write(isr, interrupt_bit)
# Trigger software interrupt
intr.write(trigger, 1) # Trigger interrupt1
# Wait for interrupt
await interrupt_handler(intr_inst1, 1)
# Periodic interrupt will fire automatically
await interrupt_handler(intr_inst2, 2)
中斷操作模式
周期性中斷:
將周期寄存器設置為所需的時鐘周期計數
在 IER 寄存器中啟用中斷
當計數器到期時,中斷會自動觸發。
中斷發生時,ISR 位被置位。
軟件清除 ISR 位以確認
軟件觸發中斷:
將周期寄存器設置為 0(禁用周期模式)
在 IER 寄存器中啟用中斷
向 TRIGGER 寄存器位寫入 1
Interrupt fires immediately
ISR 位已設置
軟件清除 ISR 位以確認
設計優勢
MyHDL 的優勢:
快速原型開發:用 Python 編寫硬件,用 Python 進行測試,然后轉換為 Verilog 格式
代碼復用:采用可復用接口定義的模塊化設計
仿真:綜合之前測試硬件邏輯。
可維護性:Python 的可讀性使得硬件代碼更容易理解。
整合優勢:
標準接口:AXI4-Lite 提供與 PS 的標準連接。
PYNQ 兼容性:通過 Python 無縫控制自定義 IP
靈活配置:基于寄存器的控制支持運行時重新配置
中斷支持:正確的 PL 到 PS 中斷處理
資源
MyHDL 文檔:
http://www.myhdl.org/
PYNQ 文檔:
https://pynq.readthedocs.io/
Xilinx Vivado 文檔:
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2025_2/ug910-vivado-getting-started.pdf
KR260 開發板文檔:
https://www.xilinx.com/products/boards-and-kits/kria.html
定制 Yocto Linux 項目:
https://www.hackster.io/wstanislaus/custom-yocto-linux-network-boot-for-xilinx-kr260-e22ac3
本項目源文件
https://github.com/wstanislaus/Xilinx_KR260_Projects/tree/main/myhdl
結論
該項目表明,FPGA 開發并不意味著要放棄現代軟件工具。通過使用 MyHDL,我們可以:
用 Python 編寫硬件代碼
利用 Python 的生態系統進行測試和仿真
生成用于 Vivado 集成的標準 Verilog
通過 PYNQ 的 Python 接口控制硬件
最終形成的開發工作流程既能讓軟件工程師感到自然流暢,又能保持 FPGA 設計的強大功能和靈活性。無論是在構建新的 IP 核原型、嘗試軟硬件協同設計,還是構建生產系統,MyHDL 都能在軟件和硬件世界之間架起一座橋梁。
-
寄存器
+關注
關注
31文章
5615瀏覽量
130323 -
定時器
+關注
關注
23文章
3370瀏覽量
124302 -
python
+關注
關注
58文章
4881瀏覽量
90259 -
Vivado
+關注
關注
19文章
860瀏覽量
71327
原文標題:用 Python 寫 FPGA IP!—— MyHDL 自定義中斷生成器實踐
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
PYNQ設計案例:基于HDL語言+Vivado的自定義IP核創建
自定義Python PyPI存儲庫
利用SDSoC創建自定義硬件
Python學習要點:自定義序列實現切片功能
使用VIvado封裝自定IP并使用IP創建工程
Vivado Design Suite用戶指南:創建和打包自定義IP
使用Python/MyHDL創建自定義FPGA IP
評論