AXI自定義IP之UART調試
1、實驗原理
前面的自定義IP中已經將AXI總線的大部分接口設置都一一驗證了。基本掌握了關鍵接受寄存器slv_reg和發送寄存器data_reg_out,可以基本實現簡單的PL和PS的聯合設計。但是,限於開發板的測試手段有限,只有一個按鍵和四個LED燈,限制了對復雜設計的測試能力。這里將PS端的一些常用接口利用起來,用於滿足測試需求。本次實驗使用的是UART串口顯示。這個串口可以聯系到上位機,可以有效提高測試能力。還有一些其他的資源也會用到,但是比較簡單,比如GPIO的使用,調用一個IP就可以了,就不會設置專門的實驗驗證了。
2、實驗操作
(1)hw(hardware硬件)界面操作
新建一個自建IP所需的verilog模塊,這里這是復習前面的調用PL的模塊,所以設計比較簡單。
module multi_n( input wire [31:0] numb_n1, input wire [31:0] numb_n2, output wire [31:0] result_and, output wire [31:0] result_or, output wire [31:0] result_not ); assign result_and = numb_n1 & numb_n2; assign result_or = numb_n1 | numb_n2; assign result_not = ~numb_n1; endmodule
(2)IP界面的操作
這里需要通過新建一個自定義AXI的IP進入IP界面。進入IP設計后,在二級模塊調用hw界面中新建的文件(先要添加到IP編輯界面),注意暫存信號的位寬設置。
修改部分:(注意聲明信號前置)
//user wire [31:0] slv_reg2_wire; wire [31:0] slv_reg3_wire; wire [31:0] slv_reg4_wire; //end user always @(*) begin // Address decoding for reading registers case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) 3'h0 : reg_data_out <= slv_reg0; 3'h1 : reg_data_out <= slv_reg1; 3'h2 : reg_data_out <= slv_reg2_wire; 3'h3 : reg_data_out <= slv_reg3_wire; 3'h4 : reg_data_out <= slv_reg4_wire; 3'h5 : reg_data_out <= slv_reg5; default : reg_data_out <= 0; endcase end multi_n U1( .numb_n1(slv_reg0), .numb_n2(slv_reg1), .result_and(slv_reg2_wire), .result_or(slv_reg3_wire), .result_not(slv_reg4_wire) );
修改完后就可以打包文件,創建IP。這里總是需要打包兩次才能將做好(代碼總是容易出問題)。在第二次重復操作時出現IP在某個具體設計bd文件中鎖死的情況,這個時候刪除重來新調用IP就可以。
(3)hw界面的bd窗口設計
bd設計沒有需要外連的端口,直接調用后自連自引即可。最后刷新IP和創建實例module,生成bit流即可實現硬件平台的設計。
(4)sw(software軟件)界面的設計
直接建立C語言工程,可以直接使用helloworld的模版,可以快速添加所需的頭文件。
#include <stdio.h> #include "platform.h" #include "xil_printf.h" #include "xil_io.h" #include "xparameters.h" #define ADR_BASE XPAR_MYIP_V1_0_0_BASEADDR #define ADR_REG0 0 #define ADR_REG1 4 #define ADR_REG2 8 #define ADR_REG3 12 #define ADR_REG4 16 int main() { init_platform(); unsigned int a; unsigned int b; unsigned int c; unsigned int d; unsigned int e; print("Hello World\n\r"); a=2; b=3; Xil_Out32(ADR_BASE+ADR_REG0,a); Xil_Out32(ADR_BASE+ADR_REG1,b); c=Xil_In32(ADR_BASE+ADR_REG2); d=Xil_In32(ADR_BASE+ADR_REG3); e=Xil_In32(ADR_BASE+ADR_REG4); printf("and= %d\n" ,c); printf("or= %d\n" ,d); printf("not= %d\n" ,e); cleanup_platform(); return 0; }
這個設計就是通過操作五個緩存寄存器實現自定義IP的功能測試。
圖中使用的函數比較好理解,就不詳細說明了。
(5)Teminal窗口觀測
在windows》terminal就可以選擇設置,讀取串口數據。注意選擇serial terminal,這個模式才是串口模式。其他模式暫時沒有接觸過,暫時不了解。結果會隨着調試顯示在對應的位置。
3、實驗結果
板級測試的結果符合預期。不過由於前面的自定義IP的二級模塊的端口聲明沒有注意位寬,導致顯示的數據只有一位。但是與或非輸出都符合預期。