type
status
date
slug
summary
tags
category
Property
Nov 30, 2023 02:46 PM
icon
password
属性
属性 1
描述
Origin
URL
1.设计思想:
1.同步FIFO的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑,常常用于交互数据缓冲。
2.典型同步FIFO有三部分组成:(1)FIFO写控制逻辑;(2)FIFO读控制逻辑;(3)FIFO存储实体(如Memory、Reg)。
3.FIFO写控制逻辑主要功能:产生FIFO写地址、写有效信号,同时产生FIFO写满、写错等状态信号;
4.FIFO读控制逻辑主要功能:产生FIFO读地址、读有效信号,同时产生FIFO读空、读错等状态信号。
2.基本概念
- 同步FIFO的“同步”是什么意思?
- FIFO是什么,有什么用?
- 接口都有什么
- 同步:时钟间有确定的倍数关系或确定的相位关系
- FIFO:Frist-in-first-out,先进先出,是一种数据缓存器,实现速率匹配。
- 既然是数据缓冲器,那么缓冲器的大小,存储深度,读写地址和存储器空满状态都需要确定。
一般FIFO使用循环指针(计数溢出自动归零)。一般可以称写指针为头head,读指针为尾tail。初始化时,读写指针指向同一数据地址。
·FIFO:先进先出(First-in-first-out)
·FIFO的深度:同一块数据内存的犬小
·FIFO的宽度
·写指针:Write-pointer
·读指针:Read-pointer
·写数据端口
·读数据端口
·FIFO空、FIFO满
·同步:数据写入FIFO的时钟和数据读出FIFO的时钟是同步的(synchronous)
·异步:数据写入FIFO的时钟和数据读出FIFO的时钟是异步的(asynchronous)
一般FIFO使用循环指针(计数溢出自动归零)。一般可以称写指针为头head,读指针为尾tail。
初始化时,读写指针指向同一数据地址。
下图可见,FIFO初始化时,WP和RP指针指向同一数据单元。
WP指向下一个将要写入的数据单元,RP指向将要读出的数据单元。
初始化时,WP和RP指针指向同一数据单元。WP指向下一个将要写入的数据单元,RP指向将要读出的数据单元,两者是一个追赶过程。可以设置一个计数器,
只写,来一个数据,写一个,写地址,+1,计数器+1,写满为止;
只读,来一个,读出一个数据,读地址+1,计数器-1;
同时读写,计数器值不变,读写地址均+1。+
使用fifo_counter记录FIFORAM中的数据个数:
1.等于0时,给出empty信号
2.等于BUF_LENGTH时,给出full信号
fifo_counter:
1.写而未满时增加1
2.读而未空时减1
3.同时发生读写操作时,fifo_counter不变
读写指针宽度
1.与地址宽度相当
2.地址增加而溢出后,自动变成0
3.循环指针(此处地址变化:0-7-0-7-0)
3.SPEC
(1) Function description
同步FIFO实现了对write/read的控制,其接口解决了接口两端数据速率不匹配的问题。
(2) Feature list
支持存储宽度、深度可配置
时钟工作频率为1MHz
(3) Block diagram
模块主要分为读/写接口、读/写指针、读写指针的比较逻辑和array存储阵列四部分。
- 读/写接口:为模块提供读写数据和读写使能信号;
- 读写指针:主要标志读写指针当前array的地址
- 比较逻辑:
- 使用element counter(elem_cnt)记录FIFO RAM 中的数据个数:▷ 等于0时,给出empty信号;等于BUF_LENGTH时,给出full信号
- elem _ cnt :
- ▷ 写而未满时增加1
- ▷ 读而未空时减1
- ▷ 同时发生读写操作时,elem_cnt不变
(4) Interface description
(5) Timing
分为三部分,写操作,读操作,读写操作。
DUT代码1:
TB1:
RTL1
TB2:
5.波形分析
写阶段
- 复位之后,进行写操作,直至写满,产生满标志后,不再写入新数据。
- 读阶段
- 进行读操作,直至读空,产生空标志后,不再读出新数据。
- 同时读写阶段
- 先进行写操作,写入三个新数据之后,同时进行读写操作,期间写入新数据和读出数据,但是elem_cnt计数器不再变化,动态平衡。
(2)小结
设计思路:
先分析需求,定义接口,画出具体的实现框图;
按照协议和理解,画出相应时序图;
看图写程序,验证仿真波形是否与时序图对应。
同步FIFO设计要点
是什么时候产生空满标志位,即怎么衡量array被写满或者被读空。
在这里,我使用了4bit的elem_cnt表示,通过elem_cnt的值表示当前array存储阵列的资源使用情况。
0表示没有数据,即空状态;8表示写满,因为array的存储深度就是8。
在spec中提到实现FIFO可配置,在这里只实现了宽度为32bit,深度为8的同步fifo设计,初步验证仿真波形与时序图相对应。
参考资料
- 作者:Conor
- 链接:https://www.xzhh.top/article/fifo
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。