分类:
2011-09-21 22:28:39
最近忙一个EDK的小工程,自己定义个用Create or Import Peripheral 定义了IP,在里面要用到ISE的IP.困扰了一段时间!经过群里、论坛上一些朋友的帮助 终于OK了,先分享下了(引用五十米阳光),这里面主要是用到了Black Box的设计
FPGA设计过程,很多时候在使用公司的或者第三方公司的IP核,那如何自己把自己的HDL代码变成可使用的IP呢。同时这样做也有很多好处:
将你的设计制作成BlackBox,也就是网表文件,这样别人看不到你的设计但是可以调用你的模块了。详细的参考信息如下:
1. 什么是BlackBox
- 一个大的设计中可以用到一系列网表文件作为输入的一部分而并不全部使用HDL文件。当综合这个大设计时综合器不需要知道这个网表文件是怎样实现的,而只需要知道它的输入输出接口就可以了。这样的网表就称为黑盒子,因为我们不需要看到它的内部情况。
- 通常付费IP都会以BlackBox的形式
2. 如何使用BlackBox
- BlackBox网表可以是EDIF或NGC文件。
- 每个BlackBox网表都需要有一个与之相对应的HDL文件来注明它的端口。这个HDL只说明BlackBox的端口信息,而不提供具体实现信息。这个只提供端口信息的HDL文件称为Wrapper。Wrapper的名字通常需要与BlackBox网表的名字相同。
- 在ISE工程中使用BlackBox时只需要将它的Wrapper添加到工程中。然后像普通的模块一样在其上层声明和例化就可以使用。
- BlackBox网表文件可以放在ISE工程目录中,也可以放在其他任意文件夹内。当不放在ISE工程目录时,需要在Translate属性中将Macro Search Path指向这个目录。多个目录使用"|"分割。
3. 如何制作BlackBox
- BlackBox只是普通网表而已。XST的综合结果就可以直接作为BlackBox使用。
- 通常BlackBox外部还会连接其他逻辑,所以BlackBox中一般不插入IOBUF。在XST属性中去除Insert IO Buffer的选项
1. 一般收费的IP都是只提供网表供使用,自然对设计的保密是一大好处;
2. IP都是验证好的模块,提供给外界接口,自然使用方便也是一大特点;
3. 以网表形式提供可以保持IP的内部时序完整性(即保存设计),类似于partition和smartguide。
接下来想说的是,把HDL代码封装成IP核(以网表形式提供使用,NGC format),根据使用的环境不同(在ISE和EDK中),有其各自的封装形式,但是大同小异,都是用的黑盒子方式,再加载网表,即可。
在ISE中封装HDL,并使用IP,设计分三大步:
第一步:像通常建立工程设计一样,先编写一个模块,如:
module add(a,b,c)
Input a,b;
output[1:0]
assign c=a+b;
endmodule
设置综合选项,综合过程中不能加入IO buf和iob(考虑到跟外部模块接口问题):
在综合设置中,-iobuf不要勾选,-iob选 NO,综合,生成网表add.ngc;
第二步:制作一个blackbox模块(就是一个IP的wrapper封装设计),如下:
module add(a,b,c)
input a,b;
output[1:0]
endmodule
只申明端口。
第三步:使用此IP,需要先把第二步的blackbox以v文件形式加入到工程,再调用这个模块,再把add.ngc文件加入到工程文件夹下即可(注意此过程在综合实现时候,要把第一步的两个选项选上)。
在EDK中封装自己的IP核方法(此处是指的是完全定制的IP核),
也是以黑盒子方式提供,需要自己编写相应文件,其文件结构如下:
│
├─data
│ .bbd // 记录NGC文件
│ .mpd //描述IP接口信息,属性等
│ .pao //说明IP核所有的源文件(HDL下的文件)
├─hdl
│└─verilog
│ .v //申明IP端口的V文件,相当于一个黑盒子
│ .v
│ .v
│
└─netlist//iP相应网表
blackbox1.ngc
blackbox2.ngc
EDK中Custom IP Core如果需要引用网表,那么就需要在BBD文件中中声明需要使用的网表名称。
常用的BBD文件有两种形式:
1. 在所有情况下均使用相同的网表
2. 根据不同请款使用不同的网表
在情况1-使用相同网表时,可以使用CIP Wizard的import功能自动生成BBD文件,并且CIP Wizard还会把网表文件放到相应的文件夹内(pcores//netlists)。
此时BBD文件的内容是
FILES
blackbox.ngc
在情况2-需要EDK自动选择相应网表时,就需要手动编写/修改BBD文件了。
比如我需要根据所使用的FPGA器件类型选择网表文件,那么就可以根据C_FAMILY参数来选择。BBD文件例子:
C_FAMILY FILES
virtex4 virtex4/blackbox1.ngc, virtex4/blackbox2.ngc
spartan3 spartan3/blackbox1.ngc, spartan3/blackbox2.ngc
文件夹层次则为:
│
├─data
│ .bbd
│ .mpd
│ .pao
├─hdl
│ └─vhdl
│ .vhd
│ .vhd
│ .vhd
│
└─netlist
├─spartan3
│ blackbox1.ngc
│ blackbox2.ngc
│
└─virtex4
blackbox1.ngc
blackbox2.ngc
【注意事项】
1. Core顶层VHDL需要有相应的Generic,Verilog需要有Parameter与用于选择的属性一致
2. C_FAMILY属性是EDK工程的内建属性,不需要在MHS中手动指定,它会自动传递到CustIP中。
3. 两个file name用逗号和空格隔开