SOC设计中多bits数据跨时钟域问题解决以及FIFO设计Word文档格式.docx
- 文档编号:17842477
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:12
- 大小:245.13KB
SOC设计中多bits数据跨时钟域问题解决以及FIFO设计Word文档格式.docx
《SOC设计中多bits数据跨时钟域问题解决以及FIFO设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《SOC设计中多bits数据跨时钟域问题解决以及FIFO设计Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
一款SOC往往由多个互不关联的时钟逻辑穿插而成,各个时钟之间的胶合逻辑和数据之间的传递是许多系统设计时必须考虑的问题,多bits数据的传输问题尤其突出。
在某些设计中,多bits数据的传输甚至影响系统工作频率,如何解决多bits数据的传输变得至关重要。
二、亚稳态
当在一个时钟下对信号进行采样时,信号变化的快慢直接影响触发器对信号的判断时间,信号变化的越快,触发器花费越多的时间对信号进行判断。
当信号变化的速度非常快以至于触发器无法在规定的时间内对信号进行判断采样时(建立时间或者保持时间不满足),将会出现触发器采样的失败,我们称之为这种状态为亚稳态。
图1亚稳态的出现
当触发器进入亚稳态时,我们无法预测触发器的输出状态,也无法预测触发器何时能够进入一个稳定的状态。
在这个状态中,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去,造成亚稳态的传播,使系统发生一系列的错误,甚至引起系统的崩溃。
当在不同的时钟进行数据传递时,由于无法确定输入信号跟接收时钟上升沿之间的时间关系,不能够保证接收触发器的建立-保持时间,极易造成接收端亚稳态的出现。
三、单bit数据的跨时钟域
触发器进入亚稳态的几率可以用平均无故障时间即触发器采样失败的时间间隔MTBF(MeanTimeBetweenFailures)描述[4]。
若MTBF很大,就认为该设计在实际工作中能够正常运行,不会因为亚稳态导致整个设计出现问题。
MTBF=e(Tr/τ)/T0fα
其中Tr为亚稳态最大有效分辨时间。
f为触发器的时钟频率。
α为异步事件触发频率,即异步输入每秒变化的次数。
τ、T0是由触发器的电气特性决定的参数,可用于表征触发器翻转速度的快慢。
实践证明,当用两级触发器串联(信号同步器)进行数据采样,即相当于Tr=2/f,MTBF的时间单位是年。
由此表明,两级触发器串联已经可以把失效率控制在一个可以接受的范围。
以下是同步器的电路实现。
图2信号同步器电路
信号同步器是所有同步电路的核心。
同步化的信号在两个周期之后有效。
源时钟过来的信号与目的时钟无关的情况下有可能导致第一级触发器工作在亚稳态,但是此时信号同步器并没有输出,d_out无效。
第一级触发器的亚稳态输出没有给后面的逻辑造成影响,当第二个时钟上升沿到来时将判断出的信号传递给第二级触发器,此时第一级触发器的输出仍处于亚稳态的概率将会非常的小,满足一般的电路设计。
它的应用范围是
1)时钟域的时钟频率是源时钟域时钟频率的两倍以上。
2)目的时钟域的时钟频率小于源时钟域的时钟频率,但是信号的变化频率是目的时钟域的两倍以上。
四、多bits信号的跨时钟传递
多bits信号在异步时钟之间的传递不同于单bits数据的传递。
由于在现实情况不同于系统模型或者RTL模型,现实的数据传输不能保证多bits数据之间的传输延迟(skew)为零,非零的skew就有可能造成多bits的数据在目的时钟的不同周期被采样,这种多bits数据传输时由于数据之间的skew所引起的不能被目的时钟在同一个周期采样的显现称之为多bits数据的跨时钟域问题。
尤其是多bits数据之间有逻辑关系或者解码关系时,这种传递的重要性将变得尤其重要。
1.多bits需同时有效的控制信号的传递
目的时钟需要源时钟的两个同时有效的控制信号,这两个控制信号来自于同一个源时钟,有可能会出现时钟之间的偏移,从而导致两个控制信号在目的时钟域的不同周期被采样,在此情形下两个本应该同时起控制作用的信号在目的时钟域失去了作用。
图3多bits控制信号在不同时钟之间的传递
此种问题产生的原因是两个来自于同一个时钟的控制信号在目的时钟发生作用时产生的多bits信号传输的问题。
在逻辑设计中,通常可将这两个信号在源时钟中整合为一个信号,然后通过同步逻辑传送到目的时钟,从而消除了多bits信号的跨时钟传输问题。
2.具有编码关系的信号的跨时钟传输
当具有编码关系的多bits数据在不同的时钟之间进行传递时,不同编码信号之间具有skew导致目的时钟采样数据的不一致性,从而导致解码的错误。
图4具有编码关系的多bits信号的传递及可能引起的解码错误
考虑到目的时钟在接收多bits信号时,无非是个别的信号在接收时晚一个时钟周期,或者多bits信号撤销时晚撤销一个时钟周期。
所以,可以得出以下解决方案:
传输数据时增加一位“ready_flag”的寄存器。
源时钟必须在产生需传输的多bits数据一个周期之后产生该read_flag信号,必须在需要传输的多bits信号撤销之前一个周期撤销ready_flag信号。
如前述,该read_flag的使能信号需在目的时钟至少保持两个目的时钟周期。
按照最坏的考虑,read_flag信号在所有的编码信号到达目的时钟时被采样,或者read_flag在所有的编码信号撤销时一同被撤销。
比较乐观的考虑下;
所有的编码信号都已到达目的时钟后下一个周期,read_flag开始有效。
所有的编码信号都被撤销后下一个周期,read_flag被撤销。
任何考虑都可以保证目的时钟在read_flag信号的使能下准确的接收编码信号的数据。
另外一种解决方式是在源时钟进行编码信号的解码,然后将解码之后的信号通过同步器传递给目的时钟。
在目的时钟内,建立一个用于鉴定解码信号的状态机,如果此时没有解码信号的输入,就代表一个解码信号刚刚被撤销,并且新的解码信号还没有传递给目的时钟。
如果一个目的时钟周期内有两个解码信号,则最后到达的解码信号推动状态机的运转。
需要注意的是解码信号的维持时间应该至少大于一个目的时钟的周期。
以下是第二种解决方式的实现方案[1]:
图5利用状态机解决多bits数据传输的skew问题
3.跨时钟域的数据通路的建立
以上的任何一种多bits数据在跨时钟传递时都不能满足大批量,随时改变的数据的传递。
通常我们常用以下方式解决多bits数据通路的跨时钟域问题:
1)利用握手信号进行跨时钟域的数据传输。
2)利用FIFO(Firstinfirstout)进行数据传输。
3.1握手信号实现数据的跨时钟域
根据不同的设计需求和不同的设计标准,利用两到三个握手信号可以实现数据在不同时钟之间的传递。
采用的握手信号越多,从一个时钟到另外一个时钟所需要的延迟也越多,同时数据传递的也越准确。
图6握手信号传递数据机制
对于许多没有限制的传输,两个握手信号足以使数据在两个时钟之间准确的传递。
发送方将数据挂载在总线上,然后置位“请求”的握手信号,该“请求”的握手信号通过两个节拍的同步器传递给数据接收方,当数据接收方采集到“请求”位被置位时,开始采集总线上的数据(此时总线上的数据至少应该保持两个目的时钟周期),同时接收方开始置位“响应”握手信号,“响应”握手信号经过两个节拍的同步器传递给发送方,发送方检测到“响应”信号后就可以改变总线上的数据了。
图7握手信号的时序关系
在某些特定的应用下,增加第三个握手信号“准备接收”会增加传输的健壮性[3]。
“准备接收”信号由接收方发送,经电平同步器传递给发送方,它表达接收方现在需要接收数据或者接收方已经准备好去接收数据。
为了避免数据收发的冲突产生,当“请求”握手信号被置位的时候,“准备接收”握手信号不应被置位”,当“请求”握手信号被清零,接收方可以置位“准备接收”来表达接收方的意图。
“准备接收”握手信号的缺点是其增加了收发之间的延迟。
3.2利用FIFO实现数据的跨时钟域
在很多情况下,数据在跨时钟域时需要堆积起来,因此使用单个保持寄存器无法完成工作。
例如在发送方猝发式发送数据时,接收方没有足够的时间去采样。
另外一种情况是接收方与发送方的数据宽度不一致。
在这些情况下使用FIFO能够很方便的解决问题。
FIFO利用一个双口的存储单元(RAM或者逻辑存储器)进行数据的存储。
其中一个端口在写时钟下由发送方控制,用来存储发送方发送的数据。
另外一个端口在读时钟下由接收方控制,用来发送存储器内的数据。
两个控制标志信号用来表明FIFO现在的存储状态,空或者满。
在某些应用下,几乎空或者几乎满也经常用于设计中。
在设计中,有很多种FIFO的实现方式。
但是设计出一款能够避免各种存储BUG的FIFO非常不容易,这里给出一种利用格雷码进行数据地址指针传输产生空满标志来设计FIFO的方式。
3.2.1FIFO的空满标志
读地址指针和写地址指针的相对状态决定了空满标志位的状态。
读地址指针和写地址指针分别是在两个时钟下产生,所以其中的一个指针必须同步到另外一个指针下才能够进行比较以产生空满标志。
当利用二进制计数器作为存储器地址指针计数器时问题随之而来。
通常情况下,二进制计数每次计数的增加都会有计数器中至少两bits数据的变化,如果一个四位二进制的地址计数器从7(0111)计数到8(1000),四位计数值将同时发生变化。
如果一个异步时钟在四位计数值发生变化的中间采集数据,由于亚稳态的出现,它可能采集到从0到8之间任何一个数据。
新采集的地址指针将被用来与现时钟的地址指针进行比较,用以生成空满标志,错误的地址指针将产生错误的空满标志位,影响两个时钟间数据传递的正确性。
3.2.2格雷码的引入
一种好的能够解决上述指针传递多bits值变化问题的策略是引用格雷码计数器。
格雷码计数器每次计数只改变一bit的数据。
如果一个异步时钟在格雷码计数器跳变的中间进行采样,那它的采样结果就只有两种可能性:
采集到新的指针或者是采集到以前的指针。
无论采集到哪个指针值,只要在接收方采用比较保守的生成空满标志位的逻辑都可以避免空满标志的误产生。
用格雷码代表存储器的地址指针时,将有格雷码和二进制之间的互相转换问题。
下面以四位计数器对格雷码和二进制之间的转化做详细说明。
3.2.3格雷码转变为二进制
二进制的第0位等于格雷码的第0位与格雷码从第1位一直到第3位按位异或;
二进制的第1位等于格雷码的第1位与格雷码的第2位和第3位按位异或;
二进制的第2位等于格雷码的第2位与第3位相异或;
二进制的第3位等于格雷码的第3位。
用Verilog硬件描述语言对各位二进制进行实现:
bin[0]=gray[3]^gray[2]^gray[1]^gray[0];
bin[1]=gray[3]^gray[2]^gray[1];
bin[2]=gray[3]^gray[2];
bin[3]=gray[3];
当计数器位数比较多时可以实现为如下:
modulegray_to_bin(bin,gray);
parameterSIZE=4;
output[SIZE-1:
0]bin;
input[SIZE-1:
0]gray;
reg[SIZE-1:
integeri;
always@(gray)
for(i=0;
i<
SIZE;
i=i+1)
bin[i]=^(gray>
>
i);
endmodule
3.2.4二进制转变为格雷码
格雷码中的第0位等于二进制码中第0位和第1位的异或;
格雷码中的第1位等于二进制码的第1位和第2位的异或;
格雷码中的第2位是二进制的第2位和第3位的异或;
格雷码中的第3位等于二进制中的第3位。
用Verilog硬件描述语言对各位进行实现:
gray[0]=bin[0]^bin[1];
gray[1]=bin[1]^bin[2];
gray[2]=bin[2]^bin[3];
gray[3]=bin[3];
modulebin_to_gray(gray,bin);
parameterSIZE=4;
assigngray=(bin>
1)^bin;
3.2.5格雷码计数器的实现
图8格雷码设计框图
上图是格雷码计数器的实现框图,它包括了格雷码转变二进制,二进制转变为格雷码,二进制计数器和用来存储格雷码的寄存器。
用Verilog硬件描述语言表达为:
modulegraycntr(gray,clk,inc,rst_n);
inputclk,inc,rst_n;
0]gnext,gray,bnext,bin;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)gray<
=0;
elsegray<
=gnext;
always@(grayorinc)
begin
for(i=0;
i<
SIZE;
i=i+1)
bnext=bin+inc;
gnext=(bnext>
1)^bnext;
end
endmodule
3.2.6FIFO空满标志位的设计
图9典型FIFO结构图
FIFO设计中导致整个设计成败的最关键的是空满标志位的产生,在本次介绍的设计中增加了许多用以增强空满标志准确性的逻辑,其中在读写地址指针上增加一位用以区别读写逻辑引起的读写指针所累加的圈数(将FIFO的存储空间看做为环形),当读写地址指针每累加正好一圈的时候,最高标志位取反,以此来区别当读写地址指针相同时FIFO的状态是空还是满。
当读地址指针累计增加赶上了写地址指针时,所写入FIFO的数据均被读出,此时读写地址指针所有位均相同,FIFO处于空的状态;
当写地址指针累计增加赶上了读地址指针的时候,所有空闲的存储空间均被写入,此时,所写入的逻辑空间正好比读出的数据量多出一个FIFO的深度,读写地址指针分别累加了不同的圈数,读写地址指针的最高位不同,其余所有为均相同,FIFO处于满的状态。
空标志位是在读时钟下产生的以保证空标志能够随读操作及时的产生,满标志位是在写时钟下产生以保证满标志能够随写操作及时的产生。
如前所述,FIFO空意味着读指针和同步过来的写指针相同。
为了避免多bits传输引起的跨时钟问题,在读时钟下进行指针比较的是格雷码,也就是说将写地址指针转变成格雷码之后同步给读时钟再进行比较。
为了能够做到空标志位的寄存器输出,我们采用将下个时钟的读地址指针(读指针寄存器的组合逻辑输入)同当前同步过来的写地址指针进行比较,然后将比较的结果进行寄存器锁存。
实现的Verilog代码为:
assignempty=(read_graynext_rptr==read2_gray_wptr);
//read_graynext_rptr是下一个周期的读地址指针转换成德格雷码
//read2_gray_wptr是写地址指针转化为格雷码后经过两级同步器同步到读时钟的值
rst_n)empty_reg<
=1’b1;
elseempty_reg<
=empty;
FIFO满意味着写地址指针和同步过来的读地址指针除了最高位相反其余各位相同,同空标志的产生一样,我们使用格雷码指针的比较。
为了能够做到满标志位的寄存器输出,我们采用将下个时钟的写地址指针(写指针寄存器的组合逻辑输入)同当前同步过来的读地址指针进行比较,然后将比较的结果进行寄存器锁存。
assignfull=(wrte_graynext_wptr[SIZE-1]!
=wrte2_gray_rptr[SIZE-1])
&
&
(wrte_graynext_wptr[SIZE-2:
0]==wrte2_gray_rptr[SIZE-2:
0]);
//wrte_graynext_wpt是下一个周期的写地址指针转换成的格雷码
//wrte2_gray_rptr是读地址指针转换为格雷码之后经过两级同步器同步到写时钟的值
if(!
rst_n)full_reg<
=1’b0;
elsefull_reg<
=full;
3.2.7空满标志位总结
本论文中介绍的FIFO设计对空满标志位的去除采取了保守的方式,也就是说,空满标志位被及时的置位,却不被及时的清除。
因为满标志位是在写时钟下产生,当写地址指针累加到读地址指针时(最高位相反)随之产生了满标志,满标志的产生是准确及时的。
当接收数据方开始进行读操作,读地址指针开始累加,FIFO将变得不再满,但是满标志位不会被立即清除,直到累加的读地址指针经过两个写时钟的同步器延迟传递给写时钟后,满标志位才会被清除。
由此可知,由于满标志位的撤销的不及时性,当FIFO实际上不在满状态时,发送方也有可能得到full的标志位而无法将数据发送给FIFO。
这实际上并不是问题,什么时间将数据写入FIFO是时间的问题,重点是不要在FIFO满的时候继续写入数据导致溢出的现象[2]。
同理,空标志位是在读时钟下产生,当读地址指针累加到写地址指针时随之产生空标志,空标志的产生的准确且及时。
当发送数据方进行写操作,写地址指针开始累加,FIFO将变得不再继续空,但是空标志位不会被立即清除,知道累加的写地址指针经过两个读时钟的周期通过同步器传递给读时钟后,空标志才会被清除。
由此可知,由于空标志的撤销不不及时性,当FIFO实际上不在空状态时,接收方也可能得到empty的标志位而不能继续读取数据。
同理,这也不是设计上的问题,什么时候读出数据对接收方来说只是时间问题,重点是不要在FIFO空的时候读取数据就能保证数不会错误的被读出。
五、总结
如何正确的解决SOC设计中的多bits数据的跨时钟问题是SOC设计中的难点,本文提出的四种用于多bits数据跨时钟的解决方案将分别适合于不同的设计。
参考文献
[1]CliffCummingsandPeterAlfke.SimulationandSynthesisTechniquesforAsynchronousFIFODesignwithAsynchronousPointerComparisons,SNUGSanJose2002bestpaper.www.sunburst-
[2]FrankGray.PulseCodeCommunication.UnitedStatesPatentNumber2,632,058.March17,1953.
[3]CliffordE.Cummings,PeterAlfke.SimulationandSynthesisTechniquesforAsynchronousFIFODesignWithAsynchronousPointerComparisons.Rev1.1.SNUGSanJose.2002
[4]PeterAlfke.跨越异步时钟边界传输数据的解决方案.ApplicationNote,2001
作者简介
胡昌顺,硕士研究生,研究方向:
数字集成电路设计与研究;
高嵩,教授,硕士生导师,主要从事-----------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SOC 设计 bits 数据 时钟 问题解决 以及 FIFO
![提示](https://static.bdocx.com/images/bang_tan.gif)