流 FIFO 控制器 (Stream FIFO Controller)——可以“耍无赖”的 FIFO

2/10/2017来源:ASP.NET技巧人气:1321

流 FIFO 控制器 (Stream FIFO Controller)——可以“耍无赖”的 FIFO

Introduction

在帧 (FRAME) 或包 (PACKET) 应用的设计中,经常需要同步传递帧描述信息和在帧校验出错的时候做丢弃处理。

上游模块 先写“数据缓存”,在写入一帧数据完成后,再写“描述缓存”,写入帧描述信息,如帧长度、帧校验结果等。

下游模块 先读“描述缓存”,读出帧描述信息,再读“数据缓存”,根据帧描述信息对帧数据做相应处理,如丢弃等。

替代通用 FIFO

上述应用设计,如果使用“Stream FIFO”,可以有下面优点:

简化设计——可以把帧描述信息和帧数据都放在一个 FIFO 中 FIFO 写侧可以在帧数据写入之后把帧描述信息,即帧头,插入到帧数据之前——“插队”;FIFO 读侧可以顺序地先读出帧头,再读出帧数据。

提高吞吐率——可以在 FIFO 写侧一拍丢帧 帧数据写入 FIFO 后,如果帧尾数据校验出错需要丢弃,它可以直接在 FIFO 写侧丢弃,即下一帧数据是直接从上一个错帧的第一个位置开始填充。比较而言,普通 FIFO 需要把全部错帧数据读出来丢弃。

项目地址:Laotzu

Feature

易用的类似 FIFO 接口 参数化数据宽度和 FIFO 深度 参数化帧头长度 增强的同步数据有效指示 增强的首数据预读加速功能(可关闭)

application

图片名称

Input/Output

Name I/O Description
w_rst_n I Reset in write-side1 is normal0 is reset
w_clk I Clock in write-side
w_ctrl [2:0] I Write control0 is NOP1 is write data2 is eof with writing data3 is eof without writing data4 is write head5 is write final head6 is discard frame7 is NOP
w_full O 1 is FIFO full
w_error O Error in write-side1 is error0 is normal
w_counter [] O FIFO counter in write-side
r_rst_n I Reset in read-side1 is normal0 is reset
r_clk I Clock in read-side
r_en I Read enable1 is read0 is NOP
r_valid O 1 is data valid in read-side
r_error O Error in read-side1 is error0 is normal
r_counter [] O FIFO counter in read-side
w_ram_addr [] O Write address for dual-port RAM
w_ram_en O Write enable for dual-port RAM1 is enable0 is disable
r_ram_addr [] O Read address for dual-port RAM
r_ram_en O Read enable for dual-port RAM1 is enable0 is disable

Parameter

Name Description
FWFTEN First Word PRe-fetch enable1 is enable0 is disable
ADDRWIDTH Address bus width
FIFODEPTH FIFO depth
HEADSIZE HEAD size

Back-to-Back 传输的情况

Back-to-back

Non-Back-to-Back 传输的情况

Non back-to-back

Discard 命令的情况

Discard

HEADSIZE = 1 的情况

Head = 1

HEADSIZE = 2 的情况

Head = 2

使用条件

FIFO 写侧最小帧的时间需要大于 FIFO 读侧时钟 4 倍周期,即 Tw_frame>4∗Tr_period

读计数跳变

原因解释如上图所示,FIFO 读计数在帧尾出现跳变,即 FIFO 写侧在发出下面命令后,写指针才被更新到 FIFO 读侧,通知有新的数据被写入到 FIFO,可以读取了。

HEADSIZE = 0 w_ctrl = 2, or w_ctrl = 3

HEADSIZE = 1 w_ctrl = 5

写指针从写时钟域传到读时钟域,并且是跳变信号,所以不能使用传统 Gray 码的方式处理。设计中采用了“滤波”的方式,过滤掉了跨时钟域传递出现的的杂乱信号。“使用条件”就表示了从信号跳变开始到信号稳定的时间。

References