对于提高电路时钟频率的方法,最有效的无非是自己设计电路的时候尽量不要在关键路径上的一个时钟周期内做太多组合逻辑的运算,很费时的,能够几个时钟周期平摊的就平摊下;另外,写代码的时候,风格也很重要,尽量不要在关键路径上写三重门运算的,时钟速度很受影响的。
做到以上两点的,如果使用FPGA实现的话,以下推荐几种提高时钟频率的方法。用于Altera公司的QuartusII9.1.当然其他版本的工具亦可借鉴。
2.3.1 TimeQuest时序分析器
2.3.1.1 优势
使用 TimeQuest 时序分析器的优势包括:
- 使用方便的 GUI —— TimeQuest 时序分析器提供使用方便的 GUI 以及交互式报告,进行时序分析。
- 对业界标准 SDC 格式的自然支持—— 您可以利用功能强大的业界标准时序约束格式,使用并反复使用 SDC 格式和工具命令语言 (Tcl) 脚本,进一步提高效率。
- 支持复杂的时钟方案—— SDC 格式提供更简单但是功能更强大的时序格式,对高级设计组成 (DDR 以及其他源同步协议、复用时钟等 ) 进行快速直接的描述和分析。
- 进一步提高性能—— 与标准时序分析器相比, TimeQuest 时序分析器能够建立更精确的时序行为模型 ( 例如,上升/下降时序模型 ) 。 Hardcopy II 和 65nm 器件系列的性能可以提高 3-5 %。
- 更简单的 ASIC 原型开发—— TimeQuest 时序分析器轻松实现了 ASIC 和 HardCopy 设计的 SDC 约束移植,加速了 ASIC 原型开发。
2.3.1.2 软件及器件支持
Quartus II从6.0版本开始就支持TimeQuest时序分析器。
TimeQuest支持MAXII、Cyclone系列、Stratix系列和HardCopyII器件。
在QII中选择以上器件时,可以选择使用经典时序分析器或TimeQuest分析器。
第三代65nm器件和Arria GX器件仅支持TimeQuest分析器。
Altera建议在90nm 和 65nm 工艺节点上所有新设计都使用TimingQuest。
2.3.1.3 软件应用
通过Settings->Timing Analysis Settings可以选择全编译过程中最后使用经典时序分析器还是TimeQuest分析器。
图2.27
通过Tools->TimeQuest Timing Analyzer,或点击按钮 进入TimeQuest如图3.2。
操作步骤如下:
1) 生成时序网表(post-map或post-fit):通过Netlists菜单或者任务窗下Create Timing Netlist命令。
2)读取SDC文件(可选):通过Constraints菜单或者任务窗下Read SDC File命令,若工程还没有指定SDC文件则需要新建一个。
3)约束设计:使用Constraints菜单或者控制窗输入tcl命令添加时序约束。
4)更新时序网表:通过Netlists菜单或者任务窗下Update Timing Netlist命令,从而在当前网表中应用新加入的约束。
5)生成时序报告:通过Report菜单或者双击任务窗下对应项(如图3.5),生成所需报告,如图3.2。
6)保存时序约束:通过Constraints菜单或者任务窗下Write SDC File命令,保存时序约束,打开SDC文件可以看到加的所有约束对应的命令。
7)应用SDC文件进行编译:在Settings->TimeQuest Timing Analyzer页面添加生成的SDC文件,然后进行全编译,即得到符合用户时序约束要求的编译结果。
2.3.2写脚本添加时序约束
Quartus自从9.0版本之后就不支持Classic Timing Analyer了,采用synopsis公司的综合工具Design Compiler中综合时编写脚本的方式来添加时序约束。
想必大家对于DC中写脚本已经很熟悉了,Quartus中只用加时钟约束部分,没有DC中那么复杂。(举例说明)
set PERIOD_CLK 20.000 create_clock \ -period $PERIOD_CLK \ -name clk \ [get_ports {clk}] derive_pll_clocks create_clock \ -name clk_virtual \ -period $PERIOD_CLK set_clock_latency -source \ -early 0.100 \ [get_clocks clk_virtual] set_clock_latency -source \ -late 0.110 \ [get_clocks clk_virtual] set_clock_latency -source \ -early 0.100 \ [get_clocks clk] set_clock_latency -source \ -late 0.110 \ [get_clocks clk] derive_clock_uncertainty set_input_delay \ -clock [get_clocks {clk_virtual}] \ -max 1.0 \ [all_inputs] set_input_delay \ -clock [get_clocks {clk_virtual}] \ -min 0.8 \ [all_inputs] set_output_delay \ -clock [get_clocks {clk_virtual}] \ -max 1.0 \ [all_outputs] set_output_delay \ -clock [get_clocks {clk_virtual}] \ -min 0.8 \ [all_outputs]
2.3.3配置内部信号上全局时钟树
提高时钟速率的方法,除了在TimeQuest中对时钟信号添加约束之外,可以通过将一些非全局高扇出信号拉到全局时钟线或局部时钟线上,即挂到全局时钟树或局部时钟树上。
那么怎么知道那些信号是非全局高扇出信号呢?
在自己建立的工程综合之后的目录下面会看到综合报告,其中*.fit.rpt是布局布线报告,打开之后,查询Non-Global High Fan-out Signal,会看到一些非全局的高扇出信号,你会开始意识到,有些信号是需要拉到全局时钟线的,比如使能信号,接地,局部复位等等,高扇出的信号最好拉到全局时钟线,速度会提高。(有例为证)
将内部信号拉到全局时钟线的方法如下:
(1)打开Assignments中的Assignment Editor
图2.43
(2)可以看到三个工作框,上面那个显示可以设置的目录,中间框右键可以看到Node Finder…,打开可以看到内部信号查询窗口
图2.45
(4)如图将复位信号添加过来,然后确定
图2.46
(5)在配置名称下拉菜单中选取Global Signal(Accepts wildcards/groups)
图2.47
(6)配置Value——>on
(7)保存配置