原创 RTL级设计中的时钟与复位

2007-1-31 20:33 4969 16 16 分类: FPGA/CPLD

时钟和复位在数字系统设计中的重要性是勿庸置疑的.RTL级设计中,要表示一个时钟并不复杂,Verilog中只需像下面这样写就表示clk是一个时钟:EDA中国门户网站+aX:p)[!Bc
^

always @ (posedge clk)EDA
中国门户网站]"b6G'N9bO;P4Y*c
同样复位也不复杂,如:



x'fW2z[1]L.`huqc2007同步复位:always @ (posedge clk)EDA中国门户网站'Z]9N}U;_ D,w8a
   
     if(rst)
‑w-p vB"H2}huqc2007      
     复位操作;
3JIiE[1]I&{'yhuqc2007
      elseEDA中国门户网站F PF$U7Gat x
      
    正常操作;EDA中国门户网站.w3vj0q \3x0o ZV
异步复位:always @ (posedge clk or posedge rst)
8Tg'pl;hhuqc2007   
     if(rst)EDA中国门户网站Av#[u(Y4Q2t3_^AfB7W
      
     复位操作;EDA中国门户网站;g*l aVY
? U3w#^
[1]T;x/bm

      elseEDA中国门户网站;G'Zq6d



M$u/r"?{
      
    正常操作;EDA中国门户网站S ~jh hH





M,~
  虽然在RTL级设计中表示时钟或是复位并不复杂,但实际关于时钟和复位的使用和相关的问题却要复杂的多.
T&e(I#o`huqc2007
  对于时钟,如果我们的设计中只使用了一个全局时钟,那么我们在编写RTL级代码时没有必要过多的考虑时钟的问题,因为这种时钟无论在仿真,还是在FPGA或ASIC的实现都是比较简单的.但是多数情况我们没这么幸运,设计中经常会因为功能需求需要在芯片同时使用多个时钟,同时还需要在不同的时钟域间传递数据,这在电信和数据通信领域是很常见的.当数据从一个时钟域进入另一个时钟域时,如果产生数据的时钟和采样数据的时钟是异步关系,有可能造成数据传输时序关系的混乱.要解决这一问题,需要多方面的考虑,包括时钟域的规划、综合、仿真、测试等等。
~v-L y#w-q





Rhuqc2007  对于复位信号的处理,也会有类似的问题。比如是选择同步还是异步复位,复位电路如何保证安全可靠等等。下面我们就对时钟系统和复位的处理进行详细的讨论。EDA中国门户网站[1]@ ko­}­{.[1Wj
多时钟信号的处理
}ac C Hhuqc2007
  多时钟系统相对于单时钟系统的设计要复杂的多,这主要体现在以下几个方面:
r.ZQ/i c1i@
Phuqc2007
  在设计规划中如何根据时钟域划分模块;多时钟系统的RTL级,特别是跨时钟域边界的数据传输方法;以及相关的仿真、综合及测试的问题。EDA中国门户网站Z-R[1]IcSf
   对于多时钟系统,每个时钟域当中都是一个单时钟系统。因此,问题的关键是信号(数据或控制信号)从一个时钟域传输到另一个时钟域如何保证功能的正确。不同EDA中国门户网站 ve%[(Z%^9o K
时钟域间信号传输首先可能遇到就是由亚稳态产生同步失败问题。亚稳态是指当触发器的数据端的变化与时钟的有效沿很近(不能满足建立和保持时间)时,其输出不能稳
#B'[#b0F1C"@I'Jthuqc2007
定在一个确定的状态()。
S‑[1XRC W)Kfhuqc2007
   解决亚稳态的问题,最常用的方法是使用同步电路。同步电路的作用是采样一个与本地时钟域异步的信号,并将其同步的传输到本地时钟域当中。最常用的同步电路
[1]oH"]uu}huqc2007
是双触发器同步电路。第一个触发器用本地时钟对异步的输入信号进行采样,并等待一个时钟周期以保证第一级的输出信号的亚稳态趋于稳定,然后第一级信号被第二级触EDA中国门户网站2?
eF"l6Cl+i

发器采样,这样就可以保证第二级触发器的输出信号是稳定的,并且与本地时钟同步。从理论上来说,当第二级触发器采样时,第一级信号有可能仍然处于不稳定状态,这样EDA中国门户网站%J:~}Sa(t+V&xO
可能导致第二级触发器的输出仍为亚稳态。这种可能性和产生输入信号的时钟频率以及同步时钟频率有关。一般来说,两级触发器的同步电路就足以消除亚稳态的问题了。EDA中国门户网站 n#c-c+Mm6@
因此作为一条设计规则,对于所有从一个时钟域到另一个时钟域的信号都应该使用同步电路。使用VHDL描述这条规则就是:EDA中国门户网站:U9\p)zsz
..EDA
中国门户网站C$r.zS$I6N WRQ^!G!`
process(clka)EDA
中国门户网站 g6r ? C"Su





t.};o





p
   begin
1s#T





e9Q"@,q Hzhuqc2007    if clka'event and clka='1' thenEDA中国门户网站TR:K a2c~0B,X
          data_a <= data;EDA
中国门户网站8CQ





i"L‑W;~,N
    end if;
o4s ^f~





Whuqc2007end process;EDA中国门户网站j8kFW9CW'Q­u;{%UF
process(clkb)EDA
中国门户网站~"F2[&n1d
   beginEDA
中国门户网站‑f‑~%j`s1C.s
    if clkb'event and clkb='1' then
&?





v2U3^/phuqc2007          data_b1 <= data_a;EDA中国门户网站:ZOub%[QI
          data_b2 <= data_b1;
,Zn&^w/tp'SwA+Ehuqc2007    end if;EDA
中国门户网站4n9U @)m[­|
end process;
9r'Ai){TsG)TVhuqc2007...
R8gQ J9xo,@huqc2007
  即使使用了同步电路,当信号从高速时钟域进入低速时钟域时,必须保证高速信号的值在低速时钟采样前不会发生多次改变。否则,低速时钟采样到的值可能不是我们EDA中国门户网站 Z r4a]'P_(y
想要传递的值。(怎么解决呢?)EDA中国门户网站‑S'd3C9b0O1[9c





K\B
   解决这个问题的方法之一就是延长信号发送的时间,以保证低速时钟至少可以采样到一次有效的信号。另一种解决的方法是使用握手机制,如下图:
点击看大图



<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


 


data_a经过同步电路后传输到clkb时钟域(clkb2搞错了,应该是data_b2^_^,然后这个信号作为回应再经过同步电路后返回clka时钟域(data_ab2).这样clka
;CQ6v


PHThuqc2007时钟域就可以根据回应停止data_a的发送。这种方法的好处是不论clkb时钟的周期如何都可以保证收到信号,缺点是回应信号经过一段时间延迟才能传回clka时钟域.EDA中国门户网站-q"T6b/g*R&oO+v9UF \!h$X%@huqc2007

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /3 下一条