新建一个IP项目
vivado界面选择 Tools->Create and Package New IP
选择创建一个基于AXI4的IP, 为什么要选择AXI4呢? 因为AXI接口在ZYNQ ARM core核里能更好地进行读写,不然所有对该核的操作都得自已写私有的模块来处理,工作量稍大
中断,可选可不选.看应用需求.
打开IP项目
最后创建完成后,可能需要额用以下方式来打开刚才新建的IP.
了解IP包的结构
如下: 分别有顶层的封包接口文件以及内部各个verilog模块文件,目前这个项目里只有一个模块.
代码分析
打开顶层的verilog文件,大致如下:
module ledkeyV2_v2_0 #
(
// Users to add parameters here, 参数是用来配置用.
// User parameters ends
// Do not modify the parameters beyond this line
// Parameters of Axi Slave Bus Interface S00_AXI
parameter integer C_S00_AXI_DATA_WIDTH = 32,
parameter integer C_S00_AXI_ADDR_WIDTH = 4
)
(
// Users to add ports here 在下面添加自已的输入输出端口,现在添加了一个输入与一个输出
input [7:0] sw,
output [7:0] led,
// User ports ends
// Do not modify the ports beyond this line 人家说下面的别动,我们就别去动
// Ports of Axi Slave Bus Interface S00_AXI
input wire s00_axi_aclk,
// .... 略 .... 其他输入输出..
input wire s00_axi_rready
);
// Instantiation of Axi Bus Interface S00_AXI .这里添加了个 ledkeyV2_v2_0_S00_AXI这个模块
ledkeyV2_v2_0_S00_AXI # (
.C_S_AXI_DATA_WIDTH(C_S00_AXI_DATA_WIDTH), // 将参数传递到对应的模块里
.C_S_AXI_ADDR_WIDTH(C_S00_AXI_ADDR_WIDTH)
) ledkeyV2_v2_0_S00_AXI_inst (
.led(led), // 这两行是自已添加的,把led与模块里的port连起来
.sw(sw),
.S_AXI_ACLK(s00_axi_aclk),
.S_AXI_ARESETN(s00_axi_aresetn),
//.... 略 .....
.S_AXI_RREADY(s00_axi_rready)
);
// Add user logic here
// User logic ends
endmodule
再看看模块文件的veilog文件. 我们可以在这个文件里实现各种我们想要的功能了,每个always模块都有相应的说明.
下图中把我们刚才在顶层文件里的接口添加进去.
参数中的四个寄存器
我们可以在适当的 always模块中添加自已的代码来寄现一些功能.比如在写某个寄存器时我们就把对应的值输出到 LED对应的wire上
在任何时刻,都把SW的值放入reg0
修改完成后,运行下综合,然后做最后的检查.
使用IP
与系统内置IP没多大区别.放到block desing里连线,然后在软件里读写寄存器,收工
正文完