跨时域信号处理
跨时钟域同步不是仅仅使用两级触发器那么简单的问题,需要考虑的问题很多,例如:两个时钟域的频率关系,是仅仅同步一个信号还是需要同步多个相关的信号(例如:数据总线),两个时钟域的主控设计是怎么样的?需不需要握手等等;简单的讲:如果某个时钟域产生的一个信号其有效宽度小于另一个时钟域的时钟周期,如果用两级触发器去同步这个信号的话,很可能就不能采样到有效信号。所以两级触发器是基本的、但不是万能的。
谢谢帮助,有点思路了. 象您说的如果信号的周期小于它所进入的时钟域周期的话,那么即使使用2个FD也可能采到错误数据,那这种情况如何处理啊? 谢谢!
FIFO啊
举个例子,如果A时钟域的时钟频率大于B时钟域,如果一个A时钟域的单脉冲有效信号sa要传递给B时钟域,那么显然使用两级D触发器可能无法正确采样到这个信号,解决的方法的就是将这个脉冲有效信号转化为电平有效信号,即:将它的有效时间拉长,具体的两种:一种是在A时钟域的主控设计产生sa时,将sa以电平有效的形式产生(有效时间为多个时钟);另一种更为有效的方法就是不修改A时钟域的主控设计,仅仅在时钟域边界对sa信号进行转换,方法就是使用国内某些数所说的“结绳法”(这个我好像只在国内某本教材上看到过这种说法,国外有另外的称呼),即:通过一个脉冲转电平的电路将sa转化为一个电平有效信号,然后使用两级D触发器同步后,在B时钟域再使用脉冲边沿监测器将电平有效信号转化为脉冲有效信号,然后再给B的主控设计使用,这种方法的可靠性非常高,但有的时候效率不是很好,如果想设计出可靠性和效率都很好的同步电路需要根据实际的设计情况来定。
谢谢karnizhu ! 我再好好研究,谢谢!
异步信号传输可以转换为“事件驱动”模型来描述
这是仿真意义上的吧?
多时钟域的设计中,对于信号跨时域的处理 这里可以采用乒乓操作的方法来进行。乒乓操作的处理流程为:输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任 何存储模块,比较常用的存储单元为双口RAM(DPRAM)、单口RAM(SPRAM)、FIFO等。在第一个缓冲周期,将输入的数据流缓存到“数据缓冲 模块1”;在第 2个缓冲周期,通过“输入数据选择单元”的切换,将输入的数据流缓存到“数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第1个周期数据通过“输入数据选择单元”的选择,送到“数据流运算处理模块”进行运算处理;在第3个缓冲周期通过“输入数据选择单元”的再次切换,将输入的数据流缓存到“数据缓冲模块1”,同时将 “数据缓冲模块2”缓存的第2个周期的数据通过“输入数据选择单元”切换,送到“数据流运算处理模块”进行运算处理。如此循环。
乒乓操作的最大特点是通过“输入数据选择单元” 和“输出数据选择单元”按节拍、相互配合的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算与处理。把乒乓操作模块当做一个整体, 站在这个模块的两端看数据,输入数据流和输出数据流都是连续不断的,没有任何停顿,因此非常适合对数据流进行流水线式处理。所以乒乓操作常常应用于流水线 式算法,完成数据的无缝缓冲与处理。乒乓操作的第二个优点是可以节约缓冲区空间。
还有一种方法,FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为率33MHz,总线宽度32bit,其最大传输速为 1056Mbps可以采,在两个不同的时钟域间就用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而 DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
最安全的是fifo
如果相同频率,并且准确性不是很高的话,可以用两个D触发器,否则用fifo
