7.5.1 导入外部的HDL程序模块
基于HDL的设计已经盛行了多年,现已积累了有大量的HDL代码资源和丰富的IP核,因此在各种FPGA设计中,不可避免地要导入一些HDL代码,以达到最优设计。System generator支持导入HDL设计,能以黑盒子(Black Box)的方式导入VHDL、Verilog HDL以及EDIF设计文件。在模型设计中,黑盒子模块和普通的System generator一样,能实现模块间的互相连接、参与仿真以及被编译成硬件电路。
1.黑盒子HDL代码的要求
黑盒子模块队导入的HDL代码格式有一定的限制,其具体要求如下:
- HDL实体的名字不能和设计中已有的模块名字重复;
- 顶层黑盒子实体中不能出现双向端口;
- 对于Verilog黑盒子,其模块和端口名必须小写,且命名要规范;
- HDL模块的时钟信号以及时钟使能信号都必须是标准逻辑类型,即不能使用矢量输入信号,如:
input clk1, clk2;是合法的
input [1:0] clk; 是不合法的 - 黑盒子代码的时钟和时钟使能信号必须成对出现,即出现一个时钟信号,则必须有一个时钟使能信号。且时钟信号的名字中必须包含字符串clk,时钟使能信号的名字必须包含字符串ce,一对时钟信号和时钟使能信号的名字只能有clk和ce不同,如my_clk_1和my_ce_1。
2.黑盒子配置向导
System Generator提供了由HDL代码到黑盒子模块转化的可配置向导,用于简化整个流程。可配置向导首先检查VHDL、Verilog代码的语法检查,然后根据语义分析的结果将其转换成.m函数,最后再将.m函数和黑盒子模块关联起来。生成的可配置.m函数是否可用取决于导入的HDL代码的复杂度。将在5.5.1节给出说明,指出在哪些细节下,必须对其生成的代码进行手工修改以修正可配置向导的不足。
1) 启动可配置向导
当在设计中添加一个黑盒子模块时,配置向导会自动启动。注意:在添加黑盒子之前,要将导入的HDL文件放在设计模型的文件夹中。可配置向导只在设计文件.mdl所在的文件中寻找.v和.vhd文件,如果没有找到相关文件,则会弹出警告提示对话框,如图7-47所示。

图7-47 警告提示对话框
当找到.v或者.vhd文件后,可配置向导会弹出一个新的对话框,并列出所有HDL文件,如图7-48所示。然后选中要导入的文件,点击“Open”按钮即可完成整个流程。自动生成的.m文件的名字为 “<module>_config.m”,且存放在设计文件夹中。<module>就是导入的HDL文件的名字。

图7-48 列出的HDL文件
2) 可配置向导的一些细节
可配置向导在运行过程中会自动提取大量的信息,并执行相应的转换,但是有些细节必须通过手动修改才能完成,如表7-12所示。另外,可配置向导会在.m函数相应的地方添加注释以提示设计人员。
表7-12 向导细节描述列表

3.可配置.m函数
导入的HDL文件都是以黑盒子模块来描述的,因此原HDL文件所有的信息都通过可配置.m函数加载到黑盒子中。可配置.m函数不仅定义了接口、物理实现以及仿真行为等信息,还包括以下配置信息:顶层模块的实体名字、VHDL或Verilog语言选择标志、端口描述、模块的一般性需求、时钟和采样速率、和模块有关的所有文件信息以及模块中是否含有组合逻辑路径。
黑盒子和可配置.m函数的关联性在其属性对话框中设定,如图7-49所示。可配置.m函数采用面向对象的接口来说明黑盒子模块的信息,主要由模块描述符对象SysgenBlockDescriptor和端口描述符对象SysgenPortDescriptor这两个对象来完成。当System generator调用一个可配置.m函数时,就向相应的.m函数传递一个模块描述符:
function sample_block_config(this_block)
该模块描述符对象提供了说明黑盒子信息的方法,而相应的端口信息则由端口描述符对象独立定义。

图7-49 设定关联性的对话框
1) 设置顶层实体
配置向导会自动添加该属性的说明。SysgenBlockDescriptor对象提供的设计方法为setEntityName,其设置顶层实体的语法为:
this_block.setEntityName('foo');
2) 语言选择
黑盒子模块的SysgenBlockDescriptor对象提供了设置顶层模块语言类型的函数,该方法只能在可配置.m函数中调用一次,下面给出设置VHDL以及Verilog模块的语法。在操作中,向导会在.m函数自动添加相应的代码。
VHDL Module:
tis_block.setTopLevelLanguage('VHDL');
Verilog Module:
tis_block.setTopLevelLanguage('Verilog');
3) 端口定义
黑盒子模块的端口定义也是由可配置.m函数通过调用端口描述符来定义的,端口描述符提供了配置端口属性、位宽、数据类型以及采样速率的方法,主要的操作包括添加新的端口、获取端口对象、配置端口类型、设置端口采样率以及动态输出端口。
(1) 添加端口
在模型设计中,黑盒子输入、输出端口的添加由模块描述符对象的addSimulinkInport函数和addSimulinkOutport函数完成,其语法为:
添加输入端口:
t is_block.addSimulinkInport('din');
添加输出端口:
tis_block.addSimulinkOutport('dout');
其中的字符参数就是端口名字,必须小写,且要和导入的HDL模块中的名字一致,否则会出错。也可以通过调用setSimulinkPorts()函数来实现输入、输出端口的添加,该函数有两个输入参数,第一个参数是输入端口组成的胞元数组,第二个参数是由输出端口组成的胞元数组。
(2) 获取端口对象
定义了端口之后需要配置其属性,但是在配置属性之前必须先获得相应端口的描述符对象,然后才能对其进行操作。SysgenBlockDescriptor对象提供了port()函数来获取对象,其使用语法为:
din = this_block.port('din');
这便创建一个“din”的对象,再将其赋值给描述符变量。此外,还有两个函数inport()和outport()用来返回对象的端口下标,其类型为1到所有输入、输出端口总数之间的一个整数,方便了对模块端口的反复性操作。
(3) 配置端口类型
SysgenPortDescriptor提供了完备的端口类型的配置方法,如一个名为“dout”、位宽为12以及位置下标为8的无符号端口的定义语法为:
dout = this_block.port('dout');
dout.setWidth(12);
dout.setBinPt(8);
dout.makeUnsigned();
也可以通过下面的语句完成相同的功能:
dout = this_block.port('dout');
dout.setType('Ufix_12_8');
黑盒子支持具有单比特端口(如:std_logic)或向量端口(如:std_logic_vector(0 downto 0))的HDL代码,但对于二者的处理略有不同。System Generator默认端口为向量端口,因此当端口为单比特时,需要通过方法useHDLVector()来修改其默认配置,当其参数为真时,意味着向量端口;否则为单比特端口,其语法为:
dout.useHDLVector(true); % std_logic_vector
dout.useHDLVector(false); % std_logic
(4) 设置端口采样率
可以通过黑盒子设置不同的采样速率,在默认情况下,输出端口的采样速率和输入端口是一样的,但在多速率系统中,输出端口的速率和输入端口的速率是不一样的,另外在通常情况下,各个输入端口的速率也是不一样的,这就需要为各个端口独立设置采样率。SysgenPortDescriptor类提供了setrate()的方法,用于独立设置端口速率,其语法为:
dout.setRate(N);
其中,N为正整数,意味着采样周期包含N个系统周期,也就是说其采样速率为系统时钟的1/N。如果系统周期为2s,则dout.setRate(3);就表示采样周期为 。如果端口的采样频率不是一个常数,是变化的,可通过SysgenPortDescriptor类的setConstant()方法来实现。
(5) 动态输出端口
黑盒子最有用的一个特征就是输出端口的类型和采样速率可以动态配置。例如,根据输入端口的位宽来动态调整输出端口位宽就是实际工程中所需要的。SysgenPortDescriptor提供了设定端口动态可配置的成员变量,通过监测输入端口动态修改成员变量来达到目的。 首先,通过.port()函数获得输入端口的位宽和速率:
input_width = this_block.port('din').width;
input_rate = this_block.port('din').rate;
其次,SysgenBlockDescriptor对象提供了布尔型成员变量inputTypesKnown和inputRatesKnown,来判断端口类型和位宽配置信息是否被传递到模块。
最后,在成员变量inputTypesKnown和inputRatesKnown的判断条件语句中嵌套对输出端口的配置来达到动态输出端口的目的。动态设置输入端口位宽的语句如下:
if (this_block.inputTypesKnown)
dout.setWidth(this_block.port('din').width);
end
动态设置输入端口采样速率的语句与上类似,其语法为:
if (this_block.inputRatesKnown)
dout.setRate(this_block.port('din').rate*2);
end
4) 黑盒子时钟
对于导入的多速率代码,必须在可配置.m函数中对系统时钟进行相应说明。无论是单速率系统和多速率系统,System Generator要求时钟和时钟使能信号必须成对出现。SysgenBlockDescriptor对象提供了.addClkCEPair()函数,用于定义黑盒子的时钟和时钟使能信号。该函数有3个参数,第1个参数是HDL代码中的时钟信号名字,第2个参数是HDL代码中的时钟使能信号,第3个参数定义时钟信号和时钟使能信号之间的速率关系。其中时钟端口信号必须包含字符串“clk”,时钟使能信号必须包含字符串“ce”,除了“clk”和“ce”外,二者其余部分必须相同。速率参数不是Simulnk模块的采样速率(?????),它为一正整数,代表了系统时钟速率和相应的时钟使能速率的比值。
例如,假设系统时钟使能信号为ce_3,时钟信号为clk_3,且ce_3的周期是clk_3周期的3倍,则可以通过下面的语句完成说明:
addClkCEPair('clk_3','ce_3',3);
当System Generator将黑盒子编译成硬件电路时,能根据.m函数生成合适的时钟有效信号,并自动将其连到相应的驱动端口上。
5) 模块中是否含有组合逻辑路径
由于输入端口的任何改变都会导致无时钟驱动的输出端口发生变化,因此如果导入的模型含有组合路径,则必须通过tagAsCombinationa方法在.m函数中进行说明,其语法为:
this_block.tagAsCombinational;
7.5.2 设计在线调试
System Generator提供了使用ChipScope和共享存储器两种方法来实现系统的在线调试,它们都可以利用相关工具获得可视化的测试信号,都支持十六进制、十进制以及二进制数,允许在模型中比较参考信号,且支持逻辑值和模拟量两种信号显示方式。
使用ChipScope完成在线调试,需要在模型中插入ChipScope模块,在FPGA芯片中插入ChipScope探头,通过JTAG接口实时地完成芯片内部信号的采集。如果使用共享存储器的方式,则需要由FPGA硬件、Simulink设计以及MATLAB软件共同提供一个独立的共享地址空间,将FPGA芯片中的数据实时地存储到空间中,然后再读回Simulink设计,可简化整个在线调试的数据分析。
本节以ChipScope法为例介绍如何完成设计的在线调试。
例7-4 利用System Generator实现一个正弦波信号发生器,并通过ChipScope在FPGA芯片中实时分析。
- 在MTALB中启动Simulink,建立设计模型,从Xilinx模块库中添加Counter模块、SinCosine模块、ChipScope模块、Gataway Out模块、System Generator模块以及Scope模块,其连接关系如图8-50所示,并保存为mychipscope.mdl。
- 双击SinCosine模块,选定Function为Sine;双击Counter模块,设置步长为1。
- 双击ChipScope模块,在Triggers栏中选择Number of trigger ports为1;Triggers Setting栏中设定Match type为Extended;Nunber of data ports设定为1,且选中“Use trigger ports as data”选项。
- 双击Gataway Out模块,选中Specify IOB location constraints选项,在IOB pad location(cell array {' MSB',…,'LSB'})中输入{'F12','E12','E11','F11','C11','D11','E9','F9'}。
- 在Simulink中单击运行键开始仿真,结果如图7-51所示。由于Counter的步长设置的比较小,所以正弦信号的频率较低,需要将仿真时间设置的长一些。

图7-50 在线调试的正弦信号发生器设计

图7-51 正弦波示例模块的Simulink设计示意图
6) 双击System Generator模块,在“Compiliation”下拉框中选为Bitstream;Part为Spartan 3E系列的XC3S500E-fg320,时钟周期设为20ns(50MHz),时钟管脚为C9。完成上述设置后,单击“Generator”按键,生成相关文件,由于选择了编译生成比特文件,因此完成后,可在设计文件夹中找到mychipscope_cw.bit的配置文件。
7) 从开始菜单中打开ChipSocpe Pro,点击JTAG链扫描按键,选择XC3S500E,按照6.5.2节的方法下载程序,组合总线信号,可得到的观测波形如图7-52所示。

图7-52 正弦波示例模块ChipScope采集结果的数字显示
为了更直观地观察波形,可通过“Bus Plot”功能得到其模拟波形,如图7-53所示,可以看出本设计正确实现了预期功能。

图7-53 正弦波示例模块ChipScope采集结果的模拟显示
7.5.3 系统中的多时钟设计
多时钟系统在FPGA开发中占据重要地位。首先,存储器共享技术需要多时钟;其次,多时钟设计可以联合不同时钟和分支时钟来达到实现高级时钟策略。本节主要从以下方面讨论如何在System generator中使用多时钟开发技术,并在最后给出一个工程实例:
- 采用多时钟设计带来的好处;
- 如何采用层次划分法,将一个System Generator模型分割为两个或多个时钟区域;
- 如何跨时钟域使用共享存储器;
- 如何仿真多时钟设计以及将其转化成网表;
- 如何使用多个Xilinx子系统模块将多个时钟区域级联起来。
将设计划分为由多个不同时钟驱动的子系统,每个子系统被称为异步时钟孤岛,其中的共享内存将起到通信桥梁的作用。
1.多时钟应用
多时钟区域的典型应用是和工作在不同时钟速率的外部硬件模块接口。例如经常通过一组I/O接口,按照外部控制器的时钟来访问外部寄存器,然后在FPGA内部,再对数据进行重采样以达到同步的目的;经过本地处理后,再将数据以另外一个外部接口模块所需要的时钟送出FPGA。
多时钟的另外一个重要应用就是开发高速处理单元。以插值FIR滤波器为例,滤波器从外部模块单元接收符号数据,然后在对每一个符号完成4倍插值,将每个符号变成4个符号,即数据速率提高了4倍,最后以数模转换器(DAC)时钟采样数据,将其送到DAC中。
对于滤波器设计,常用方法就是让滤波器工作在采样率下,一个周期处理一个采样,这种方法消耗了最大限度的硬件资源,因此只适合应用于高速的系统中。而对于低速数据,这样设计就太浪费资源了,需要采用复用的理念。假设工作时钟是数据速率的N倍,则一个处理时钟周期可以拆分为N个片段,拆分后的时长等于数据周期,则处理一级只需要一个时间片段,也就可以将同一份资源复用N次,即资源的使用降低为原来的1/N。一个优秀的FPGA设计应该尽可能采用高的处理时钟以追求更多的复用倍数,以速度换取面积,降低硬件成本,同时也给系统引入了多个时钟。当然多倍复用的方法也存在两方面缺点,首先会导致芯片功耗变大;其次增加了布局布线的难度,对编程人员有更高的要求。因此,需要在高速设计中划分时钟域。
此外,在异步接口模块中不可避免地要使用多时钟。因此,掌握FPGA多时钟的设计方法既是一种趋势,也是一项基本要求。
2.时钟区域分割
将多时钟设计分割到多个区域是FPGA设计的一个重要方面。System Generator不仅以结构化设计的方式支持时钟区域分割,还要求把与每个时钟以及与其相关的逻辑封装成一个子系统。这样,单个子系统就形成了同步孤岛,是真正意义上的周期硬件电路,且其性能和Simulink行为模型一致。前面所提的比特和周期精确的概念只在单个同步孤岛中成立。由于包含同步孤岛的高层模型是通过异步时钟来驱动孤岛的,因此它并不是真正的周期电路。需要说明的一点是:System Generator和Simulink都通过理想的时钟源对设计进行仿真,因此调用异步时钟系统会导致软件仿真和真实的硬件性能存在一定的偏差。
在设计中通过子系统来分割时钟有诸多优点:首先,将物理时钟信号从模块结构图中提取出来;其次,Xilinx提供的跨域转换器能够处理模块库中模块的亚稳态安全;第三,System Generator能对时钟孤岛产生精确的时钟约束以及时序分析。
此外,这种抽象级的设计流程可以减少用户设计中一些常见错误,如:门时钟错误,异步复位信号以及锁存器。System Generator在硬件生成阶段自动产生时钟,因此不会将非时钟信号连到时钟输如端口,发生门时钟错误,也不会生成锁存器。由于异步复位会导致各种时序问题,因此System Generator在编译时不允许异步复位,从而避免了该类错误。
3.跨越时钟区域
System Generator通过存储器共享的方式来跨越不同的时钟区域,主要有Shared Memory、To FIFO、From FIFO、To egister和From Register这5个模块,且在使用时必须配对使用,典型的示意图如图7-54所示。

图7-54 成对使用的模块示意图
To FIFO模块用于写操作,From FIFO用于读操作,且一对FIFO通过命名配对关联。在硬件实现时,这两个模块都通过Xilinx公司的FIFO IPcore生成。使用FIFO模块是3种跨越时钟区域的方法中最安全和最方便的方式,是高速数据传输的最优手段。
一对共享存储器模块是通过一个双口块RAM来实现的,也通过命名来配对关联,两个共享存储器模块分别工作于不同的时钟区域。由于块RAM是真正的双口RAM,在每个时钟区域都可以独立地完成读写,但是要注意不能同时写同一个地址,也不能对同一个地址发生写操作和读操作。由于是基于块RAM实现的,因此具备大容量和高速的特点。
To egister模块用于写寄存器,From Register用于读寄存器,一对寄存器通过命名配对关联,寄存器操作不同的时钟域中必须同步操作。在硬件实现时,一对寄存器通过一个触发器来实现,一对1比特的To/From Register模块需要一个触发器。需要注意的是:通过这样方式实现跨域是不安全的,只有在对硬件特征完全理解的基础上才能使用,一般不推荐这种方式。
4.网表化多时钟设计
在System Generator设计中,每个时钟区域都有其自己的子系统。图7-55给出了一个双时钟区域的设计,每个子系统都可以独立设置系统周期。

图7-55 双时钟区域的设计
当一个多区域设计被网表化时,System Generator需要执行下面的步骤,如图7-56所示。
- 选中0号区域(左边),除TO FIFO模块外所有设计的HDL文件,并编译产生NGC文件;
- 选中1号区域(右边),除From FIFO模块外所有设计的HDL文件,并编译产生NGC文件;
- 然后调用Xilinx核生成器来产生中间的FIFO模块;
- 最后再产生顶层HDL模块,并在其中例化上述三个模块。

图7-56 多时钟设计的顶层模块示意图
7.5.4 软、硬件联合开发
1.软、硬件联合开发综述
软、硬件联合开发主要是在FPGA设计中添加微处理器,以SOC的模式完成设计。System Generator提供了3类能够导入处理器的模块,即黑盒子模块、PicoBlaze微控制器模块以及EDK处理器模块。
由8.5.1节可以知道,黑盒子模块可以导入外部的HDL设计,因此其提供了最灵活的设计方式,可以导入任何处理器的HDL代码。所有的总线和接口可根据需要在System Generator模型设计中灵活连接,具备对处理器的完全控制能力。
PicoBlaze模块是最容易使用的,当然其灵活性也最小。Xilinx公司的PicoBlaze微控制器模块利用PicoBlaze宏实现了一个8位的嵌入式控制器,通常只需要一个块RAM来存储程序。设计人员可以通过PicoBlaze汇编语言完成设计应用。
EDK处理器模块提供了MicroBlaze处理器的接口,允许设计人员将共享存储器和其关联起来,一旦建立关联关系,MicroBlaze就可以对它实现读写控制。同样,也可以将System Generator设计通过EDK处理器接口导入到EDK工程中。导出过程会产生一个基于FSL的pcore,能被添加到任何支持FSL接口的EDK系统中。软核MicroBlaze和硬核PowerPC都具有FSL接口。
2.对EDK的支持
嵌入式设计是目前最流行的设计方向,System Generator也支持在设计中添加嵌入式处理器,通过模块“EDK Processor”将EDK设计导入到System Generator中。其主要步骤如下:
- 在设计中添加EDK Processor模块;
- 双击EDK Processor模块,在“Configure processor for”下拉框中选择“HDL netlisting”选项后,单击“Import”按键,会自动弹出选择EDK工程导入向导,其界面如图7-57所示,用户选择EDK工程的路径和相关的开发板型号即可。

图7-57 EDK设计导入设计示意图
- 单击“OK”按键,即可开始加载工程,并弹出图7-58的提示对话框。
图7-58 EDK设计导入过程提示对话框
- 加载完成后,在EDK Processor页面中可以看到EDK工程名、所用的处理器类型(软核的MicroBlaze和硬核PowerPC两种),如图7-58所示,单击“OK”即可完成整个嵌入式系统的加载。

图7-58 EDK设计处理器类型示意图
需要注意的是:目前的System Generator版本还不支持加载双核的嵌入式系统设计,嵌入式处理器的外设不能和System Generator设计冲突。例如:如果协仿真使用了以太网接口,则嵌入式处理器不能使用以太网接口。此外,如果EDK设计有修改的话,则需要重新加载。
3. 预留接口
处理器和System Generator之间交换数据的首选方法是通过共享存储器,但也可以通过

图7-59 EDK设计导入完成后配置页面示意图
在设计的顶层模块中预留处理器内部接口来完成通信。双击EDK模块,切换到“Advanced”页面,选择需要在顶层模块预留的接口,如图7-60所示。

图7-60 顶层模块预留接口示意图
其中的端口列表列出了处理器在顶层模块中所有可用的端口信号,其中不包括时钟信号以及System Generator用来实现存储映射的接口。选中sys_rst_pin与myexternalport行的“expose”选项,可在设计中直接操作EDK处理器中的串口。此外,用户还可根据需要对预留接口重命名,具备更高的可读性。
7.5.5 FPGA设计的高级技巧
本节主要介绍一些能够使System Generator有效生成高性能硬件电路的方法和技巧。
1.关注模块对话框中的注释
在基于System Generator设计时,需要特别注意其模块对话框中对硬件电路的说明。大多数Xilinx模块库中都有如何达到最高效硬件电路实现的注释,在使用时要仔细阅读和体会。例如:缩放模块(Scale block)的注释会指出该模块并不消耗任何硬件资源(因为可通过交换硬件连线实现),而移位模块(Shift block)的注释就表明需要一定的硬件资源。对于这样的细节信息,只有从注释中才能获取。
2.寄存设计的输入和输出
寄存输入、输出变量可以通过在“Gateway In“之后和“Gateway Out“之前加入时延为1的延迟模块或者寄存器模块实现。选择寄存器模块的任一属性即可添加硬件。在某些应用中,对数据需要进行双寄存才能达到目的,这可以通过例化两个独立的寄存器模块或者例化两个时延为1的延迟模块实现。这样可以做到一个寄存器负责I/O端口,另外一个寄存器负责和FPGA内部逻辑接口。一个延迟为2的寄存器模块并不能达到上述效果,这是因为它是由SRL16单元组成的,并不能直接嵌入I/O端口中。
3.加入流水线寄存器
尽可能在设计中插入流水线寄存器,较多的流水线级数能有效地提高硬件实现的性能,且占用较少的资源(使用SRL16结构来实现)。此外,如果在设计中要将变量初始化,就必须通过使用寄存器模块来完成。
4.使用System Generator时序分析器
时序分析器可以帮助设计人员解决与时序有关的问题,以报告的形式反馈最慢的路径和不满足时序要求的路径。有关时序分析的基本概念和方法的详细介绍,可阅读本书第11章。System Generator也提供了时序分析器来辅助用户提高电路性能。
双击打开设计中的System Generator模块,在“Compilation”下拉框中选择Timing Analysis选项,然后单击“Generator”按键,会自动生成设计的NGC网表、NGD网表文件以及NCD文件,时序分析器分析NCD文件,跟踪最差路径,并最终给出时序报告。该编译过程完成后,会自动弹出图8-61到图8-64所示的时序分析报告,分为最慢路径、图表显示、统计结果以及跟踪信息4个页面。
1) 最慢路径分析结果

图7-61 时序分析器最慢路径列表
直接获取最慢路径可帮助用户快速修改设计,打破时序瓶颈。在图8-61的Source区单击分析源之后,在“Path”区会显示该源的所有路径延迟以及延迟类型。选中右下角的“Display low-level names”选项,还可显示出相应路径在实现后详细的网表名称。
2) 图表分析结果
点击左侧栏的“Charts”图标,即可切换到图表分析结果。在一般的时序分析中,设计人员只获取到最高时钟频率,但不明白设计的整体时序性能。例如用户期望设计达到100MH,但经过时序分析后只达到99MHz,那么设计究竟离约束的性能差距有多大,是重新设计还是局部修改,这些困惑都是不确定的。图标分析结果弥补了这一缺陷,直观地将所有的路径列表统计,如图8-62所示,大多数路径的延迟处于8ns左右,只有一条路径为9.96ns,比较接近10ns。整体设计的时序裕量还是比较富裕的。

图7-62 时序分析器性能直方图统计结果示意图
3) 统计结果
统计结果列出设计的时序约束个数以及所分析的路径,并给出设计的最小周期和可达到的最高工作频率。如时钟约束为100MHz,经过分析可达100.371MHz,基本满足需求。

图7-63 时序分析报告的简要指示信息
4) 路径跟踪信息
路径跟踪信息列出了每条路径的详细时序报告,对于不满足的路径将以红色显示。其中各路径信息的解读方法和指标参见第11章内容。

图7-64 时序分析报告的路径跟踪指示信息
5.设置所有“Gateway”模块的速率
速率设置通过选择I/O端口时序约束选项中的数据速率来实现。一旦数据速率选项被选中,则I/O端口只能工作在约束的频率上。约束频率是由设计中的系统周期、“Gateway In”模块的采样速率以及其他模块的采样速率共同决定的。
6.减少时钟使能信号的扇出
Xilinx ISE的映射器在高扇出网络中采用复制和放置寄存器的方法递归地分割负载,意味着在System Generator中亦可以该方法来改善时钟使能信号高扇出的情况。System Generator具备该项特征,但需要在实现过程中使能下列选项:
- Perform Timing-Driven Packing and Placement : on
- Map Effort Level : High
- Register Duplication : on
在ISE开发流程中,上述MAP选项是默认打开的。但在System Generator中完成比特流的生成,需要通过修改bitstream .opt文件或提供用户自定义的.opt文件才能打开上述选项。
7.5.6 设计资源评估
硬件资源评估是基于FPGA设计的必需步骤之一。System Generator提供了资源评估模块,可快速地估计出设计模型所需的硬件资源。该模块位于工具模块子集中,如图8-65所列。

图7-65 资源评估模块示意图
此外,Xilinx模块库中的可综合模块都具备如图8-66所示的简易资源评估信息。由于在顶层模块中还包括大量的布局布线资源,因此,各个子模块的资源和是小于整个顶层设计所占资源的。

图7-66 Xilinx模块资源信息示意图
当设计规模比较庞大或功能复杂时,通常要采用层次化、模块化的设计方法,来降低设计难度且提高项目的可管理性。为了准确地评估资源且满足用户在各个设计阶段的不同需求,Xilinx资源评估模块也提供了不同层次的估计方法。在设计中双击资源评估模块,在“Estimate options”下拉框中可看到四种不同的评估方法,如图7-67所示。

图7-67 Xilinx模块资源方法示意图
其中不同选项的含义如下:
Estimate:估计当前层模型以及所有从属层模块的资源;
Quick:将当前层模块的所有模块资源相加,不包括从属模块的资源;
Post Map:调用ISE的布局布线工具,并根据的报告文件(Map Report File, MRP)进行资源评估;
Read Mrp:不调用布局布线工具,直接读取已完成的布局布线报告并进行参数估计。


