FIFO相关问题:
一、什么是FIFO?异步FIFO和同步FIFO有什么异同?异步FIFO的设计理念和设计要点是什么?
答:FIFO是一种先进先出的数据缓冲器,与普通的存储器相比,没有外部地址线,其内部地址线自加1。异步FIFO的意思就是FIFO的读写时钟是异步的,因此可用于两个不同时钟系统之间的数据传输。
设计理念:完成数据在不同时钟域间的传递;
设计要点:如何得出空满状态位,读写指针采用格雷码编码,并且经过两级寄存器同步后进行指针对比得出空满状态位。
二、你的FIFO怎么实现的,会乒乓FIFO吗?
答:我是用的双口RAM实现的的,这样做的好处是因为不用考虑内部时序,但是会有成本的问题。
乒乓操作是一个无缝的缓存高速数据流的操作,多用于两个单口RAM,可以做到没有数据丢失的高速数据流处理,可以用两个单口RAM,类似于乒乓,写1读2,写2读1。
三、空满状态位是怎么得出的?为什么要用格雷码编码而不用二进制编码和独热码编码?为什么要经过俩级寄存器的同步再进行指针的对比?
答:指针采用了格雷码,所以读空就是两者指针相同;写满就是指针高两位不同,低位相同。
格雷码每次只跳变一位,不易出错,而且即使出错,也只是会造成空满判断提前一位或落后一位。
在实际中分为两种情况,分别是写快读慢,写慢读快。在写时钟大于读时钟时,要产生fifo_full信号,需要将read_ptr同步到写时钟域,读指针会有延时,可能比实际的读地址要小,如果满足fifo_full的触发条件,像这种FIFO非满而产生满标志信号的情况称为“虚满”,但是也并不影响FIFO的功能。在写慢读快,产生fifo_empty信号,把写指针传递到读时钟域,写指针有延时,即可能fifo中有数据但判断读空,成为“虚空”
两级寄存器是为了消除亚稳态问题,保证最后采样得到的数据是稳定的
四、格雷码和二进制转换?
二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。其实就是二进制码右移一位和本身异或。
assign wgnext = (wbnext>>1) ^ (wbnext);//二进制转格雷码
二进制格雷码转换成二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似
五、假如异步FIFO写时钟是读时钟的100倍,会出现什么问题?
可能会有空满指示信号同时有效的状况发生。
在FIFO刚刚复位,假如FIFO的深度不是很够,在写满之后,FIFO的满信号会指示为1,说明FIFO满了;但是读时钟速度很慢,此时写地址尚未同步到读时钟域,会表现出空满指示信号同时有效