在 Vivado 中自定義 AXI4-Lite 接口的 IP,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 LED 控制功能,并將其掛載到 AXI Interconnect 總線互聯(lián)結(jié)構(gòu)上,通過(guò) ZYNQ 主機(jī)控制,后面對(duì) Xilinx 提供的整個(gè) AXI4-Lite 源碼進(jìn)行分析。
整體系統(tǒng)如下所示:
一、封裝 AXI-Lite 協(xié)議的 IP
1. 新建一個(gè)工程
2. 打包 IP 工程
Tools 下選擇創(chuàng)建并打包一個(gè)新的 IP。
選擇創(chuàng)建一個(gè)新的帶AXI4總線的 IP。
IP命名。
IP 的 AXI4-Lite 總線的配置:
(1)選擇 Lite 總線;
(2)選擇 Slave 設(shè)備從機(jī)模式,這里考慮到我們的實(shí)際應(yīng)用,以 ZYNQ 的 PS 做主機(jī) Master,來(lái)讀寫(xiě)自定義的從機(jī)LED IP;
(3)數(shù)據(jù)位寬 32-bit;
(4)內(nèi)部寄存器最少為4個(gè),這里選擇4,實(shí)際上本例中只使用了 1 個(gè),這里的 4 就代表內(nèi)部由 4 個(gè) 32 位的寄存器,依次命名為 slv_reg0 ~ slv_reg3。
按照微機(jī)尋址的思想,當(dāng)找到設(shè)備的基地址后,加上偏移地址能夠找到設(shè)備的內(nèi)部寄存器。這里,當(dāng)偏移地址為 0 時(shí),表示 slv_reg0,偏移地址為 4 時(shí)(4 個(gè)字節(jié),32-bit),表示 slv_reg1,8 代表 slv_reg3,12 代表 slv_reg4。
例子中只使用 slv_reg0,偏移地址為0,這個(gè)在 ZYNQ 的 PS 端編程時(shí)使用。
上述配置完成后,編輯IP,會(huì)自動(dòng)打開(kāi)一個(gè)新的工程,在 AXI-Lite 接口協(xié)議基礎(chǔ)上,添加自定義的端口和用戶邏輯。
3. 修改 IP
打開(kāi)底層的代碼, 在第18行添加自己需要的輸出端口 。
ZC706的 PL 側(cè)有 4 個(gè) LED 可供操作,這里定義輸出 4 位去控制 LED。
中間的實(shí)現(xiàn)邏輯先不看,是 AXI-Lite 協(xié)議中的 Valid、Ready 握手信號(hào)的產(chǎn)生以及讀、寫(xiě)、響應(yīng)等操作,后面再進(jìn)行具體的分析。
找到尾部第401行,添加用戶邏輯 ,上面我們已經(jīng)說(shuō)了PS 側(cè)向 slv_reg0 寫(xiě)入 LED 的控制信息,這里從 slv_reg 讀出控制信息,低 4 位為需要的有效控制信息。
完成底層的端口和用戶邏輯后, 在頂層中第 18 行也加入輸出端口 ,并在 例化底層時(shí)第 51 行將新加入的端口進(jìn)行連接 。
修改后,打包 IP 時(shí)可能出現(xiàn)如 1處所示的編輯圖樣,在 2 處點(diǎn)擊藍(lán)色字體會(huì)自動(dòng)更新,點(diǎn)擊 3 處打包。
二、使用自定義的 AXI-Lite的IP
找到開(kāi)始時(shí)的新建工程,新建一個(gè) Block Design 原理圖設(shè)計(jì)文件,添加 IP 時(shí)就可以搜索到自定義的 LED_MyIP_Lite。
添加 ZYNQ,使用自動(dòng)連接會(huì)自動(dòng)添加復(fù)位邏輯和 AXI總線互聯(lián)結(jié)構(gòu),添加一個(gè) ILA 集成邏輯分析儀,并設(shè)置成 AXI4 LITE 接口,引出 LED 輸出,原理圖文件右鍵生成頂層 wrapper。
對(duì) ILA 的配置。
新建約束文件,增加 4 個(gè) LED的物理約束,由于使用的是 Xilinx 的 FPGA評(píng)估版,其他引腳的約束已經(jīng)由系統(tǒng)自動(dòng)完成。
可以打開(kāi)閱讀一下 Xilinx 給的一些約束,如下圖所示,首先對(duì)時(shí)鐘頻率和抖動(dòng)進(jìn)行時(shí)序約束,然后對(duì)輸入輸出引腳進(jìn)行物理約束,最重要的是“電平標(biāo)準(zhǔn)”和“引腳位置”。
綜合、布局布線、生成 bitstream 后,導(dǎo)出硬件到 SDK。
新建 SDK 工程,加入代碼如下,設(shè)置基地址和偏移地址。
三、運(yùn)行結(jié)果
Run As 下載觀察流水燈效果。
Debug As 下載,Vivado 中連接硬件,打開(kāi) ILA。
對(duì)于寫(xiě)事務(wù),設(shè)置 WVALID和 WREADY 兩個(gè)均為 1 時(shí)觸發(fā);
對(duì)于讀事務(wù),設(shè)置檢測(cè) RVALID 和 RREADY 都為 1,兩個(gè)斷點(diǎn)處單步運(yùn)行。
(1)初始化
(2)寫(xiě)事務(wù)
寫(xiě)事務(wù)涉及到寫(xiě)地址通道、寫(xiě)數(shù)據(jù)通道和寫(xiě)響應(yīng)通道。測(cè)試時(shí),ZYNQ 的 PS 主機(jī)向 slv_reg0 寫(xiě) 1。
(3)讀事務(wù)
讀事務(wù)涉及到讀地址通道和讀數(shù)據(jù)通道。測(cè)試時(shí),ZYNQ 的 PS 主機(jī)向 slv_reg0 寫(xiě) 1,然后讀取該寄存器。
四、AXI4-Lite源碼分析
運(yùn)行 PS 端的程序,PL 端的 4 個(gè) LED 按照流水燈方式循環(huán)點(diǎn)亮。
改成 Debug 下載,并打開(kāi) ILA 集成邏輯分析儀,單步調(diào)試,設(shè)置觸發(fā)條件。
對(duì)于寫(xiě)事務(wù),設(shè)置檢測(cè) WVALID 和 WREADY 均有效;
對(duì)于讀事務(wù),設(shè)置檢測(cè) RVALID 和 RREADY 都有效。
【 FPGA探索者 】公眾號(hào)內(nèi)回復(fù)【 AXI源碼分析 】獲取AXI-Lite工程源碼及注釋。
(1)寫(xiě)事務(wù)
寫(xiě)事務(wù)涉及到寫(xiě)地址通道、寫(xiě)數(shù)據(jù)通道和寫(xiě)響應(yīng)通道。
(a)AWADDR[3:0] 寫(xiě)地址
AWADDR[3:0] = 0,表示寫(xiě) slv_reg0。
主機(jī)(ZYNQ的PS)給出從機(jī)的基地址 0x43C00000 和 偏移地址 0x0,其中基地址主要用于對(duì)整個(gè)從機(jī)的尋址,偏移地址用于對(duì)從機(jī)內(nèi)部寄存器的尋址。
偏移地址為0,對(duì)應(yīng) AXI_AWADDR[3:0] = 0,在 32 位 WDATA 寫(xiě)數(shù)據(jù)配置下,AXI_AWADDR[3:2] 表示選擇寫(xiě)哪個(gè)寄存器,
=0 時(shí)寫(xiě) slv_reg0;
=1 時(shí)寫(xiě) slv_reg1;
=2 時(shí)寫(xiě) slv_reg2;
=3 時(shí)寫(xiě) slv_reg3;
對(duì)應(yīng)到 AXI_AWADDR[3:0] 就是 0 / 4 / 8 / 12。
(b)AWPORT[2:0] 寫(xiě)保護(hù)
AWPORT[2:0] = 1,即 3'b001,表示特權(quán)且安全的寫(xiě)入數(shù)據(jù)信息。
AWPORT[2:0] 提供三種級(jí)別的寫(xiě)入保護(hù),提供用于禁止非法傳輸事務(wù)的訪問(wèn)權(quán)限:
(c)AWREADY 和 WREADY 準(zhǔn)備好
根據(jù) Xilinx 的 AXI-Lite 源碼,對(duì)于從機(jī)部分,當(dāng)檢測(cè)到主機(jī)發(fā)出的 AWVALID 寫(xiě)地址有效 和 WVALID 寫(xiě)數(shù)據(jù)有效同時(shí)有效的下一個(gè)時(shí)鐘的上升沿,將從機(jī)部分的 AWREADY 和 WREADY 拉起接收寫(xiě)地址和寫(xiě)數(shù)據(jù)。
對(duì) AWREADY 寫(xiě)地址準(zhǔn)備好:
對(duì) WREADY 寫(xiě)數(shù)據(jù)準(zhǔn)備好:
(d)WDATA[31:0] 寫(xiě)數(shù)據(jù)
當(dāng) WVALID 和 WREADY 都為高電平的時(shí)候,WDATA 有效,此處表示有效的寫(xiě)數(shù)據(jù)是 0x0000_0001。
按照設(shè)計(jì),將該數(shù)據(jù)寫(xiě)入到 slv_reg0,并取低 4 位賦值給 LED。
這樣,LED[3:0] = 4'b0001,點(diǎn)亮其中一個(gè) LED。
(e)WSTRB[3:0] 寫(xiě)閥門(mén)
WSTRB[3:0] = 4'hf,即 4'b1111,表示 32 位的 WDATA 都有效,4 位分別表示 4 個(gè)字節(jié)。
WSTRB[3:0]:對(duì)應(yīng)哪個(gè)寫(xiě)字節(jié)有效,WSTRB[n] 對(duì)應(yīng) WDATA[8n+7 : 8n],WSTRB[3:0] 對(duì)應(yīng) 32 位的寫(xiě)數(shù)據(jù) WDATA。
WVALID 為低電平時(shí),WSTRB 可以為任意值;
WVALID 為高電平有效時(shí),WSTRB 為高的字節(jié)線必須指示有效的數(shù)據(jù)。
窄傳輸:
當(dāng)主機(jī)產(chǎn)生比數(shù)據(jù)總線寬度更窄的數(shù)據(jù)傳輸時(shí),比如 32 位數(shù)據(jù)總線上只傳輸 8 bit 信息,且利用最低的 8 位傳輸,則 WSTRB[3:0] = 4'b0001。下面圖片注釋有誤,應(yīng)該是[7:0]
(f)BRESP[1:0] 和 BVALID
BRESP[1:0] 寫(xiě)響應(yīng)信息;
= 0 表示正常寫(xiě)入成功(OKAY);
= 1 表示獨(dú)占式寫(xiě)入(EXOKAY,AXI4-Lite 不支持獨(dú)占式讀寫(xiě),AXI4 中表示獨(dú)占式寫(xiě)入成功);
= 2 表示設(shè)備錯(cuò)誤(SLVERR);
= 3 表示譯碼錯(cuò)誤(DECERR)。
根據(jù) Xilinx 的 AXI-Lite 源碼,對(duì)于從機(jī)部分,當(dāng)檢測(cè)到主、從機(jī)的寫(xiě)數(shù)據(jù)/寫(xiě)地址通道上的 VALID 和 READY 都有效時(shí),在下一個(gè)時(shí)鐘的上升沿給出寫(xiě)響應(yīng)有效信號(hào) BVALID。
(2)讀事務(wù)
讀事務(wù)涉及到讀地址通道和讀數(shù)據(jù)通道。
測(cè)試時(shí),ZYNQ 的 PS 主機(jī)向 slv_reg0 寫(xiě) 1,然后讀取該寄存器。
(a)ARREADY 讀準(zhǔn)備好
當(dāng)檢測(cè)到主機(jī)發(fā)來(lái)的有效的讀地址(S_AXI_ARVALID),并且自身的 ARREADY 還沒(méi)拉高,那么下一個(gè)時(shí)鐘的上升沿拉高。
(b)RVALID 讀數(shù)據(jù)有效和 RRESP 讀響應(yīng)信息
當(dāng) ARREADY 拉高后,如果此時(shí)主機(jī)的 ARVALID 還是有效,且此時(shí)從機(jī)還沒(méi)有給出都數(shù)據(jù)有效信號(hào) RVALID,則在下一個(gè)時(shí)鐘的上升沿給出 RVALID 有效信號(hào),且同時(shí)給出讀響應(yīng)信息。
讀響應(yīng)信息 RRESP[1:0] 的含義和前文的寫(xiě)響應(yīng) BRESP[1:0] 一樣:
= 0 表示正常讀取成功;
= 1 表示獨(dú)占式讀取(AXI4-Lite 不支持獨(dú)占式讀寫(xiě),AXI4 支持);
= 2 表示設(shè)備錯(cuò)誤;
= 3 表示譯碼錯(cuò)誤。
(c)RDATA[31:0] 讀數(shù)據(jù)
與寫(xiě)事務(wù)的分析一樣,根據(jù)讀地址中的控制信息 axi_araddr[3:2] 表明 從 slv_reg0 中讀出數(shù)據(jù),并寫(xiě)入到讀數(shù)據(jù)通道的 RDATA 上。
評(píng)論