AXI4從機總線分析驗證之讀取寄存器值
1、實驗目的
利用前面所學的AXI4總線協議的理論分析,驗證如何將一個PL的輸入信號通過AXI發送到PS端。大致思路就是取一個按鍵,信號接入自建的AXI4的IP中,取代AXI4中reg_data_out成為AXI4該寄存器從地址的讀取信號。然后通過PS發送到另外一個緩存寄存器,該寄存器再由PL端連接到外部電路。
2、實驗操作
(1)打包IP
在tools的create IP中就可以初始化一個AXI4的slave的總線IP,進入編輯界面后即可編輯文件。這里只需要對reg_data_out的賦值語句修改即可發送輸入的信號。
assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; always @(*) begin // Address decoding for reading registers case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) 2'h0 : reg_data_out <= slv_reg0; 2'h1 : reg_data_out <= BTN; //slv_reg1; 2'h2 : reg_data_out <= slv_reg2; 2'h3 : reg_data_out <= slv_reg3; default : reg_data_out <= 0; endcase end
對應的頂層的IP口及調用口和子模塊的端口聲明則是純FPGA的知識,這里不做介紹。
這里有個問題就是打包第一次的IP不會加入自定義的端口,需要第二次打包。也不知道是哪個地方設置有問題。
(2)完善硬件
就是調用IP后使用自動連線和自動外延。LED和BTN需要自己引出。
(3)小問題
這里綜合時出現了一個缺少DCP的問題,好像是因為自建的IP沒有DDR的支持,具體原因可以去網上查找。解決方法就是reset_project指令輸到TCL控制台即可解決。
(4)輸出bitstream,輸出硬件文件xsa
在配置好端口后即可直接生成bit流。
(5)軟件設計
vitis創建工程后,使用xil_Out32和xil_In32就可以實現數據的讀取操作和寫入操作。這里最簡單的驗證方法就是把讀的數據寫入到對應的地方。
#include "xil_io.h" #include "sleep.h" #include "stdio.h" #include "xparameters.h" #define IP_BASE XPAR_MYIP_V1_0_0_BASEADDR #define REG0_OFFSET 0 #define REG1_OFFSET 4 int main(){ int BTN; while(1){ BTN=Xil_In32(IP_BASE+REG1_OFFSET); Xil_Out32(IP_BASE+REG0_OFFSET,BTN); } }
含有main函數的文件,代碼還是簡單的。
3、實驗結果
板級驗證說明設計是成功的。reg_data_out就是數據發送的緩存器。