资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
异步FIFO的实现方式实验目的本次实验介绍一种异步 FIFO的实现方式。使用FIFO存储器可以在两个不同时钟系统之 间快速而方便的传输数据。另外,在网络接口,图像处理等方面异步FIFO存储器也得到了广泛的应用。因此,异步FIFO存储器具有较大的研究和应用价值。异步FIFO的介绍和整体结构异步FIFO(First In First Out)存储器是指向 FIFO缓冲器中写入数据的时钟域和从FIFO缓冲器中读取数据的时钟域是不同的,这两个时钟之间没有必然的因果关系。异步FIFO是一种先进先出的电路,使用在异步时钟域数据接口的部分,用来存储、缓冲在两个异步时钟之间的数据传输。 在异步电路中,由于时钟之间周期和相位完全独立,所以数据的丢失概率不为零。如何设计一个高可靠性、高速的异步FIFO存储器便成为一个难点。异步FIFO的一般结构如图1所示,都是由一个读时钟域电路、一个写时钟域电路和一 个双端口的RAM来构成的。异步FIFO与同步FIFO所做的工作是相同的, 都是在写信号有效 时写数据到RAM中,在读信号有效时把数据从 RAM中读出,所以对于中间部分的 RAM设计是 比较简单的。另外,读电路和写电路单独实现起来也是比较容易的,只需要按照同步FIFO的工作情况,如果没有写满或读空的状态时每写一个数据就把写地址加1,每读一个数据就把读地址减1。设计难点在于两个时钟域的交叠部分:满、空状态的产生,这也是设计的重点。图1异步FIFO结构针对这个问题,先从对亚稳态的处理开始介绍亚稳态的处理一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。 在这个稳定期间,触发器输出一些中间级电平, 或者可能处于振荡 状态、并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。亚稳态发生的原因是由于在同步系统中,如果触发器的建立时间或保持时间不满足,就可能产生亚稳态,此时触发器输出端 Q在亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状 态,逻辑误判有可能通过电路的特殊设计减轻危害(如本设计中将使用的 Gray码计数器),而亚稳态的传播则扩大了故障面,难以处理。在数字集成电路中寄存器要满足建立时间和保持时间。建立时间是在时钟翻转之前数据输入必须有效的时间, 保持时间是在时钟沿之后数据输出必须仍然有效的时间。当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q的值是不确定的,并且在未知的时刻会固定到高电平或低电平。此时寄存器进入了亚稳态(Metastability)。解决这一问题的最简单方法是使用同步器,使得在另一个时钟域采样时信号足够稳定。同步器的设计本身就是一个比较麻烦的问题,本次设计中也不深入讨论一些细节性的问题,直接采用两级采样的同步器,避免了使用一级同步器仍可能出现亚稳态的情况。每个这样的同步器都具有一个等于时钟周期的等待时间。这种同步器可以把一些亚稳态的值同步为确定值,但并不一定是正确值, 同时有一些亚稳态也还是无法稳定成确切值的,这种情况称为同步出错。由于同步出错的随机性,很难对它们进行跟踪。如果想进一步降低亚稳态出现 的概率、可以再増加同步器的级数,但是太多的同步器会使系统的性能下降,所以系统中不会用太多的同步器,一般使用两个同步器已经足够。空满状态的判断之所以在前面介绍了亚稳态的问题,是因为这是判断满状态或空状态无法回避的一个问题。因为读电路在读控制时维持一个地址指针,写电路在写控制时维持一个地址指针,简单来说,这两个地址指针直接一比较,就能得到空满的判断结果,但是实际操作起来非常麻烦。 例如对于满状态来说, 这是写入电路所关心的状态,因为满状态下不能继续写入数据,但是空状态对于写电路没有影响。如果写入电路要判断当前FIFO是否为满,就需要把写电路自身维持的写指针和读电路维持的读指针做比较,这个读指针就需要送入写电路中,此时就发生了穿过时钟域的问题,也就是说,读指针要从读时钟域同步到写时钟域,然后参与判断, 此时就需要前面介绍的同步器。同样,对于空状态来说, 这是读出电路所关心的状态,也是由读电路来维持的,因为空状态下再读数就会得到错误的数据,但是满状态下读数是没有影响的。如果读电路要判断当前FIFO是否为空,就需要把写时钟域中的写指针取到读时钟域来,和读时钟域的读指针进行比较得出是否是空状态,同样跨越了时钟域。在跨时钟域系统中希望出现错误的概率越低越好,此时格雷码无疑是最好的一个选择。格雷码属于可靠性编码,是一种误差最小化的编码,它大大减少了由一个状态到下一个状态时电路混淆。由这种编码相邻的两个码组之间只有一位不同,和其他编码同时改变 2位和多位的情况相比更为可靠。表1所示是格雷码与二进制码的对应关系。十进制二进制格雷码NBBBBGGGG000000000100010001200100011300110010401000110501010111601100101701110100810001100910011101101010111111101111101211001010131101101114111010011511111000表1格雷码与二进制码转换真值表由前面的介绍可知通过同步器之后信号稳定的值可能是1也可能是0,可能与输入的值相同也可能与输入的值不同。如果对于二进制码,这显然是灾难性的。例如从十进制的7变到8,二进制码是从0111变为1000,把0111送入同步器之后,由于4位都要变化,所以4位都可能会出现亚稳态,从而在同步器的输出端就会出现各种可能性,这样即使数据稳定 下来,对整个电路的作用也很小。而如果采用格雷码,是从0100变为1100,只是最高位发生了改变,也就只有这一位可能会出现亚稳态的情况。这样经过同步器处理之后,输出端可能得到的值只有两种 0100或1100,其中1100是正确的数值,如果得到这个输出自然是最 好,但即使是0100的输出,也只是和原来的值相同,可以认为没有变化,这也不会对电路 造成负面的影响。相比二进制代码那种变化后什么值都有可能的情况,格雷码显然是一种更易于接受的编码方式。格雷码虽然在跨时钟域方面效果比较好,但在本身计数方面是不足的,也就是说还需要把格雷码转换成二进制码来计数,4位的格雷码转二进制码的代码部分如下:bi n0=gray3Fgray2F gray1A gray0;bi n1=gray3Agray2A gray1;bi n2=gray3Agray2;bi n2=gray3;也可以用for循环完成:module gray2(bi n,gray);parameter size=4;output size-1:0 bin;in put size-1:0 gray;reg size-1:0 bin;in teger i;always (gray)for(i=0;i,size;i=i=i+1);bin i=A(gray1);en dmodule计数之后还要变回格雷码,转换的方法与上述方式类似。这样使用格雷码作为指针就可 以降低亚稳态带来的影响。接下来要解决的是空满判断的问题,常用的判断方法是附加位比较法。附加位比较法是给每个指针增加一个附加位,对于二进制指针而言, 将存储空间的最后一个存储单元写入数据后,地址将变为零,即地址指针低n-1位清零并向最高位(MSB)也就是附加位进位。读指针也是如此工作。如果两个指针的最高位(MSBs)不同而其余位相同,就说明写指针比读指针多循环了一次,标志FIFO存储器处于满状态。如果包括最高位在内的两个指针完全相同,则说明写指针和读指针经历了相同次数的循环,也就是说FIFO存储器处于空状态。这样读指针和写指针就变成了一个n位指针,其中低n-1位是用来存放FIFO存储器的地址,可以用来对 2n-1个存储单元寻址,而最高位则用来辨别当两个指针的地址相 等时是满状态还是空状态。对二进制指针来说,用这种方式来区分满状态与空状态是可行的。但是,格雷码指针却不能直接使用这种方式,原因有两个。举个4位格雷码的例子,格雷码计数器的低 3位用于存放存储地址,第四位是附加位,这个FIFO存储器的存储容量为 &正确的操作应当是,当写(或读)完一个循环时,地址应该重新开始计数,附加位应该翻转。 然而格雷码指针却并非如此,地址由7到8格雷码由0-100到1-100),指针的附加位改变,但是地址位(低n-1位)却没有重新开始计数,这是由于格雷码是一种镜像码造成的。第二个原因是这种格雷码不能直接产生满状态标志。如果两个格雷码指针都是 Gray-7,这时的FIFO存储器为空状态,在进行一次写操作后写指针将加1,格雷码第4位将变为1而低3位不变,这时的读指针和写指针的最高位将不同而低位相同。如果这样的话,FIFO存储器满标志将置位,这显然是错误的,因而需要对这个4位的格雷码进行修改。想要的结 果是:一个n位的(即包括附加位)格雷码计数器用在异步时钟域间传递数据,但是又希望它 的低n-1位计数器也是格雷码类型的。这样低n-1位就能单独形成一个循环,而不是一种反射码。所以,此时需要的是一个既能产生n位的格雷码序列又能产生n-1位的格雷码序列的计数器。分别实现一个 n位的格雷码计数器和一个 n-1位的格雷码计数器自是非常简单:用 一个计数器来实现一个 n位的格雷码计数器,并将这个计数器的次高位进行修改而低位保持 不变以实现一个n-1位的格雷码计数器,这也不是一件很难的事情。这种既能产生n位格雷 码又能产生n-1位格雷码的计数器被称为”两重格雷码计数器。下面以3位和4位格雷码来说明空满状态的判断标准。3位格雷码表示的就是地址空间,可以有8个存储空间。由于写入和读出并不是按照从000开始的,而是可以以任意一个位置开始,比如存放数据可以按照十进制地址5、6、7、0、1、2、3、4的地址顺序来存放,读出数据也同理,这样为了表示循环,就增加了1位变为4位格雷码。首先说明空状态的判断标准,空状态表示读指针和写指针重合, 此时无论是看3位格雷 码还是4位格雷码都应该是完全相同, 比如写指针指向1010,读指针也必然指向1010,这样 判断空状态就只需要判断两个指针是否相同,相同时即为空,不同时即为不空。然后解释满状态的判断标准。满状态判断比较复杂。假设一次写入数据是从十进制地址6开始,连续写入 8个数据。到14,这时存满8个数据,应产生满状态输出,这两个地址形式如下:十进制地址6二进制地址0110格雷码地址0101十进制地址14二进制地址1110格雷码地址1001
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号