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