文章来源:OpenFPGA
实例讲解,我们以axi_gpio讲解基本流程和简单的小技巧,后续我们会以更复杂的实例讲解封装IP时候的高级技巧。
先开始今天的实例,先从官方IP下拷贝源码,具体位置:
Vivado/2019.1/data/ip/xilinx/axi_gpio_v2_0/hdl/axi_gpio_v2_0_vh_rfs.vhd Vivado/2019.1/data/ip/xilinx/axi_lite_ipif_v3_0/hdl/axi_lite_ipif_v3_0_vh_rfs.vhd Vivado/2019.1/data/ip/xilinx/lib_cdc_v1_0/hdl Vivado/2019.1/data/ip/xilinx/interrupt_control_v3_1/hdl/interrupt_control_v3_1_vh_rfs.vhd
这个是官方不加密的源码,可以直接拿来用或者修改。
注意:以上文件找不到或者不是同版本的可以使用everything或者同路径下不同版本就可以找到类似文件。
第一步:建立工程
添加上面的源码,不赘述,有问题可以评论区留言,完成后如下:
接下来综合看看有没有错误,无错误后接下来开始封装IP:
第二步:封装IP
上图是官方的封装效果,我们最后封装完的IP基本和上面类似。

NEXT
选择第一项:
选择IP保存的位置:
点击Next后会有警告信息,大概就是源文件会被拷贝到新文件夹中并且会打开封装IP的工程(自动),询问是否继续,这里点击OK
点击FINSH,打开封装IP的工程:
接下来就是封装IP了,核心就是下面图片的8步,接下来我们一步一步进行解析:
第一页:Identification
这一页设计IP的一些核心信息,包括IP的厂家、版本号等,还有IP的分类等信息:
这里我们直接举例说明,先修改library和Version,然后看下封装完的IPy影响什么:
接下来我们在其他工程中调用IP:
这样大家应该就明白这几个参数的作用了(看上图箭头位置)。接下来我们再修改几个参数:
这样基本每个参数影响什么信息基本就清晰了,大家按照自己需求修改即可,我们接下来看下一步。
注意:版本号在更迭的时候最好不要倒退,否则工程(已调用IP)就没办法更新IP,同样,其他参数更改也无法更新IP(通过upgrade)。
第二页:Compatibility
第二页很好理解,就是该IP支持的FPGA型号,如果不在这个列表里的FPGA调用IP,IP就是灰色没办法添加,同理,你如果调用别人的IP,是灰色的IP可能就是这里没添加你用的FPGA型号。
第三页:File Groups
这一页还是很重要的,所有功能之外的功能都能从这里添加,下面从几个功能说明:
添加IP文档和版本历史:
IP的左上角的Documentation内容就是从这里添加的。
上面就分别对应添加IP文档和版本历史,添加好相关类别之后,就可以添加相关文档,如下:
这样就可以在IP左上角进行相关文档的查看。
添加约束
IP相关的约束也是从这里添加的,理论上原工程中如果有约束会直接导过来,如果后续自己添加也可以:
在下面的目录下添加即可。其他目录大家自行探索。
注意:这里有些目录官方是没开放给我们的,但是我们可以通过脚本自己添加,我们在后续文章再详细操作讲解。
第四页:Customization Parameters
第四页、第五页、第七页是联合起来一起设置的,主要是对第七页的界面进行设置。
第四页是所有参数的集合,对应Verilog就是parameter,VHDL就是generic:
如果有需要自定义参数我们也可以通过下图位置添加,比如我们有几个参数联动需要一个新的参数,那么就可以通过下面方式进行操作:
我们这里就添加一个string后续使用:
第五页:Ports and Interfaces
这一页我们放到第七页后面说。
第六页:Addressing and Memory
这里主要针对有AXI或者AXI_Lite接口的IP进行设置,我们这里比较简单没什么需要设置的,默认即可,主要看下range符不符合自己需要的寄存器寻址空间。
第七页:Customization GUI
这一页就是核心界面设置,我们先看下官方IP界面:
只有一页,所以不需要添加页,我们这里添加另一个页简单说明一下:
1处右击添加Add Page,添加相关信息,然后将第四页添加的自定义参数“拖”(鼠标直接拖动即可)到里面去,完成后如下:
2处红框可通过右键Edit Page修改名称。
接下来我们点击IP Configuration页,之后就按照官方IP添加Group,我们需要两个Group:
1处右击添加Group,修改名称后再添加一个Group:
完成后如下:
然后按照需求将相关参数分类拖到不同的类别中(顺序注意下),如下:
将不需要改变的参数通过右键Hide Parameter(如上图1位置)。
接下来我们就开始美化修改参数,接下来只操作Group,Group2自己修改即可:
双击C All Inputs参数按照下图修改:
1是识别的名字(很重要);2是显示名称;3是该参数的范围;4是显示的样式,修改完如下:
C All Outputs也是同样设置。C Gpio Width、C Dout Default、C Tri Default不需要设置,修改显示名称即可。C Is Dual按照下图设置即可:
Group 2在C Is Dual没使能的情况下是不能修改的,所以这里需要对Group 2内所有参数进行修改,修改如下:
C All Inputs 2 在C Is Dual等于0情况(不使能),不能进行修改,那么在Editable选择Dependent,然后填写表达式:
,表示C Is Dual不勾选则不能修改,其他参数同这一参数,全部一样修改即可。
完成后如下:
第七页就这样修改完毕。
第五页:Ports and Interfaces
第五页我们先对信号进行分类:
分成如下3组:
第一组就是中断相关,需要将第七页中Interrupt Present(使能中断)打开后才在IP上显示,我们直接修改:
在1处双击后在2处选择Optional,然后在下面方框位置写上表达式(表示使能中断后即可显示这一端口),实际效果如下:
接下来对其他IO进行分类,将GPIO按照下图进行分类:
这里选择第二页进行mapping
Gpio 2也如此操作即可,完成后如下:
其中GPIO2是在使能第二个端口后才显示,所以我们也按照上面的操作进行设置:
完成后如下:
第八页:Review and Package
上面都操作无误后就可以在这一页进行确认完毕,点击箭头位置我们今天就操作完毕:
最后来一组对比(和官方IP对比)
总结
很简单的小例子,主要设计到IO分类、端口条件显示、GUI联动可编辑、GUI样式更改等,后续我们再搞个复杂点的,可以点个关注持续关注。
本期例程链接:
https://github.com/suisuisi/FPGATechnologyGroup/blob/main/axi_gpio_v1.1.zip