基于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的值输出结果。具体的细节后面再看。