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