一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 7700|回复: 7
收起左侧

about Quartus II TimeQuest Timing Analyzer PDF documentation

[复制链接]
发表于 2011-4-1 15:26 | 显示全部楼层 |阅读模式
本帖最后由 kenson 于 2011-4-1 15:34 编辑 7 H. a  }: g5 f. q7 S* H5 X
3 V! n  I- z7 J6 k* N% p
SDC 命令/ L& I8 g& `" Y. f% z* O
mnl_sdctmq.pdf (846.7 KB, 下载次数: 687)
, e* z: N: j+ ^* G/ ^  R# L, R8 u  t+ C$ u
timequest cookbook, ~* J0 H5 Y: y, Y
mnl_timequest_cookbook.pdf (312.89 KB, 下载次数: 910) / D+ R! k! m6 b# W9 `
( J9 f; G2 _& Y% A8 R$ D, u" o
wp-01047-performing-equivalent-timing-analysis-between-timequest-and-trace.pdf (1.25 MB, 下载次数: 742) 4 a1 g" ~& s, r/ o, @
  J3 ]* B9 W* Q/ }( q
qts_qii53024.pdf (1.19 MB, 下载次数: 516)
/ R8 i7 a7 W9 U
) U; X- x. x; R9 W. V$ ]& M) H9 t7 `6 B+ G/ ]

' Z! Y0 W4 W3 @" @$ v! _/ u' E+ X5 m( A5 b5 _/ B
5 N* M% l) h& ?1 }" U

" X% g3 [7 }% h4 e. {' }2 f8 T
% w- }1 M% W; \$ @请不要回复此贴
  q3 \9 |, d: z: L2 O/ W此贴是我自己学习记录用的
 楼主| 发表于 2011-4-3 12:43 | 显示全部楼层
本帖最后由 kenson 于 2011-4-3 12:56 编辑 . r& h4 {4 \3 ?9 n" M) h

: M" C1 q: Z; WFPGA设计中关于分频时钟的考虑
! s% m8 n+ }% D) FFPGA设计中经常会将某个时钟进行分频处理,分频后的信号作为另一个时钟信号驱动设计中的其他模块。看起来这是一种很简单的方法,但是有经验的工程师都不会推荐直接将分频后的信号作为时钟信号使用。为什么呢? 原因主要有以下几个方面。 1. 分频后的时钟相对于原来的时钟有一个延迟,如果用这个时钟去锁存由原时钟驱动的信号,就有可能发生timing error,导致setup time或者hold time不满足。3 ]& g( v( O  H+ ]+ O* Z% e4 A
, K! ~: p$ k% x

1 k" b/ B, `6 g1 N, Y& @0 z" W# z2. 如果分频后的时钟没有采用全部时钟的布线资源,就会使得该时钟到达FPGA内部各个逻辑块的skew相差较大,给时序分析工具带来很大的困难。如果没有在时序约束文件中将分频得到的始终和原时钟相关联,工具不会分析分频后时钟域和原时钟域之间的路径。 3. 即便是时序分析工具可以完成设计的时序分析,由于这些skew在电压、温度变化的时候也会发生变化,会引入更多的随机因素,从而有可能使得设计的稳定性变差,经常发生一些随机出现的错误,使得时序难以收敛,延误开发的进度。 一般来说如果必须要进行时钟的分频,可以采用时钟使能的方式,另外在Xlinx的FPGA中可以采用DCM实现0 skew的时钟分频。当然Altera的器件可能也有类似的硬件资源。 下面是一个简单的用时钟使能实现2分频的Verilog HDL例子:+ a8 p3 |/ u8 E/ z  _) `5 w
  1. reg  clk_en;
    , J9 }( D4 Q& x
  2. always @ (posedge clk)    //clk 为原时钟
    ' L8 G/ J) j  z) g1 E2 C) v
  3. begin  c6 N8 J/ k# J* w3 P2 k
  4.         clk_en <= ~clk_en; //clk_en在每个clk的上升沿翻转一次,相当于clk的二分频
    # K' O0 P' k+ O; X
  5. end8 }4 g2 f( B2 W' f% _# _! J( [
  6. //时钟使能方式3 G; ^) k, L4 s0 Z" s1 J  O
  7. always @(posedge clk)1 t* k. n7 j, g9 T3 {: @
  8. begin8 O  a% I! _8 J" K8 U0 Q6 V% z: \
  9.         if(clk_en)
    : w, a; g" T% r. B; ~; v( A  c
  10.                 begin7 ~5 F3 @4 G/ t6 v, O3 X
  11.                 //二分频时钟驱动的逻辑
    5 \( p' |0 g  L+ j1 g
  12.                 end
    * P1 v4 R" F8 r- w
  13.         else5 S- ?& I  F7 A- {
  14.                 begin
    3 r! f% A5 y. S0 m) j2 U, |
  15.                 end7 M5 Y3 u5 Z2 {- k# W" {
  16.         end7 A( P% z5 t: w" L, X) ~

  17. - [" s8 k$ {* u7 p7 v# R4 |
复制代码

( B# c. {. v6 f$ s
% L/ p: C6 N: g! p  M5 u, q7 f) h0 h/ A' F. Y% v1 ^; b
. l3 s# @6 Z& U2 t
5 h- d9 ]7 `  d' \. S" e2 e
  1. //=============直接分频方式===============
    ( G* A$ z( [9 X; J/ a  }
  2. reg clk_div2;
    ' c& g+ t# n# r7 l1 v% \
  3. always @ (posedge clk) //clk 为原时钟
    0 S8 Y* C) D' {/ |) R
  4. begin: Z8 U% q$ d7 a* I6 f$ r
  5. clk_div2 <= ~clk_div2; //clk_div2在每个clk的上升沿翻转一次,相当于clk的二分频0 _$ S1 Y% e2 l0 m* m2 R
  6. end
    5 @0 B+ y; R( O
  7. always @(posedge clk_div2)
    + j+ b/ B/ I# C! e, _
  8. begin
    $ K" M) K, d4 n
  9. //二分频时钟驱动的逻辑
    * Q& C& {, W9 R3 Q) G) A3 Z
  10. end
    ' ]# I5 F2 A0 W9 m4 {

  11. & s- a6 b1 a3 @3 U9 ^6 L
  12. % M- s7 N5 [; h
复制代码
 楼主| 发表于 2011-4-3 13:06 | 显示全部楼层
本帖最后由 kenson 于 2011-4-3 16:26 编辑 9 Y  z( W+ e' K, w

" f  i3 c7 ?  t. M. Z时钟3分频电路% [# O+ n2 j  l& L1 a
- ^: S+ W: }8 |' \* f
  1. module clk_3_odd (clk,reset,clk_out); //占空比为50%: ?3 d" P6 l6 T5 S3 i
  2. input clk, reset; - r+ o* ~: d! \/ k
  3. output clk_out;
    1 x& P8 ]4 l5 X" D8 Z$ u
  4. reg[1:0] state; # ]4 t! A4 q% w7 u) V7 N& P. N
  5. reg clk1;
    - |% u/ m7 k# w
  6. parameter s0=2'b00;
    3 ~% ~0 {2 x- N: W8 Z+ [7 e
  7. s1=2'b01;
    , u: n4 Q) ^7 L9 \& a
  8. s2=2'b11;
    2 I2 R# e- t) g  u9 D& T+ n
  9. always @(posedge clk or negedge reset) - r( w) `  g* s( Z% ~
  10. if(!reset)
    , S+ R/ W" @# w. j! x& L
  11. state<=s0; 8 d( J& y/ x) Q+ c
  12. else 3 {- C; w/ ~) b) K$ L4 `
  13. case(state) 8 T! b$ R& I' x! C1 T4 A3 i( U
  14. s0:state<=s1; $ m$ c" O" [# s' i' x
  15. s1:state<=s2; & h2 e5 i/ r6 n1 K' t
  16. s2:state<=s0; ) i/ l* P; l( B+ s' w( a
  17. default:state<=s0; $ H" a4 N* [' F
  18. endcase * U1 o) H: C. M# R6 R6 |
  19. always @(negedge clk or negedge reset) 3 o* K7 y" p# \- [& V
  20. if(!reset)
    / b  r: i$ H; y( A1 Y$ A6 b- P
  21. clk1<=1'b0;
    : k, U$ N/ g) C( z$ ]
  22. else
    $ z1 A* h1 P  Y- {0 V
  23. clk1<=state[0];
    ' t. P3 N4 I' v7 u* R9 O( ~( t
  24. assign clk_out=state[0]&clk1;
    % L! R$ S5 f# J) E! }
  25. endmodule
复制代码
 楼主| 发表于 2011-4-3 15:58 | 显示全部楼层
标签: FPGA  时钟  
. t5 l0 u& {+ K" |) `! b$ n# ]) ?0 v0 r# I; j" d% n* ~& ?% D% N( Q
FPGA中的时钟使能(转)% y7 y* ]2 r9 n5 ^" c  m- ]
  时钟使能电路是同步设计的基本电路。在很多设计中,虽然内部不同模块的处理速度不同,但由于这些时钟是同源的,可以将它们转化为单一时钟处理。在ASIC中可以通过STA约束让分频始终和源时钟同相,但FPGA由于器件本身和工具的限制,分频时钟和源时钟的Skew不容易控制(使用锁相环分频是个例外),难以保证分频时钟和源时钟同相,因此推荐的方法是使用时钟使能,通过使用时钟使能可以避免时钟“满天飞”的情况,进而避免了不必要的亚稳态发生,在降低设计复杂度的同时也提高了设计的可靠性。
. B1 P6 ?, s4 q: V6 X
! V0 v' a5 b6 r, ]1 D/ t    带使能端的D触发器,比一般D触发器多了使能端,只有在使能信号ENA有效时,数据才能从D端被打入D触发器,否则Q端输出不改变。: e- E, s6 y  E5 i
6 h% X2 G9 ~' |
    我们可以用带使能端的D触发器来实现时钟使能的功能。$ R# W4 n0 A! z: S3 B: b8 D

% Z& z5 a/ l/ ~2 {5 [$ W% s! n1 L$ c  J* L5 P! E- C2 a$ u/ ~! z
verilog模型举例
  m! ^3 p" w9 `; N5 `7 q! q7 a: S7 ~; }' [0 `7 A7 c
    在某系统中,前级数据输入位宽为8位,而后级的数据输出位宽为32,我们需要将8bit数据转换为32bit,由于后级的处理位宽为前级的4倍,因此后级处理的时钟频率也将下降为前级的1/4,若不使用时钟使能,则要将前级的时钟进行4分频来作后级处理的时钟。这种设计方法会引入新的时钟域,处理上需要采取多时钟域处理的方式,因而在设计复杂度提高的同时系统的可靠性也将降低。为了避免以上问题,我们采用了时钟使能以减少设计复杂度。
7 h7 L5 _( o) [% |( h9 x: ~
1 q9 o7 X/ ]5 ~' `. y例1:采用时钟使能
* m7 K4 v0 R: W5 c6 g5 |# _' @+ }7 }6 C6 z  |$ ~
module clk_en(clk, rst_n, data_in, data_out);
/ n8 H0 m' U6 \1 }" I  jinput clk;3 K" r5 ~8 C. \) P" Y
input rst_n;7 }( d" V5 e8 k  U
input [7:0] data_in;
$ n3 E6 @$ ?7 boutput [31:0] data_out;7 w" P) k: l% J9 y( W: L- w

( o; P; A0 G4 u( \4 areg [31:0] data_out;% t0 k0 E" `5 Y* J' x4 m
reg [31:0] data_shift;
( w7 [1 n. [5 p: B) Y4 Wreg [1:0] cnt;
8 ]6 H% S  Y5 w. X2 \7 Kreg clken;
$ B! a6 |7 [! }" A  N$ j* W/ s" ]' a2 g! ?1 X8 Q% O5 S! j
always @(posedge clk or negedge rst_n), c# }- \  S# ?" I( i5 e
begin/ |  _/ X  G) x$ w! R/ [
   if (!rst_n)) ]+ K( ^# O6 L  e9 W
      cnt <= 0;
8 U# B( y# j: A   else: Y: l7 Q; E: f/ s/ N( q1 Z2 ]: V; f
      cnt <= cnt + 1;- X6 I- t, v6 F# ?
end5 Y" U! ~: b* a8 m; E0 Z3 K
, a/ M. l  C8 L. R# L
always @(posedge clk or negedge rst_n)
, K7 Z! G; o! d& t/ \  x  |begin
) W' t6 p4 C8 ^* z* S* L+ p   if (!rst_n)/ G: G+ }  X) m! t% ~' \
      clken <= 0;/ O; u8 t. _( ^! s( v) _9 g" Q
   else if (cnt == 2'b01)
, B4 M) n/ m" |% [$ c' b3 |! x6 e      clken <= 1;
8 t1 e6 J/ M, r5 o5 Z) u" {5 J" w   else9 \. E# G0 D: ^. P
      clken <= 0;
# f9 P9 c: _$ L7 s' Dend& ^( P& m# r- z  u" |1 j7 l
& H# G8 z1 d3 E
always @(posedge clk or negedge rst_n)
$ k( f8 `# [5 _( X/ lbegin
( m" m6 u4 R5 _  I; _- p/ Y4 p   if (!rst_n)+ q( `. Z& f9 H+ s: Q
      data_shift <= 0;1 w7 r7 Q9 b$ w. p. }9 i, @
   else ' C& |, U0 y( g
      data_shift <= {data_shift[23:0],data_in};: h" q* R; o7 f3 T7 Z# E
end
0 |) P! m/ R3 j* }' C
! ?  N& C0 n9 S5 ealways @(posedge clk or negedge rst_n)3 p: ?7 G" ]' V; {$ g+ p, A- V
begin
) K$ b8 q: O/ u# I) a% J$ R. @  f   if (!rst_n)
* g& {0 Q* T& |, n4 P      data_out <= 0;
  t0 M; `% x" h: I   else if (clken == 1'b1)
& o) |) N' i1 k8 y2 c      data_out <= data_shift;
; z! u: P+ \) k! C9 e8 f% Z: H% Eend
; r8 T3 {9 `7 m4 w4 N' F* J, R' @" _) O  W& ^: \9 r
endmodule
 楼主| 发表于 2011-4-3 16:28 | 显示全部楼层
例2:采用分频方法
+ k  x, `' m1 M) h) r5 h2 T$ G* C6 ]4 o* y
module clk_en1(clk, rst_n, data_in, data_out);1 V! v. H) C+ \- z( z9 s6 l
input clk;
! o& ?" m! \# g6 o$ Iinput rst_n;6 j9 ?. M" \1 X; ]8 @8 X. W
input [7:0] data_in;
1 H( A7 {# Z) |" I1 d% t. [0 ]output [31:0] data_out;
- |4 n6 b) q: O$ s
, c  Q" s5 O. h$ Mreg [31:0] data_out;0 E+ Q; x% I/ C8 R6 ?- A; X
reg [31:0] data_shift;& e$ }" j3 s& h* {! N
reg [1:0] cnt;
8 |  Z. F9 ^# S1 e) o6 w' gwire clken;
/ o4 u9 P2 a0 h0 G0 n1 j& Q5 L+ N$ U: T& T
always @(posedge clk or negedge rst_n)
5 `) Y/ K: O- d- P' i1 V9 wbegin1 u6 D. `5 _3 n% E: @
   if (!rst_n)
8 a. p! N; P' s) R0 c- }      cnt <= 0;/ f5 r3 F. i1 K3 M  a2 g
   else/ M' ?- @' X6 a* S0 s
      cnt <= cnt + 1;2 [% C6 y8 t! `0 v/ g( p
end$ a& U- U- n3 \1 ?

0 `: Q: i  ~' G8 a) P* qassign clken = cnt[1];
) B2 C  u9 m  E, t* l1 @$ o" D' ]
always @(posedge clk or negedge rst_n)
7 |" G4 [9 C6 z" z& fbegin
& o( C! s: Q3 f, b3 Z   if (!rst_n)1 `) E! ~. U* U9 B: I2 p: l+ Q: R
      data_shift <= 0;3 h6 i9 Q' W5 q/ c7 g
   else ; \2 h# Z6 N/ M6 e
      data_shift <= {data_shift[23:0],data_in};
& ]. a: s8 B6 k! zend2 t5 M3 c: t; ^
- v; X( D& r' L& X9 l# O
always @(posedge clken or negedge rst_n)
  a' p% f. W( O9 Ubegin2 L$ f: j3 t: R$ \# y. ?
   if (!rst_n)! \1 a4 t6 H6 i* B
      data_out <= 0;" Y, s" a7 {; I3 A) e
   else 5 t' i' q5 {% R: X9 S
      data_out <= data_shift;
' p8 J6 K: z0 @! ^* rend. ^; u' f  S- W

7 x! h$ I: {* y# l- g' b( Kendmodule
 楼主| 发表于 2011-4-3 16:36 | 显示全部楼层
FPGA时钟问题集合 $ S( V: E" V. U8 n2 v; ~' W% f
& ^; T- B1 h3 x. k3 k3 E' o
) H( D! ^0 s* ~2 a( _/ t+ ~/ `
无沦是用离散逻辑、可编程逻辑,还是用全定制硅器件实现的任何数字设计,为了成功地操作,可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下将导致错误的行为,并且调试困难、花销很大。在设计PLD/FPGA时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。* z' r  ?' O1 W, G! m% L  @% m6 c0 q

) ~+ L. K" Z3 O9 K  f5 i. i; g! c$ [& _) e* z1 X3 @/ r
1.全局时钟: l2 s. Z$ [9 p5 }# a/ l
* H* u8 _1 }0 n0 e* P4 N
对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在PLD/FPGA设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。PLD/FPGA都具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。
6 P. T9 [( h: X" b6 ^9 K- ^
% Y2 C3 Y/ P! [5 w2 h" E% x$ X: m
图1 示出全局时钟的实例。图1 定时波形示出触发器的数据输入D[1..3]应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在PLD数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号(参看下一章“异步输入”)。
( H1 {; U: j$ x/ n6 F- ]5 L

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_1.jpg

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_2.jpg

* I5 W  t- m" ^( J) D+ ~3 z1 H
图1 全局时钟


) }2 m( a% ?" y4 j1 A(最好的方法是用全局时钟引脚去钟控PLD内的每一个寄存器,于是数据只要遵守相对时钟的建立时间tsu和保持时间th)$ r/ v5 s! n+ Z5 y3 e2 T
 
# _- t" U3 N6 {: |2.门控时钟
1 h$ U) Z1 _9 M! Z  b8 z* p8 l4 {
在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的。PLD具有乘积项逻辑阵列时钟(即时钟是由逻辑产生的),允许任意函数单独地钟控各个触发器。然而,当你用阵列时钟时,应仔细地分析时钟函数,以避免毛刺。
4 L9 g& V7 ?# f通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关,用地址线去控制写脉冲。然而,每当用组合函数钟控触发器时,通常都存在着门控时钟。如果符合下述条件,门控时钟可以象全局时钟一样可靠地工作:6 X/ L  o) u* w, e$ s

2 z) z+ p6 U" ~8 a" B  a1.驱动时钟的逻辑必须只包含一个“与”门或一个“或”门。如果采用任何附加逻在某些工作状态下,会出现竞争产生的毛刺。! ]" ], }8 e' o7 J+ Z' u* ~. \2 _
2.逻辑门的一个输入作为实际的时钟,而该逻辑门的所有其它输入必须当成地址或控制线,它们遵守相对于时钟的建立和保持时间的约束。
" p2 t8 I; }0 v. L2 s# I5 m2 k7 D8 R0 F9 ?5 f% s& ^% E
/ K5 j! X0 h4 K, {) D9 ~
图 2和图3 是可靠的门控时钟的实例。在 图2 中,用一个“与”门产生门控时钟,在 图3 中,用一个“或”门产生门控时钟。在这两个实例中,引脚nWR和nWE考虑为时钟引脚,引脚ADD[o..3]是地址引脚,两个触发器的数据是信号 D[1..n]经随机逻辑产生的。8 H+ Q  U+ P6 u

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_3.jpg

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_4.jpg

图2 “与”门门控时钟


. M+ [/ y2 R1 k7 }, [! [4 ` 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_5.jpg


6 k* o7 ]$ ?0 b 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_6.jpg

图3 “或”门门控时钟


! E* u* p" B1 {' u
* H8 C0 D; Q' C5 c图2和图3 的波形图显示出有关的建立时间和保持时间的要求。这两个设计项目的地址线必须在时钟保持有效的整个期间内保持稳定(nWR和nWE是低电平有效)。如果地址线在规定的时间内未保持稳定,则在时钟上会出现毛刺,造成触发器发生错误的状态变化。另一方面,数据引脚D[1..n]只要求在nWR和nWE的有效边沿处满足标准的建立和保持时间的规定。
' ~( Y6 c8 H$ x- m& N: ^$ D: |4 q
# I" H) }6 B1 \- F; c我们往往可以将门控时钟转换成全局时钟以改善设计项目的可靠性。图4 示出如何用全局时钟重新设计 图2 的电路。地址线在控制D触发器的使能输入,许多PLD设计软件,如MAX+PLUSII软件都提供这种带使能端的D触发器。当ENA为高电平时,D输入端的值被钟控到触发器中:当ENA为低电平时,维持现在的状态。

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_7.jpg


" w* b6 X0 s6 A3 x- Phttp://image16.360doc.com/DownloadImg/2010/10/2417/6240652_8.jpg

图4 “与”门门控时钟转化成全局时钟. F5 _. \& ]" G

8 |2 y7 w: U& ?

4 D: q8 m2 U! J2 K( D; h) [
6 k; l; E+ \- b0 C3 ?& w% Q& i1 ^; H! s
图4 中重新设计的电路的定时波形表明地址线不需要在nWR有效的整个期间内保持稳定;而只要求它们和数据引脚一样符合同样的建立和保持时间,这样对地址线的要求就少很多。; `6 K2 F1 ?8 O! }' H% S

% l) X( h& Y9 D. D图给出一个不可靠的门控时钟的例子。3位同步加法计数器的RCO输出用来钟控触发器。然而,计数器给出的多个输入起到时钟的作用,这违反了可靠门控时钟所需的条件之一。在产生RCO信号的触发器中,没有一个能考虑为实际的时钟线,这是因为所有触发器在几乎相同的时刻发生翻转。而我们并不能保证在 PLD/FPGA内部QA,QB,QC到D触发器的布线长短一致,因此,如 图5 的时间波形所示,在器从3计到4时,RCO线上会出现毛刺(假设QC到D触发器的路径较短,即QC的输出先翻转)。( c( @5 Z2 d; g8 V/ H$ Z

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_9.jpg

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_10.jpg


8 T9 I- h; o0 C% v& P8 W( N" I7 f 

0 g. l! U( p7 b1 B3 Y1 v
图5 不可靠的门控时钟
3 `: M- F7 ?& d+ i' |* ^/ t: y& S3 j$ q& F
(定时波形示出在计数器从3到4改变时,RCO信号如何出现毛刺的)

6 E: L( k' B2 E& ^

* p6 u+ m( Q6 S/ t. `) G( V' L: c" D
图6 给出一种可靠的全局钟控的电路,它是图5不可靠计数器电路的改进,RCO控制D触发器的使能输入。这个改进不需要增加PLD的逻辑单元。

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_11.jpg
! Y% S4 g9 ~/ x* Q- W5 {
6 P! U8 Q! ]0 ~& W图6 不可靠的门控时钟转换为全局时钟
2 E1 S1 ~+ N, Q. o" {
/ C$ x$ M/ t! h- A& S4 \7 B(这个电路等效于图5电路,但却可靠的多)


$ r. W+ n5 Y; e( ~0 e0 U: A1 l) t' K
8 i' U1 ]; B: q$ j5 F0 M+ x3.多级逻辑时钟
7 J; X. @- I8 z( @& D! w* D: W
" j) Y6 i0 ?- O3 [& [; B" Y当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时,证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在着危险。通常,我们不应该用多级组合逻辑去钟控PLD设计中的触发器。
9 R( H5 z4 T/ x% m1 x$ r, Z9 p! |2 D  D; O8 Y+ f! W! f/ W" x0 D
图 7 给出一个含有险象的多级时钟的例子。时钟是由SEL引脚控制的多路选择器输出的。多路选择器的输入是时钟(CLK)和该时钟的2分频(DIV2)。由图7 的定时波形图看出,在两个时钟均为逻辑1的情况下,当SEL线的状态改变时,存在静态险象。险象的程度取决于工作的条件。多级逻辑的险象是可以去除的。例如,你可以插入“冗余逻辑”到设计项目中。然而,PLD/FPGA编译器在逻辑综合时会去掉这些冗余逻辑,使得验证险象是否真正被去除变得困难了。为此,必须应寻求其它方法来实现电路的功能。& `  t2 A& o9 b- X: O( B
 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_12.jpg


) V& O( |) G" H% d- j图7 有静态险象的多级时钟

' [% `3 n* |: b! X7 \/ |

  p& K' X# L; @1 P  e6 C: T图8 给出 图7 电路的一种单级时钟的替代方案。图中SEL引脚和DIV2信号用于使能D触发器的使能输入端,而不是用于该触发器的时钟引脚。采用这个电路并不需要附加 PLD的逻辑单元,工作却可靠多了。 不同的系统需要采用不同的方法去除多级时钟,并没有固定的模式。. A3 m* ^8 a! l( X# c& |
 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_13.jpg

图7 无静态险象的多级时钟

(这个电路逻辑上等效于图7,但却可靠的多)

$ G. R# `1 l% ^
 4 t3 l9 C& Z& Q: @" {% E7 `7 i6 T
4.行波时钟
4 U8 D% M7 r, `  b
9 c( ]9 }/ p  S" O, Y, n8 C3 w6 Q另一种流行的时钟电路是采用行波时钟,即一个触发器的输出用作另一个触发器的时钟输入。如果仔细地设计,行波时钟可以象全局时钟一样地可靠工作。然而,行波时钟使得与电路有关的定时计算变得很复杂。行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移,并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时,使系统的实际速度下降。
2 Q3 N) I' D& _- H4 s用计数翻转型触发器构成异步计数器时常采用行波时钟,一个触发器的输出钟控下一个触发器的输入,参看图9 同步计数器通常是代替异步计数器的更好方案,这是因为两者需要同样多的宏单元而同步计数器有较快的时钟到输出的时间。图10 给出具有全局时钟的同步计数器,它和 图9 功能相同,用了同样多的逻辑单元实现,却有较快的时钟到输出的时间。几乎所有PLD开发软件都提供多种多样的同步计数器。
# K' n! W6 N: {2 l8 B 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_14.jpg

图9 行波时钟


  R$ e1 b* ?" r0 J$ G& o7 n# d 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_15.jpg

图10 行波时钟转换成全局时钟
- B$ s2 N/ O4 l6 A+ |& f) Q(这个3位计数器是图9异步计数器的替代电路,它用了同样的3个宏单元,但有更短的时钟到输出的延时)


; c9 f+ f- j; }+ m5. 多时钟系统
. z7 K3 g  w( s  x% e* x# k# j; n5 p2 c1 R

( M: X: y, A9 @  ^+ M$ k, }  X+ q7 L! n: I0 _" n3 x3 `9 p( `

$ q1 D$ y5 I. M3 [# O9 |
: ~# t" l/ Q% O, i: i* T4 G( I( k# ]. Q0 \  d' p  m

8 n  k$ O+ m2 n6 }0 ^# v; @6 N3 Y) z: E4 W' q; o) h) L
许多系统要求在同一个PLD内采用多时钟。最常见的例子是两个异步微处理器器之间的接口,或微处理器和异步通信通道的接口。由于两个时钟信号之间要求一定的建立和保持时间,所以,上述应用引进了附加的定时约束条件。它们也会要求将某些异步信号同步化。
9 m& _3 K, p1 F2 G+ \
" x1 b# B$ B/ u, H3 e图11 给出一个多时钟系统的实例。CLK_A用以钟控REG_A,CLK_B用于钟控REG_B,由于REG_A驱动着进入REG_B的组合逻辑,故CLK_A 的上升沿相对于CLK_B的上升沿有建立时间和保持时间的要求。由于REG_B不驱动馈到REG_A的逻辑,CLK_B的上升沿相对于CLK_A没有建立时间的要求。此外,由于时钟的下降沿不影响触发器的状态,所以CLK_A和CLK_B的下降沿之间没有时间上的要求。,如图4,2.II所示,电路中有两个独立的时钟,可是,在它们之间的建立时间和保持时间的要求是不能保证的。在这种情况下,必须将电路同步化。图12 给出REG_A的值(如何在使用前)同CLK_B同步化。新的触发器REG_C由GLK_B触控,保证REG_G的输出符合REG_B的建立时间。然而,这个方法使输出延时了一个时钟周期。

) ~$ J  o' M9 N8 S* [, \$ |
4 w9 Y+ Z9 _9 D. l& h

. P; R4 Y' I$ N2 \; F3 t

, d3 ]/ _' L- ]& a

. T/ |$ U3 N# U
% Z4 W# a9 D' v1 {2 C6 N& T

- Y. g% u! W7 e7 w5 ?* i, _8 K2 J

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_16.jpg

图ll 多时钟系统
0 I. D7 a- p& P& h  n) F( k7 {+ z(定时波形示出CLK_A的上升沿相对于CLK_B的上升沿有建立时间和保持时间的约束条件)

( O. P% I1 o4 n/ W% X' G& }" _% Z
 

http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_17.jpg

图12 具有同步寄存器输出的多时钟系统
& ?' E8 P1 k1 G7 ]( Z$ e(如果CLK_A和CLK_B是相互独立的,则REG—A的输出必须在它馈送到1REG_B之前,用REG_C同步化)

0 h& r: f+ H: P' A$ x+ T
 : J' M& R- v- H+ G: F/ M
在许多应用中只将异步信号同步化还是不够的,当系统中有两个或两个以上非同源时钟的时候,数据的建立和保持时间很难得到保证,我们将面临复杂的时间问题。最好的方法是将所有非同源时钟同步化。使用PLD内部的锁项环(PLL或DLL)是一个效果很好的方法,但不是所有PLD都带有PLL、DLL,而且带有 PLL功能的芯片大多价格昂贵,所以除非有特殊要求,一般场合可以不使用带PLL的PLD。 这时我们需要使用带使能端的D触发器,并引入一个高频时钟。

 http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_18.jpg

图13 不同源时钟

& M  K2 ?# n& `, h' _" ~
如图13所示,系统有两个不同源时钟,一个为3MHz,一个为 5MHz,不同的触发器使用不同的时钟。为了系统稳定,我们引入一个20MHz时钟,将3M和5M时钟同步化,如图15所示。 20M的高频时钟将作为系统时钟,输入到所有触发器的的时钟端。3M_EN 和5M_EN将控制所有触发器的使能端。即原来接3M时钟的触发器,接20M时钟,同时3M_EN 将控制该触发器使能,原接5M时钟的触发器,也接20M时钟,同时5M_EN 将控制该触发器使能。 这样我们就可以将任何非同源时钟同步化。

9 w$ s& s( a# {: w/ A
http://image16.360doc.com/DownloadImg/2010/10/2417/6240652_19.jpg

图13 同步化任意非同源时钟

(一个DFF和后面非门,与门构成时钟上升沿检测电路)

- j' ?* v3 i" E: f. N$ l4 J. s$ x

另外,异步信号输入总是无法满足数据的建立保持时间,容易使系统进入亚稳态,所以也建议设计者把所有异步输入都先经过双触发器进行同步化,详情可参阅这篇文章:Are Your PLD Metastable?


+ ?" A# J3 l3 F. |4 h+ k+ O1 P4 A9 _/ m 
$ G( j( f; q' F3 R0 w3 \小结:稳定可靠的时钟是系统稳定可靠的重要条件,我们不能够将任何可能含有毛刺的输出作为时钟信号,并且尽可能只使用一个全局时钟,对多时钟系统要注意同步异步信号和非同源时钟。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-1 16:33 , Processed in 0.054346 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表