基于AXI4的自定义IP核的设计

1、实验目标

利用vivado中内置的AXI总线初始化的IP核设计工具,将自己设计的流水灯的PL代码打包成IP核外设,挂在PS上,通过PS上的按钮控制流水灯的开始和结束。

2、实验原理

首先准备一个流水灯的代码,打包到AXI为基础的核上。然后利用PS访问这个部分并且控制开始与结束。

3、实验操作

(1)打开IP 核设计界面

tools》create and package new IP

第一页:简介部分,大致说明了主题功能,直接next就可以。

第二页:IP核的类型。默认的第三个是无总线的。第四个是有总线的。这里选择有总线的a new AXI4 peripheral即可next。

第三页:创建IP的基本信息,可以默认跳过。

第四页:创建AXI总线的设置。如名字、协议类型(这个在AXI总线的理论学习中接触过)、数据宽度、寄存器个数等设置。一般简单实验把寄存器个数设为最小的4,其他默认即可。

第五页:创建完后做什么。这里选择第二个编辑IP就可以自动打开IP设计器。

(2)添加Verilog文件

查看资源,这时候已经有了一个V顶层文件。这个文件是这个IP的顶层,用户自定义的PL设计也是要挂在这个顶层下的。如果对AXI协议比较熟悉的话,可以自己完成AXI总线的设计然后封装为AXI的IP核,跳过引导。这里先看一下如何利用引导快速将PL设计加入AXI的IP中。

这里的用法和FPGA的设计完全一致了,就是给了顶层,写好子模块就可以了。

module stream_led(
    input clk,
    input rst,
    output reg [3:0] led
    );
reg clk_div;
reg [25:0] cnt;
always@(posedge clk)begin
    if(rst)begin
        cnt<=26'd0;
    end
    else if(cnt==26'd10_000_000-1'b1)begin
        cnt<=26'd0;
    end
    else begin
        cnt<=cnt+1'b1;
    end
end
always@(posedge clk)begin
    if(rst)begin
        clk_div<=1'b0;
    end
    else if(cnt==26'd10_000_000-1'b1)begin
        clk_div<=~clk_div;
    end
end
always@(posedge clk_div)begin
    if(rst)begin
        led<=4'd0;
    end
    else begin
        case(led)
            4'b0000: led<=4'b0001;
            4'b0001: led<=4'b0010;
            4'b0010: led<=4'b0100;
            4'b0100: led<=4'b1000;
            4'b1000: led<=4'b0001;
            default: led<=4'b0000;
        endcase
    end
end
endmodule

由于时间关系,这里暂时完成到这一步。下面的操作需要分析vivado提供的模板,将AXI总线的理论和实验结合起来。这里需要不少时间。

4、实验结果

暂时先准备好代码,如何操作还需要找到一些资料来实现。大体的思路是将所需的端口挂在AXI总线的寄存器上。用一个寄存器做输入,一个寄存器做输出。其中clk直接引到顶层,通过PL连接出去。rst通过寄存器0的值输入控制。led通过寄存器1的值输出结果。具体的细节后面再看。