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

1,245次阅读
没有评论

新建一个 IP 项目

vivado 界面选择 Tools->Create and Package New IP
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)
选择创建一个基于 AXI4 的 IP, 为什么要选择 AXI4 呢? 因为 AXI 接口在 ZYNQ ARM core 核里能更好地进行读写, 不然所有对该核的操作都得自已写私有的模块来处理, 工作量稍大
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)
中断, 可选可不选. 看应用需求.

打开 IP 项目

最后创建完成后, 可能需要额用以下方式来打开刚才新建的 IP.
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

了解 IP 包的结构

如下: 分别有顶层的封包接口文件以及内部各个 verilog 模块文件, 目前这个项目里只有一个模块.
vivado 创建自已的 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 模块都有相应的说明.
下图中把我们刚才在顶层文件里的接口添加进去.
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

参数中的四个寄存器
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

我们可以在适当的 always 模块中添加自已的代码来寄现一些功能. 比如在写某个寄存器时我们就把对应的值输出到 LED 对应的 wire 上
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

在任何时刻, 都把 SW 的值放入 reg0
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

修改完成后, 运行下综合, 然后做最后的检查.
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

使用 IP

与系统内置 IP 没多大区别. 放到 block desing 里连线, 然后在软件里读写寄存器, 收工
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)
vivado 创建自已的 IP 核(封装自已的 Verilog 模块)

正文完
 0
评论(没有评论)