AXI-自定义IP-PS设计
Posted electricdream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AXI-自定义IP-PS设计相关的知识,希望对你有一定的参考价值。
基于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的值输出结果。具体的细节后面再看。
以上是关于AXI-自定义IP-PS设计的主要内容,如果未能解决你的问题,请参考以下文章