一、什么是FIFO FIFO是First in First out的简称,可以理解为是具有一定存储空间的寄存器或内存地址。所谓先进先出,就比如CPU将数据按照1、2、3、4、5、6、7的顺序写入FIFO,那么将来数据从FIFO自动传到发送缓冲区,也是按照1、2、3、4、5、6、7的顺序传。FIFO 与 RAM 和 ROM 的区别是 FIFO 没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,其数据地址由内部读写指针自动加1完成。 二、为什么要用FIFO 问题源:典型的串口设计,发送/接收缓冲区只有1个字节,每次发送/接收只能处理一帧数据。这样在单片机中没什么问题,但是到复杂SOC中(一般有操作系统的)就会有问题,因为当发送/接收缓冲区数据发送完或接收完,CPU需要再次给发送/接收缓冲区添加/移出数据,CPU需要不断切换上下文,会导致效率低下。 解决方案:想办法扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲器设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后Transmitter慢慢发,发完再找CPU,再要64字节。但是串口控制器本来的发送/接收缓冲区是固定的1字节长度的,所以做了个变相的扩展,就是FIFO。FIFO可以理解为是其他的寄存器,或者是一些内存地址。启用串口控制器的FIFO模式,然后把想要发送的内容写到FIFO里面去,FIFO里面的内容就会依次往发送/接收缓冲区里发送
三、FIFO分类 FIFO根据读写时钟是否为同一时钟分为同步FIFO和异步FIFO
同步FIFO是指读时钟和写时钟为同一个时钟,在时钟沿来临时可同时发生读写操作。 异步FIFO是指读写时钟不一致,读写时钟是互相独立的2个时钟。 同步FIFO在实际应用中比较少见,常用的是异步FIFO,但基于学习的目的,下文对两种FIFO都进行讲解。
四、同步FIFO 1、同步FIFO电路框图 简单来说,同步FIFO其实就是一个双口RAM加上两个读写控制模块。FIFO的常见参数和信号如下: FIFO的宽度:即FIFO一次读写操作的数据位; FIFO的深度:指的是FIFO可以存储多少个N位的数据(如果宽度为N)。 满标志:FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。 空标志:FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。 读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。(同步FIFO 读写只有一个时钟,异步FIFO读写时钟分开) 写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。 读指针:总是指向下一个将要被读出的单元,读完后自动加1,复位时,指向第1个单元(编号为0) 写指针:总是指向下一个将要被写入的单元,写完后自动加1,复位时,指向第1个单元(编号为0)。 其实可以把FIFO比作一个单向行驶的隧道,隧道两端都有一个门进行控制,FIFO宽度就是这个隧道单向有几个车道,FIFO的深度就是一个车道能容纳多少辆车,当隧道内停满车辆时,这就是FIFO的写满状态,当隧道内没有一辆车时,这便是FIFO的读空状态。 2、同步FIFO空满判断 FIFO 的设计原则是任何时候都不能向满FIFO中写入数据(写溢出),任何时候都不能从空FIFO中读取数据(读溢出)。FIFO 设计的核心是空满判断。FIFO设置读,写地址指针,FIFO初始化的时候 读指针和写指针都指向地址为0的位置, 当往FIFO里面每写一个数据,写地址指针自动加1指向下一个要写入的地址。当从FIFO里面每读一个数据,读地址指针自动加1指向下一个要读出的地址,最后通过比较读地址指针和写地址指针的大小来确定空满状态。 当读地址指针追上写地址指针,写地址指针跟读地址指针相等,此时FIFO是读空状态。 当写地址指针再次追上读地址指针,写指针跟读地址指针再次相等的时候,此时FIFO是写满状态。
五、异步FIFO 本周内更新