如何使用RPi Pico調(diào)試AMD FPGA AXI設(shè)計(jì)
我們在AMD FPGA和SoC中創(chuàng)建的設(shè)計(jì)實(shí)現(xiàn)了復(fù)雜的功能,例如電機(jī)控制,圖像處理,機(jī)器學(xué)習(xí)或信號處理。
像任何行業(yè)幫助開發(fā)可編程邏輯應(yīng)用程序一樣,我們使用標(biāo)準(zhǔn)接口來實(shí)現(xiàn)重用和簡化設(shè)計(jì)。在FPGA開發(fā)中最流行的接口是Arm可擴(kuò)展接口(AXI),它為開發(fā)人員提供了一個完整的高性能,如果需要的話,還可以緩存相干存儲器映射總線。
AXI是為管理者(事務(wù)的發(fā)起者)和下屬(事務(wù)的響應(yīng)者)之間的高速突發(fā)傳輸而設(shè)計(jì)的。AXI內(nèi)存映射總線提供以下通道
?地址寫—待寫的地址數(shù)據(jù),保護(hù)模式
?寫通道-寫數(shù)據(jù)突發(fā)
?寫響應(yīng)-完成數(shù)據(jù)爆發(fā)后的寫狀態(tài)
?Address Read -要讀取的地址,保護(hù)模式
?讀取通道-讀取數(shù)據(jù)突發(fā)
雖然AXI通常在一個管理者和多個下屬之間連接,但AXI是一個點(diǎn)對點(diǎn)協(xié)議。為了將單個經(jīng)理連接到多個下屬,我們需要使用實(shí)現(xiàn)交叉開關(guān)的AXI互連。
對于許多應(yīng)用程序,使用了AXI的精簡版本,它提供了稱為AXI Lite的單節(jié)拍讀寫訪問。
當(dāng)您第一次接觸FPGA設(shè)計(jì)時(shí),使用AXI可能是一個挑戰(zhàn),并且我們通常使用處理器來配置AXI網(wǎng)絡(luò)上的外設(shè)。
然而,通過UART從外部到FPGA訪問AXI網(wǎng)絡(luò)的能力對于板啟動和使設(shè)備在最終開發(fā)中相互通信非常重要。
在Adiuvo,我們開發(fā)了一個簡單的協(xié)議,可以從SPI, I2C或UART接口,并將實(shí)現(xiàn)對AXI網(wǎng)絡(luò)的讀寫訪問。我們開發(fā)的IP提供了進(jìn)行突發(fā)傳輸?shù)哪芰?,但是對于這個應(yīng)用程序,我們將研究如何在每個方向上進(jìn)行AXI Lite傳輸。
這種方法非常有用,因?yàn)槟梢苑浅:唵蔚貜耐獠吭L問AXI網(wǎng)絡(luò),并且在板啟動期間確定寄存器設(shè)置等,這對軟件可能很有用。它還可以在系統(tǒng)開發(fā)中實(shí)現(xiàn)從MCU到小型FPGA的簡單接口。
這個概念
其實(shí)現(xiàn)背后的概念是模塊化的,將通信接口與協(xié)議和AXI轉(zhuǎn)換分離開來。通過這種方式,可以根據(jù)具體情況使用不同的通信模塊。
在這種情況下,UART的通信接口將使用AXI流發(fā)送和接收信息。協(xié)議塊將AXI流字節(jié)轉(zhuǎn)換為AXI Lite命令,反之亦然。
然后,這個協(xié)議塊可以連接到AXI互連,從而可以訪問所有連接的AXI外圍設(shè)備。
該協(xié)議
為了能夠進(jìn)行傳輸,我們需要有一個定義好的協(xié)議,該協(xié)議能夠?qū)⒋罅孔止?jié)轉(zhuǎn)換為AXI讀或?qū)懨睢?
?寫操作碼- 1字節(jié),值0x09
?讀操作碼- 1字節(jié),值0x05
?地址- 4字節(jié)AXI交互的地址
?長度- 1字節(jié),對于AXI Lite實(shí)現(xiàn)總是1
?有效載荷-要寫的字或接收的數(shù)據(jù),為AXI Lite讀取或?qū)懭胩峁?字節(jié)
?要創(chuàng)建此解決方案,我們需要創(chuàng)建兩個自定義IP塊AXIS UART和協(xié)議塊
The UART
AXIS UART的代碼如下-這個UART沒有協(xié)議,需要2個停止位。
而所需的包裹是
AXIS協(xié)議
實(shí)現(xiàn)AXI協(xié)議的代碼可以在下面看到——如果你像Adiuvo那樣生產(chǎn)它,AXI狀態(tài)機(jī)可以被寫進(jìn)一個過程來簡化調(diào)用。
然后可以將這些模塊集成到新的Vivado項(xiàng)目中。
Vivado項(xiàng)目
對于這個Vivado項(xiàng)目,我將針對連接到其IO載波卡的MicroZed板,盡管這種方法可以與任何AMD SoC或FPGA一起使用。
我們還可以將上述UART和Protocol的文件添加到項(xiàng)目中。
一旦項(xiàng)目開放,我們需要將UART和協(xié)議塊添加到塊設(shè)計(jì)中。
還添加了AXI BRAM控制器和BRAM,最終的圖應(yīng)該如下所示:
生成輸出產(chǎn)品,我們就可以用cocotb來模擬設(shè)計(jì)了。
COCOTB模擬
Cocotb允許我們使用Python模擬設(shè)計(jì),如果您不確定如何設(shè)置Cocotb,請參閱我的博客
在cocotb中,我們需要一個python刺激文件和一個make文件,它可以拉入所有構(gòu)建對象。
python刺激文件如下所示
當(dāng)make文件看起來像-時(shí),您需要將項(xiàng)目名稱的路徑更新到它們在系統(tǒng)中的位置
一旦模擬顯示通過并報(bào)告通過UART編寫的信息,我們就可以構(gòu)建應(yīng)用程序并在硬件上進(jìn)行測試。
為了在硬件上構(gòu)建它,我將處理器核心插入到塊設(shè)計(jì)中,以啟用PS時(shí)鐘和復(fù)位。
更新后的框圖如下所示
硬件測試
我們可以使用任何LOGIC LEVEL UART來測試設(shè)計(jì),但是,我在辦公室里有幾個RPi PICO,它們可以制作出色的USB到UART轉(zhuǎn)換器,并使我能夠在PICO本身上編寫應(yīng)用程序。
為此,我將Pico上UART 0上的TX和RX引腳連接到FPGA RX和TX引腳。記住也要連接接地,這樣它們就有一個共同的參考。
該應(yīng)用程序是使用micro python在Pico上創(chuàng)建的
當(dāng)運(yùn)行我添加到調(diào)試設(shè)計(jì)中的System ILA時(shí),我們可以清楚地看到協(xié)議塊對AXI塊RAM控制器執(zhí)行的讀寫操作
我們可以看到數(shù)據(jù)在anthony中被讀回
結(jié)論
我們可以使用一個簡單的接口,如UART / SPI/ I2C來提供對AXI網(wǎng)絡(luò)的訪問。當(dāng)調(diào)試設(shè)計(jì)或使小型FPGA連接到小型MCU時(shí),這可以帶來很大的好處。
本文編譯自hackster.io