Skip to content

在总线上挂载IP

实验目标

Wujian100中有留有许多dummy模块,可供用户自定义设计。本文档使用AHB总线上的Dummy0模块,通过写寄存器的方式控制RGB LED外设。

本次实验在vivado中建立自己的IP,IP为AXI4接口。基于三色LED灯的控制需要9位,这里用32位寄存器0的低9位作为控制输出。挂载IP到wujian100、实现与验证功能。

实验步骤

1. 建立Block Design

Wujian100软核为AHB总线,VIVADO支持 AXI总线IP,需要用到AHB-Lite to AXI Bridge转接模块。
点击Create Block Design,输入设计名,打开Block Design界面。

点击加号添加IP,搜索AHB-Lite to AXI Bridge,选择双击添加。

点击模块,按图标或Ctrl+T引出端口。该桥接模块作为AXI主机,自定义IP为AXI从机。

后面需要对源文件中的端口名进行修改,这里将后缀去掉,待会编辑的时候方便一点

创建自己的AXI IP核,自定义AXI IP。点击Tools->Create and Package New IP。

点击Next。

选择创建AXI外围的IP,点击Next。

可对IP自己命名,写描述。

桥是master ,我们就创建slave的模式。如下图,点击Next。

点击左侧IP Catalog,打开IP管理器,看到刚才添加的myio→ 右击myio_v1.0 → Edit in IP Packager选项,单击OK,此时系统会自动打开另一个Vivado IDE来对用户IP核进行编辑。

在本模块中,设定有4个寄存器,每个寄存器位宽 32 位。这里通过往寄存器中写数据,来达到控制输出端口电平,从而控制三色灯的输出。将输出端口连接寄存器寄存器。
双击进入myio_v1_0_S00_AXI,设计文件里面有用户代码区域。
根据需求增加端口声明和添加用户信号。这里增加一个output [31:0]myio用于控制三色灯。

根据需求,添加用户逻辑代码。这里增加assign myio = slv_reg0; 将输出连上寄存器0。

双击击进入IP的顶层,增加output [31:0]myio

例化中增加.myio(myio),

将更改刷新。切换到Package IP-myio窗口,单击如图所示链接,对刚才修改过的顶层文件进行更新。

重新打包一下IP

现在可以使用这个IP了,将IP添加进Block Design。

但它们的AXI port仍然有点差异,连接不上,需要加一个互联的IP

添加AXI Interconnect模块

双击打开AXI Interconnect模块,Slave和Master的接口都为1。

可以鼠标拖拽,连接端口

直接点击自动连接

自动连接所以,点击确定。

在自动布线后,出现了一个新的模块连接rst信号,这里把它删掉,自己手动连接。

将reset信号手动连好。

选中myio模块,ctrl+t引出输出

与之前一样修改名称,改为myio

分配地址。去Adress Editor界面,找到myio_0,右键点击Assign。

将地址修改为dummy0的首地址0x4001_0000。

回到diagram窗口,点击验证一下,没有错误,退出block design。

2. 挂IP到wujian100

生成IP的Wrapper。在Source里找到生成的ahb_axi,右键Generate Output Products

再右键点击Create HDL Wrapper。

点击OK。

可以看到生成了wrapper,可以被调用,或者再加一层文件进行调用。

给自己的design加一层顶层文件。点击+号,新建设计源文件。

Create File。File name为myio_top。点击Finish。

点击OK,点击Yes。

要将main_dummy_top0替换成myio_top。在myio_top中例化ahb_axi_wrappper,并添加与原dummy模块文件中相同的端口。

相关RTL代码:

module myio_top(haddr, hclk, hprot, hrdata, hready, hresp, hrst_b, hsel, hsize, htrans, hwdata,  hwrite, hburst,//新增
  intr,
  myio//新增
);
output [31:0] myio;
input   hburst;
input   [31:0]  haddr;        
input           hclk;         
input   [3 :0]  hprot;        
input           hrst_b;       
input           hsel;         
input   [2 :0]  hsize;        
input   [1 :0]  htrans;       
input   [31:0]  hwdata;       
input           hwrite;       
output  [31:0]  hrdata;       
output          hready;  
output  [1 :0]  hresp;    
output                intr;    
wire  [31:0]  hrdata;       
wire          hready;  
wire  [1 :0]  hresp;    
wire          intr;
wire [2:0] hburst;
wire hready_in;
assign hready_in = hready;
wire [31:0] myio;    
ahb_axi_wrapper u_ahb_axi_wrapper(//例化ahb_axi_wrapper模块
   .AHB_INTERFACE_haddr      (haddr),
   .AHB_INTERFACE_hburst     (hburst),
   .AHB_INTERFACE_hprot      (hprot),
   .AHB_INTERFACE_hrdata     (hrdata),
   .AHB_INTERFACE_hready_in  (hready_in),
   .AHB_INTERFACE_hready_out (hready),
   .AHB_INTERFACE_hresp      (hresp),
   .AHB_INTERFACE_hsize      (hsize),
   .AHB_INTERFACE_htrans     (htrans),
   .AHB_INTERFACE_hwdata     (hwdata),
   .AHB_INTERFACE_hwrite     (hwrite),
   .AHB_INTERFACE_sel        (hsel),
   .myio                     (myio),
   .s_ahb_hclk               (hclk),
   .s_ahb_hresetn            (hrst_b)
);
endmodule

要将main_dummy_top0替换成myio_top。依次修改ahb_matrix_top,pdu_top,wujian100_open_top中的例化。

双击打开修改ahb_matrix_top文件

找到x_main_dummy_top0的例化

1.还要添加新增的output端口myio,信号需要引出到最顶层,myio
2.新增了hburst,之前的dummy空模块中未使用,这里需要加上。

在改文件开始处,增加输出引脚和定义:

双击打开修改pdu_top文件:

找到例化的ahb_matrix_top,添加myio连接

同样,增加输出引脚和定义

双击打开修改wujian100_open_top文件

找到例化的pdu_top,添加myio连接

同样,增加输出引脚和定义

现在就实现了IP的挂载。
在约束文件中添加对应功能的引脚,这里将myio的低9位连接到三色灯的9个引脚上。

像之前的教程一样,综合,实现,再生成BIT文件,下载到开发板上。

3. 实现与验证

在CDK中编写简单的程序验证功能。