AXI自定義IP之UART調試


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的二級模塊的端口聲明沒有注意位寬,導致顯示的數據只有一位。但是與或非輸出都符合預期。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM