伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Python/MyHDL創建自定義FPGA IP

FPGA技術江湖 ? 來源:OpenFPGA ? 2026-04-09 09:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

以下文章來源于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 接口

中斷管理:用于靈活中斷控制的狀態寄存器和使能寄存器

先決條件

硬件:

d54113f4-2fb4-11f1-90a1-92fbcf53809c.jpg

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

項目結構:

d5a0330c-2fb4-11f1-90a1-92fbcf53809c.png

構建 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 總線

寄存器:

d5ff79c0-2fb4-11f1-90a1-92fbcf53809c.png

步驟 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

點擊“完成”

d65be0ac-2fb4-11f1-90a1-92fbcf53809c.png

步驟 3:創建模塊設計

在“ Sources ”窗口中右鍵單擊→創建塊設計

給它起個名字interrupt_demo

單擊“確定”

d6bdfc1a-2fb4-11f1-90a1-92fbcf53809c.png

步驟 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

d72945e2-2fb4-11f1-90a1-92fbcf53809c.png

AXI Smart Memory Controller (axi_smc)通過 AXI4-Lite 將 PS 連接到自定義 IP

AXI 中斷控制器(axi_intc)合并 PL 中斷基地址:0xB0010000

d792a23a-2fb4-11f1-90a1-92fbcf53809c.png

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:完成積木設計

最終的模塊設計應該如下所示:

d7ecf258-2fb4-11f1-90a1-92fbcf53809c.png

步驟 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創建

    作者:Mculover666 1.實驗目的 用HDL語言+Vivado創建一個掛載在AXI總線上的自定義IP核 2.實驗步驟 2.1.創建一個新的項目 ? ? 2.2.調用Create
    的頭像 發表于 12-21 16:34 ?4777次閱讀
    PYNQ設計案例:基于HDL語言+Vivado的<b class='flag-5'>自定義</b><b class='flag-5'>IP</b>核<b class='flag-5'>創建</b>

    nios 自定義ip問題求助

    sopc builder中添加自定義ip,編寫自定義ip核的時候, avalon接口信號:clk、rst
    發表于 11-26 11:11

    自定義Python PyPI存儲庫

    。  建立自定義存儲庫  您需要執行以下操作來創建自己的自定義python存儲庫。  1. 托管Ubuntu服務器  2. 帶有TLS v1.2的P
    發表于 09-14 15:59

    EDK中PS2自定義IP

    Xilinx FPGA工程例子源碼:EDK中PS2自定義IP
    發表于 06-07 11:44 ?4次下載

    在NI Multisim中創建自定義元器件

    在NI Multisim中創建自定義元器件,NI Multisim雖然強大但芯片太少所以總結這方法
    發表于 07-20 17:21 ?0次下載

    利用SDSoC創建自定義硬件

    SDSoC是開發Zynq-7000 SoC應用程序的理想工具,當您可以在自己的定制板平臺上實現設計時,SDSoC變得更加強大。 有了這個視頻,看看創建自己的自定義硬件是多么容易..
    的頭像 發表于 11-26 06:25 ?3151次閱讀

    自定義sobel濾波IP核,IP接口遵守AXI Stream協議

    自定義sobel濾波IPIP接口遵守AXI Stream協議
    的頭像 發表于 08-06 06:04 ?4771次閱讀

    Python學習要點:自定義序列實現切片功能

    基于原生的序列類型(如字符串、列表、元組),那么,我們是否可以定義自己的序列類型并讓它支持切片語法呢?更進一步,我們是否可以自定義其它對象(如字典)并讓它支持切片呢? 1、魔術方法:__getitem__() 想要使自定義對象支
    發表于 11-24 11:51 ?1141次閱讀

    使用VIvado封裝自定IP并使用IP創建工程

    FPGA實際的開發中,官方提供的IP并不是適用于所有的情況,需要根據實際修改,或者是在自己設計的IP時,需要再次調用時,我們可以將之前的設計封裝成自定義
    的頭像 發表于 04-21 08:58 ?8224次閱讀

    教程 2:添加特征-自定義配置文件創建

    教程 2:添加特征 - 自定義配置文件創建
    發表于 03-15 19:39 ?0次下載
    教程 2:添加特征-<b class='flag-5'>自定義</b>配置文件<b class='flag-5'>創建</b>

    如何在TPT中使用Python實現自定義報告

    本文介紹在TPT中通過使用Python實現自定義庫生成報告的方法及過程,來提高測試效率,并且提高代碼的復用性。
    的頭像 發表于 08-01 14:23 ?1943次閱讀
    如何在TPT中使用<b class='flag-5'>Python</b>實現<b class='flag-5'>自定義</b>報告

    教程 2:添加特征-自定義配置文件創建

    教程 2:添加特征 - 自定義配置文件創建
    發表于 07-06 18:50 ?0次下載
    教程 2:添加特征-<b class='flag-5'>自定義</b>配置文件<b class='flag-5'>創建</b>

    Vivado設計套件用戶指南:創建和打包自定義IP

    電子發燒友網站提供《Vivado設計套件用戶指南:創建和打包自定義IP.pdf》資料免費下載
    發表于 09-13 14:54 ?1次下載
    Vivado設計套件用戶指南:<b class='flag-5'>創建</b>和打包<b class='flag-5'>自定義</b><b class='flag-5'>IP</b>

    Vivado Design Suite用戶指南:創建和打包自定義IP

    電子發燒友網站提供《Vivado Design Suite用戶指南:創建和打包自定義IP.pdf》資料免費下載
    發表于 09-13 11:34 ?0次下載
    Vivado Design Suite用戶指南:<b class='flag-5'>創建</b>和打包<b class='flag-5'>自定義</b><b class='flag-5'>IP</b>

    創建自定義的基于閃存的引導加載程序(BSL)

    電子發燒友網站提供《創建自定義的基于閃存的引導加載程序(BSL).pdf》資料免費下載
    發表于 09-19 10:50 ?0次下載
    <b class='flag-5'>創建</b><b class='flag-5'>自定義</b>的基于閃存的引導加載程序(BSL)