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





