新建一个IP项目
vivado界面选择 Tools->Create and Package New IP
选择创建一个基于AXI4的IP, 为什么要选择AXI4呢? 因为AXI接口在ZYNQ ARM core核里能更好地进行读写,不然所有对该核的操作都得自已写私有的模块来处理,工作量稍大
中断,可选可不选.看应用需求.
打开IP项目
最后创建完成后,可能需要额用以下方式来打开刚才新建的IP.
了解IP包的结构
如下: 分别有顶层的封包接口文件以及内部各个verilog模块文件,目前这个项目里只有一个模块.
代码分析
打开顶层的verilog文件,大致如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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里连线,然后在软件里读写寄存器,收工