FPGA时钟问题资料汇总
上一篇 /
下一篇 2008-05-10 08:50:05
/ 个人分类:FPGA
门控时钟http://www.edacn.net/index.php/36763/viewspace-3806.html
FPGA时钟http://www.arm7-arm9.com/fpga/fpga-109.htm
FPGA内部时钟处理的常见设计方法
http://www.arm7-arm9.com/fpga/fpga-114.htm
上升沿和下降沿触发小论
http://www.edacn.net/bbs/viewthread.php?tid=2062&extra=page%3D1%26amp%3Bfilter%3Ddigest
同步设计的五条规则
1、所有的数据都要通过组合逻辑和延时单元(典型为触发器)
2、延时总是由延时单元来控制,而不是由组合逻辑来控制
3、组合逻辑所产生的信号不能在没有通过一个同步延时单元的情况下反馈给同一个组合逻辑
4、时钟信号不能被门控,必须直接到达延时单元的时钟输入端,而不经过任何组合逻辑
5、数据信号必须只通过组合逻辑或多或延时单元的数据输入端
RTL级设计中的时钟与复位时钟和复位在数字系统设计中的重要性是勿庸置疑的.在RTL级设计中,要表示一个时钟并不复杂,在Verilog中只需像下面这样写就表示clk是一个时钟:
always @ (posedge clk)
同样复位也不复杂,如:
同步复位:always @ (posedge clk)
if(rst)
复位操作;
else
正常操作;
异步复位:always @ (posedge clk)
if(rst)
复位操作;
else
正常操作;
虽然在RTL级设计中表示时钟或是复位并不复杂,但实际关于时钟和复位的使用和相关的问题却要复杂的多.
对于时钟,如果我们的设计中只使用了一个全局时钟,那么我们在编写RTL级代码时没有必要过多的考虑时钟的问题,因为这种时钟无论在仿真,还是在FPGA或ASIC的实现都是比较简单的.但是多数情况我们没这么幸运,设计中经常会因为功能需求需要在芯片同时使用多个时钟,同时还需要在不同的时钟域间传递数据,这在电信和数据通信领域是很常见的.当数据从一个时钟域进入另一个时钟域时,如果产生数据的时钟和采样数据的时钟是异步关系,有可能造成数据传输时序关系的混乱.要解决这一问题,需要多方面的考虑,包括时钟域的规划、综合、仿真、测试等等。
对于复位信号的处理,也会有类似的问题。比如是选择同步还是异步复位,复位电路如何保证安全可靠等等。下面我们就对时钟系统和复位的处理进行详细的讨论。
多时钟信号的处理
多时钟系统相对于单时钟系统的设计要复杂的多,这主要体现在以下几个方面:
在设计规划中如何根据时钟域划分模块;多时钟系统的RTL级,特别是跨时钟域边界的数据传输方法;以及相关的仿真、综合及测试的问题。
对于多时钟系统,每个时钟域当中都是一个单时钟系统。因此,问题的关键是信号(数据或控制信号)从一个时钟域传输到另一个时钟域如何保证功能的正确。不同
时钟域间信号传输首先可能遇到就是由亚稳态产生同步失败问题。亚稳态是指当触发器的数据端的变化与时钟的有效沿很近(不能满足建立和保持时间)时,其输出不能稳
定在一个确定的状态(‘0’或‘1’)。
解决亚稳态的问题,最常用的方法是使用同步电路。同步电路的作用是采样一个与本地时钟域异步的信号,并将其同步的传输到本地时钟域当中。最常用的同步电路
是双触发器同步电路。第一个触发器用本地时钟对异步的输入信号进行采样,并等待一个时钟周期以保证第一级的输出信号的亚稳态趋于稳定,然后第一级信号被第二级触
发器采样,这样就可以保证第二级触发器的输出信号是稳定的,并且与本地时钟同步。从理论上来说,当第二级触发器采样时,第一级信号有可能仍然处于不稳定状态,这样
可能导致第二级触发器的输出仍为亚稳态。这种可能性和产生输入信号的时钟频率以及同步时钟频率有关。一般来说,两级触发器的同步电路就足以消除亚稳态的问题了。
因此作为一条设计规则,对于所有从一个时钟域到另一个时钟域的信号都应该使用同步电路。使用VHDL描述这条规则就是:
...
process(clka)
begin
if clka'event and clka='1' then
data_a <= data;
end if;
end process;
process(clkb)
begin
if clkb'event and clkb='1' then
data_b1 <= data_a;
data_b2 <= data_b1;
end if;
end process;
...
即使使用了同步电路,当信号从高速时钟域进入低速时钟域时,必须保证高速信号的值在低速时钟采样前不会发生多次改变。否则,低速时钟采样到的值可能不是我们
想要传递的值。(怎么解决呢?)
解决这个问题的方法之一就是延长信号发送的时间,以保证低速时钟至少可以采样到一次有效的信号(不明白???)。另一种解决的方法是使用握手机制,如下图:

data_a经过同步电路后传输到clkb时钟域(clkb2搞错了,应该是data_b2^_^),然后这个信号作为回应再经过同步电路后返回clka时钟域(data_ab2).这样clka
时钟域就可以根据回应停止data_a的发送。这种方法的好处是不论clkb时钟的周期如何都可以保证收到信号,缺点是回应信号经过一段时间延迟才能传回clka时钟域.
导入论坛
收藏
分享给好友
推荐到圈子
管理
举报
TAG: