使用在Xilinx Vivado中創(chuàng)建的定制PL設計控制KR260上的用戶定義LED,并通過APU的PYNQ進行控制
本項目演示了如何在Vivado中創(chuàng)建一個簡單的PL設計來控制KR260載波板上的用戶定義LED (DS7和DS8)。該設計使用了一個通過AXI SmartConnect連接到Zynq UltraScale+處理系統(tǒng)(PS)的AXI GPIO IP核,實現(xiàn)了在APU上運行的Linux對led的軟件控制。
這是針對Xilinx KR260的自定義Yocto Linux和網(wǎng)絡啟動的后續(xù)項目,該文章提供了具有PYNQ、XRT和網(wǎng)絡啟動功能的基礎Linux環(huán)境。
問題陳述
在KR260上開發(fā)FPGA應用時,通常需要:
?創(chuàng)建與PS交互的定制PL設計
?快速原型和測試硬件設計,沒有冗長的編譯周期
?在與更復雜的應用程序集成之前驗證硬件功能
?準備與RPU固件或自定義Linux驅動程序集成的硬件設計
傳統(tǒng)FPGA開發(fā)工作流程要求:
?編寫HDL代碼或使用IP積分器
?綜合和實現(xiàn)設計
?生成比特流
?閃爍SD卡或手動加載比特流
?編寫C/ c++應用程序與硬件交互
這個項目通過以下方式簡化了這個工作流程:
?使用Vivado的IP Integrator進行視覺設計
?利用PYNQ進行基于python的硬件交互
?通過網(wǎng)絡引導和動態(tài)比特流加載實現(xiàn)快速迭代
系統(tǒng)架構
硬件體系結構
PL設計包括:
軟件架構
設計組件
Zynq UltraScale+ PS: ARM Cortex-A53內核的處理系統(tǒng)
?M_AXI_HPM0_LPD: PL訪問的低功率域主端口
?PL_CLK0: 100mhz時鐘輸出到PL
?PL_RESETN0:復位信號到PL
AXI SmartConnect:用于AXI總線路由的互連IP
?連接PS主站到PL從站
?處理協(xié)議轉換和地址映射
axis GPIO:通用I/O IP核
?2位輸出通道(GPIO[1:0])
?AXI4-Lite從接口
?基址:由Vivado分配(通常在LPD地址空間0x80000000-0x9FFFFFFF中)
Processor System Reset:復位控制器
?同步復位信號
?提供重置到PL邏輯
先決條件
以前的項目設置
本項目假設您已經(jīng)完成了Custom Yocto Linux & Network Boot項目,該項目提供:
?可網(wǎng)絡引導的Yocto Linux鏡像
?PYNQ 3.1.2 runtime
?XRT和ZOCL支持
?在端口9090上的Jupyter Notebook服務器
?掛載在/nfsroot的NFS根文件系統(tǒng)
循序漸進的指導
步驟1:創(chuàng)建Vivado項目
?啟動Vivado并選擇Create Project
?項目設置:項目名稱:gpio_led
?項目位置:選擇您的工作空間目錄項目類型:RTL項目(默認)
?添加源:單擊Next(我們將使用IP Integrator創(chuàng)建設計)
?添加約束:單擊Next(稍后我們將添加約束)
?默認部件:選擇“KR260”的“Boards”選項卡,選擇“KR260 Robotics Starter kit”,單擊“Next”,完成
步驟2:創(chuàng)建塊設計
?在流程導航器中,單擊創(chuàng)建塊設計名稱:gpio_led
?單擊OK
?添加Zynq UltraScale+ PS:單擊圖中的“+”按鈕搜索Zynq UltraScale+ ps雙擊添加“zynq_ultra_pse_0”
?配置PS:雙擊PS塊在PS配置窗口,導航到PS- pl配置→GeneralEnable M_AXI_HPM0_LPD(低功耗域主端口)單擊運行塊自動化這將啟用M_AXI_HPM0_LPD, PL_CLK0和pl_resetn0單擊確定
步驟3:添加AXI GPIO IP
?添加AXI GPIO:點擊+按鈕搜索AXI GPIO雙擊添加ax_gpio_0
?配置AXI GPIO:雙擊GPIO blockGPIO:Check All OutputsGPIO Width: 2單擊OK
?運行連接自動化:
?單擊“運行連接自動化”
?選擇全部自動化
?這將:連接PS M_AXI_HPM0_LPD到AXI smartconnect連接AXI SmartConnect到AXI GPIOConnect時鐘和復位信號
?單擊OK
步驟4:使GPIO外部
?創(chuàng)建外部端口:右鍵單擊ax_gpio_0 GPIO端口選擇Make ExternalRename the Port to led_output
?驗證設計:單擊驗證設計(F6)確保沒有錯誤或嚴重警告
?創(chuàng)建HDL包裝器:右鍵單擊源代碼中的gpio_led塊設計,選擇創(chuàng)建HDL包裝器,選擇讓Vivado管理包裝器并自動更新,單擊OK
步驟5:添加引腳約束
?創(chuàng)建約束文件:在“源”中,右鍵單擊“約束”→“約束”,選擇“添加源”→“添加或創(chuàng)建約束”,單擊“創(chuàng)建文件”,文件名:gpio_led.xdc
?單擊OK并完成
添加引腳約束:打開gpio_led。XDC并添加:
?保存約束文件
步驟6:綜合設計
?運行合成:在Flow Navigator中單擊Run Synthesis等待合成完成(5-10分鐘取決于PC)
?評審綜合結果:檢查是否有錯誤或嚴重警告,驗證資源利用是否合理
步驟7:執(zhí)行設計
?運行實現(xiàn):點擊運行實現(xiàn)等待實現(xiàn)完成(10-20分鐘,取決于PC)
?檢查實現(xiàn)結果:檢查定時關閉驗證無嚴重警告
步驟8:生成比特流
?生成比特流:單擊“生成比特流”,等待比特流生成(PC機不同,需要5-10分鐘)。
?校驗輸出文件:生成比特流后,校驗這些文件是否存在:gpio_led.runs/impl_1/gpio_led_wrapper.bit - bitstream filegpio_led.gen/sources_1/bd/gpio_led/ hw_handdoff /gpio_led. gen/hwh -硬件描述
步驟9:導出硬件
?導出硬件:在Flow Navigator中,進入File→Export→Export HardwareSelect Include bitstreamClick NextExport位置:Default(項目目錄)文件名:gpio_led.xsa
?單擊“完成”。xsa文件將在下一個項目中用于RPU與Vitis的集成。
步驟10:將文件復制到NFS共享
?定位生成文件:Bitstream: gpio_led_runs /impl_1/gpio_led_wrapper.bit
?硬件描述:gpio_led.gen/sources_1/bd/gpio_led/hw_handoff/gpio_led.hwh
?拷貝到NFS根目錄:在你的NFS服務器上(/nfsroot掛載的地方):
步驟11:創(chuàng)建PYNQ筆記本
?創(chuàng)建筆記本文件:創(chuàng)建led_blink_pynq?!?nfsroot/home/xilinx/Notebook/”目錄下的ipynb
?或者將其創(chuàng)建為Python腳本并進行轉換,或者使用Jupyter的web界面。
步驟12:在KR260上驗證
?運行Notebook:執(zhí)行第一個cell以重置pl_execute第二個cell以加載比特流并運行KR260板上的LED patternObserve LEDs DS7和DS8
預期的行為:
?預期行為:LED0 (DS8)和LED1 (DS7)將以行走模式閃爍:模式1:LED0 ON, LED1 OFF (0x1)模式2:LED0 OFF, LED1 ON (0x2)模式3:Both LEDs ON (0x3)模式4:LED0 OFF, LED1 ON (0x2)重復5次,循環(huán)之間暫停0.5s
了解守則
PYNQ疊加加載
PYNQ的Overlay類:
?將比特流加載到FPGA中
?解析。了解HWH文件的硬件結構
?為每個IP核創(chuàng)建Python對象(例如,overlay.axi_gpio_0)
AXI GPIO訪問
?axi_gpio_0是來自于Vivado塊設計的實例名
?channel1是GPIO通道(channel1是第一個通道)
?GPIO對象提供read()和write()方法
LED控制
?pattern:要寫的值(0x0到0x3為2位)
?mask:表示要影響哪位的位掩碼(0x3 =兩個位)
設計注意事項
PS-PL接口選擇
?使用M_AXI_HPM0_LPD(低功率域)代替FPD(全功率域)
?原理:GPIO控制需要低帶寬,使LPD理想的功率效率
?LPD為GPIO操作提供了足夠的性能,同時功耗更低
?FPD端口更適合高帶寬應用(視頻處理、DMA等)。
時鐘域
?PL時鐘:100 MHz(來自PS PL_CLK0)
?AXI總線時鐘:100mhz(與PL時鐘同步)
?GPIO更新速率:受Python循環(huán)速度限制(本例中為~ 4hz)
GPIO配置
?所有輸出:GPIO配置為僅輸出(無輸入能力)
?寬度:2位(匹配兩個led)
?I/O標準:LVCMOS18(兼容KR260 HP bank)
地址空間
?AXI GPIO基址:0x80000000 (LPD地址空間)
?地址范圍:64 KB(標準的AXI4-Lite slave)
?可以通過PYNQ從Linux用戶空間訪問
注:LPD (Low Power Domain)使用0x80000000地址范圍,適用于GPIO和其他低帶寬外設
下一個步驟
該項目為更高級的PL開發(fā)提供了基礎:
?增加更多的GPIO:擴展到控制額外的led或讀開關
?自定義IP集成:在設計中添加自定義AXI IP內核
?中斷支持:為事件驅動控制配置GPIO中斷
?RPU集成:將LED控制邏輯移動到RPU(見下一個項目)
?下一步:RPU與FreeRTOS集成
本系列的下一個項目將演示:
?使用賽靈思Vitis Unified IDE為RPU構建FreeRTOS應用程序
?使用XRT從APU加載PL位流
?使用remoteproc框架加載RPU固件
?通過libmetal和OpenAMP實現(xiàn)APU-RPU通信
?APU、RPU和PL之間的共享內存
?實時LED控制從RPU,而APU處理高級任務
這將展示KR260的完整異構計算能力,結合:
?APU:用于高級控制和網(wǎng)絡的Linux
?RPU:用于實時、確定性任務的FreeRTOS
?PL:定制硬件加速器和I/O
本文編譯自hackster.io





