(一)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
FPGA设计一条原则是尽量使用同步逻辑,即尽量整个设计中使用一个clock,而且该clock尽量走全局时钟线,也就是不要在clock path上加上逻辑,不要用“受控时钟”。但是在有些情况下,“受控时钟”难以避免,例如在用FPGA进行验证ASIC设计时,因为ASIC为了low power的要求,通常会使用逻辑控制时钟的开关。
如果对“受控时钟”不加以任何变换,其负面作用通常是通常会有hold timing冲突。hold timing问题不像setup timing问题,不能靠依靠降低时钟频率解决;在ASIC设计时解决hold timing问题通常靠工具自动增加时钟树分支延迟,使时钟到目标寄存器的时间在建立-保持时间窗内。
在FPGA阶段,通常有几种办法:
1. 不理会hold timing问题,这样可能有时编译出来的系统可以正常工作,有时候又不能工作, 比较飘逸;
2. 手工将gate clock等系统“异步”时钟改成同步时钟,办法就是将clock path上的逻辑合并到寄存器的数据输入端。
3. 使用synplify将gate clock转换为non-gate clock
4. altera quartus8.0以上有转换gate clock的功能,可以使用。
(二)
synplify把gate clock转换为non-gate clock的功能早已具有,这里先不讨论,下面主要试试altera的gate clock功能。
(1)先试个简单的电路图,
(2)打开菜单assignments->settings,在Analysis&Synthesis Settings项,选More settings,打开如下图对话框,
注意将Auto Gated Clock Conversion选项设置为:On。
还要写一个sdc约束文件,因为要使用Auto Gated Clock Conversion功能,必须使用TimeQuest Timing Analyzer 作时序分析,并且在sdc文件中定义所有的base clocks。
简单SDC文件如下,
###########################################################################
#
# Generated by : Bruce Zhan
# Purpose : To verify gate-clock conversion using quartus8.1
# Project : None
# Revision : None
#
# Date :
#
###########################################################################
# **************
# **Time Information
# -------------
set_time_format \
-unit ns \
-decimal_places 3
# **Create Clock 100MHz
# -------------
set period 10.000
set period1 [expr $period*2]
create_clock [get_ports i_clk] \
-name clk \
-period $period \
-waveform {0.000 5.000}
然后在Timing Analysis Settings项下,作如下图设置,
记住要选中Using TimeQuest Timing Analysis during compilation。
然后开始编译。
(3)查看结果。
编译报告见下图,
上图表明有一个clock被作了auto gated clock conversion。
打开如下图菜单,查看电路图,
Netlist电路图如下,
如果不使能auto gated clock conversion,则电路图如下,
从上面两附图中可以看出gated clock确实变成了non-gated clock。
(三)
并不是所有的gated clock都能够转换的,Quartus作了如下指导原则,
1)Gating逻辑应该使用两输入“与”门或者两输入“或”门。
2)“与”门/“或”门两个输入中应该只有一个是“真”的时钟(primary input clock)。
3)“与”门/“或”门的“非时钟输入”信号最好先用一个Register同步,这个用作同步的Register要使用primary input clock。
4)用作同步的Register的clock端口可能用primary input clock的上升沿或者下降沿,取决于Gating逻辑使用“与”门还是“或”门;原则是要防止clock关闭时产生一次虚假的clock沿:
当Gating逻辑用“与”门时:
“同步”Register的clock端口使用primary input clock的下降沿,
“工作”Register的clock端口使用gated clock的上升沿;
当关闭时钟时,假如primary input clock处于“0”,关闭后还是“0”,没有“毛刺”,
当关闭时钟时,假如primary input clock处于“1”,关闭后是“0”,这时有一个“1”->“0”的下降沿,但因为“工作”Register上升沿有效,所以不会产生误动作。
当Gating逻辑使用“或”门时:
“同步”Register的clock端口使用primary input clock的上升沿,
“工作”Register的clock端口使用gated clock的下降沿;
当关闭时钟时,假如primary input clock处于“0”,关闭后是“1”,这时有一个“0”->“1”的上升沿,但因为“工作”Register下降沿有效,所以不会产生误动作;
当关闭时钟时,假如primary input clock处于“1”,关闭后还是“1”,所以也没有毛刺。
5)为了减少整个FPGA电路系统中glitch(组合逻辑通常会有glitch)的传播,因此作为Gating logic的“与”门/“或”门应该尽量靠近“同步”Register。
6)整个Gating clock做成一个module,其中包括Gating逻辑,同步Register。
根据上述指导原则,第一幅电路图有1处问题:
gate信号没有用register同步;
修改后的电路图见下,
综合后的网表电路,
从上图中可以看出Working Register的clock已经是non-gated的了。
文章评论(0条评论)
登录后参与讨论