在总线上挂载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中编写简单的程序验证功能。