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、IO接口头文件
如果做过裸奔的应用程序,可以看到用户app最终调用的接口无非是下面这一类函数:

在这里插入图片描述

参考连接:
1、https://www.cnblogs.com/electricdream/p/13281611.html ;
2、https://wenku.baidu.com/view/5a4d9e90974bcf84b9d528ea81c758f5f61f29d9.html ;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值