新建一个 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 里连线, 然后在软件里读写寄存器, 收工
正文完