在学习完SV语言所涉及到的重点语法后,开始逐步步入实验流程,那么最先了解FIFO是什么?有什么关键作用在芯片中?这些均是至关重要的。首先学习的是FIFO。
FIFO:先进先出队列(First in first out)的缩写,是一种先进先出的数据缓存器,与普通存储器的区别是没有外部读写地址线,使用起来简单。缺点就是只能顺序写入数据,顺序读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或者写入某个指定的地址。
什么情况下使用FIFO:一般用于不同时钟域之间的数据传输,当两者之间的传输速率不同时,可以使用FIFO作为数据缓冲。也可以为数据位不同的端口之间用FIFO。
FIFO的重要参数:
1)宽度:FIFO的宽度在单片成品中是固定的。
2)深度
3)满标志:FIFO已满或者将要满时由FIFO的状态电路送出的信号,以阻止继续写入而造成的溢出(overflow)。
4)空标志:已空或者将要空时FIFO的状态电路送出的信号,阻止读操作继续读数据而造成无效数据的读出。
5)读时钟:读操作遵循的时钟,每个时钟沿来临时读数据。
6)写时钟:写操作所遵循的时钟,每个时钟沿来临时写数据。
7)读指针:指向下一个读出地址,读完自动加1。
8)写指针:指向下一个要写入的地址,写完加1。
FIFO的地址不能任意选择,而是连续的。
FIFO的分类:
1)同步FIFO:读写指针为同一个时钟控制。
2)异步FIFO:读写指针为不同的时钟控制。
FIFO设计难点:在于如何判断FIFO的空/满状态。
为什么需要FIFO?
FIFO存储器是系统的缓冲环节,对连续的数据流进行缓存,放置在进机和存储操作时丢失数据;数据集中起来及逆行进机和存储,可以避免频繁的总线操作,减轻CPU负担;
异步FIFO原理:
因为有两个信号,分别为写数据和读数据,因此,有两个时钟分别为:读时钟和写时钟。异步FIFO中读写时钟是异步的。RAM的输入和输出。最重要的是识别FIFO的空满状态。用格雷码进行标识地址,降低在读地址变化时出现的亚稳态。
当最高位和此高位相同,其余位相同认为是读空。
当最高位和此高位不同,其余位相同认为是写满。
跨时钟域问题:
1)读慢写快(W2R) 2)读快写慢(R2W)解决方法:在FIFO中设置两级寄存器;寄存器 同步消耗了时间,这个时间还会不会对FIFO有影响?性能有影响,功能没影响。
假设读慢写快,想把读时钟域的地址同步到写时钟域,读地址经过两级D触发器后,同步到写时钟域,消耗了时间滞后了,所以比较的读地址小于等于当前地址的,将小的读地址和写地址进行比较之后,会得到一个满信号,但可能并非真的满信号,此时可能未被真的写满,但是过程很保守,FIFO没有被写满,但认为它写满了,就不会继续向内写,目的在于避免FIFO在被写满之后继续被写满,不在乎FIFO在没有被写满之后,就不再被写满,不希望FIFO被过写满,就是可能得到的满信号,并非真的写满了,只是不想让其被写满,这样保守不出错。
假设在读慢写快情况下,将写时钟同步到读时钟域,当其同步到读时钟域,同步过程消耗了时间滞后了,可能会漏掉一些写指针,就有可能同步过来的是9,但是写指针实际已经到11,其实还没读空,但是比较后认为读空了,保守不出错。保证不会过读出。