1.设计原则
要实现将System Generator完成的硬件设计导入到另一个工程中,在System Generator图标属性中“Compilation”栏必须选择“HDL Netlist”,除此之外,需要遵守以下两个规则:
(1)sysgen工程中“System Generator”图标和“Gateway”图标的属性中,不能添加I/O的管脚约束,也不能添加时钟管脚约束。否则NGDBuild tool将会出现下面的报警信息,如下所示:
WARNING:NgdBuild:483 - Attribute "LOC" on "clk" is on the wrong type of object. Please see the Constraints Guide for more information on this attribute.
(2)Sysgen设计中如有I/O端口,需要连接到另一个工程的顶层模块,并需要添加buffer缓冲。
2.Sysgen 10.1新特性
将Sysgen产生模块添加到Project Navigator工程中的数据流如图1-28所示,在ISE10.1版本中,System Generator(Sysgen)和Project Navigator(ProjNav)之间的数据流交互增添了新的功能,允许Sysgen和ProjNav之间几次迭代设计。

图1-28 Sysgen和ProjNav的数据流交互图
在10.1版本中,Sysgen新增了一种工程文件.sgp,该.sgp包含了Sysgen设计的所有信息,比如文件的存放地址和约束文件等,只需要将该.sgp工程文件加入到另一个工程的ProjNav中就可以完成整个Sysgen模块的导入工作,而不需要手动添加很多子模块,非常方便。
在10.1之前的版本,需要手动将ucf约束文件综合连接到顶层文件,而在ISE10.1版本中,所有这些都自动完成,如图1-28所示,并且可以实现Sysgen和ProjNav之间的几次迭代设计,充分保证设计的正确性。
3.样例讲解
下面通过一个小例子讲述将Sysgen生成的两个HDL Netlist导入到另一个VHDL设计中,如图1-29所示,在本书附带光盘的“chapter1/exp1-3/import”路径中可以找到本样例的Simulink工程,包含两个工程(spram.mdl、mac_fir.mdl)和一个顶层文件夹top_level。

图1-29 import样例结构图
两个设计分别是SPRAM(#1表示)和MAC_FIR(#2表示),顶层VHDL工程包含#1和#2。顶层VHDL将#1的两个data数据口和rd_wr控制口逻辑组合构成一个双向总线,#1和#2使用不同的时钟(分别为clk1和clk2),顶层VHDL输出fir_out。下面逐步介绍如何将Sysgen工程导入另一个VHDL工程。
例1-3:将两个System Generator工程导入ProjNav,进行VHDL设计。
(1)两个sysgen工程分别产生对应的HDL代码
在Simulink下分别打开两个工程,双击System Generator图标,“Compilation”栏选择“HDL Netlist”,芯片类型Part选择“Virtex5 xc5lvx20t-1ff323”,“FPGA clock period”设置为100ns,其它属性默认配置,点击“Generate”按钮即可产生对应的HDL文件,分别在目录中hdl_netlist1,hdl_netlist2中。
(2)给不同sysgen工程的HDL库文件重命名
当两个或多个sysgen工程综合到一个新工程中时,通常会遇到HDL库名冲突的情况,这个时候需要手动对不同工程的HDL库进行重命名防止冲突,sysgen提供一种更加方便快捷安全的指令,该指令能改变某个sysgen工程中所有相关库文件的名字,同时提供对原始库文件的备份(防止修改错误的发生),指令如下所示:
xlSwitchLibrary(<target_dir_pathname>, <from_lib_name>, <to_lib_name>)
其中<target_dir_pathname>为该sysgen工程的路径。
<from_lib_name>为原HDL库名称。
<to_lib_name>为新HDL库名称。
所以在本例中,在Matlab命令行,敲入下面指令,自动完成库文件名的修改。
xlSwitchLibrary('hdl_netlist1','work','design1_lib')
xlSwitchLibrary('hdl_netlist2','work','design2_lib')
(3)将sysgen导入新工程中
首先需要综合顶层文件,在ISE下打开top_level.ise。因为sysgen的两个工程在不同的路径下,且都不在top_level目录下,需要手动添加模块,右键点击“Add Source”,分别加入两个sysgen产生的.sgp工程,路径分别在:
<sysgen_tree>/examples/import/hdl_netlist1/spram_cw.sgp
<sysgen_tree>/examples/import/hdl_netlist2/mac_fir_cw.sgp
最后点击“Processes → Implement Design”完成布局布线,双击“Place & Route Report”查看布局布线报告,如图1-30所示,本实例中#1和#2设计的系统时钟周期都为100ns,其中“TS_clk_c4b7e2441”为设计#2的时钟约束,“TS_clk_f488215c2” 为设计#1的时钟约束;在Simulink下打开#1设计“spram.mdl”,双击“Down Sample”模块,下采样因子为2,故“TS_ce_2_clk_ f488215c_group_to_ce_2_ f488215c_group1”为设计#1中下采样模块的时钟速率。同时在#2设计“mac_fir.mdl”中,点击“MAC FIR Filter”子系统,双击“Down Sample”模块,下采样因子为16,故“TS_ce_16_clk_c4b7e244_group_to_ce_16_c4b7e244_group1”为设计#2中下采样模块的时钟速率。
如图1-30所示,对于#1和#2设计中的时钟约束(FPGA时钟周期100ns)都综合到顶层文件的UCF中,这个在ISE10.1中是自动完成的。
(4)仿真整个系统
在sysgen产生硬件HDL过程中,每个工程有相应的testbench测试文件,打开top_level_testbench.do,查看顶层测试文件如何包含两个工程的testbench。在Modelsim仿真过程中,有两个初始化文件需要复制到当前top_level目录下:Memory initialization (.mif) and coefficient (.coe)文件。然后在ISE界面中从“Implementation” 转换到“Behavioral Simulation”进行功能仿真,右键“Simulate Behavioral Model → Properties”,修改属性如图1-31所示,选中“Use Custom Do File”栏。

图1-31 修改Simulate属性
双击“Simulate Behavioral Model”,产生图1-32所示的Modelsim仿真图,有三个显示区:“Design #1 Output”、“Design #2 Output”和top_level_testbench的管脚信号,这与设计的输入输出是一样的。

图1-32 import例子仿真波形图
4.注意事项
通过上述例子,了解到如何将sysgen产生的模块导入新工程,下面给出几点注意事项,在操作过程中非常有用,设计者需要牢记在心。
(1)在Gateway模块中不能指定I/O管脚约束,在System Generator模块中不能指定时钟管脚约束。
(2)System Generator模块“Compilation”选项选择“HDL Netlist”。
(3)在“Behavioral Simulation → Simulate Behavioral Model → Properties”中选中“Use Custom Do File”选项。
(4)将sysgen产生的.sgp工程导入Project Navigator,作为新工程的子模块使用,ISE10.1版本自动综合sysgen的约束文件到顶层模块。
(5)Project Navigator界面中嵌入了sysgen设计,直接点击.mdl工程即可修改sysgen设计,从而进行迭代设计。


