首页 » FPGA » 正文

vivado 创建自已的IP核(封装自已的Verilog模块)

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

发表评论