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