流 FIFO 控制器 (Stream FIFO Controller)——可以“耍无赖”的 FIFO
在帧 (FRAME) 或包 (PACKET) 应用的设计中,经常需要同步传递帧描述信息和在帧校验出错的时候做丢弃处理。
上游模块 先写“数据缓存”,在写入一帧数据完成后,再写“描述缓存”,写入帧描述信息,如帧长度、帧校验结果等。
下游模块 先读“描述缓存”,读出帧描述信息,再读“数据缓存”,根据帧描述信息对帧数据做相应处理,如丢弃等。
上述应用设计,如果使用“Stream FIFO”,可以有下面优点:
简化设计——可以把帧描述信息和帧数据都放在一个 FIFO 中 FIFO 写侧可以在帧数据写入之后把帧描述信息,即帧头,插入到帧数据之前——“插队”;FIFO 读侧可以顺序地先读出帧头,再读出帧数据。
提高吞吐率——可以在 FIFO 写侧一拍丢帧 帧数据写入 FIFO 后,如果帧尾数据校验出错需要丢弃,它可以直接在 FIFO 写侧丢弃,即下一帧数据是直接从上一个错帧的第一个位置开始填充。比较而言,普通 FIFO 需要把全部错帧数据读出来丢弃。
项目地址:Laotzu
易用的类似 FIFO 接口 参数化数据宽度和 FIFO 深度 参数化帧头长度 增强的同步数据有效指示 增强的首数据预读加速功能(可关闭)
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 |
Name | Description |
---|---|
FWFTEN | First Word PRe-fetch enable1 is enable0 is disable |
ADDRWIDTH | Address bus width |
FIFODEPTH | FIFO depth |
HEADSIZE | HEAD size |
FIFO 写侧最小帧的时间需要大于 FIFO 读侧时钟 4 倍周期,即
原因解释如上图所示,FIFO 读计数在帧尾出现跳变,即 FIFO 写侧在发出下面命令后,写指针才被更新到 FIFO 读侧,通知有新的数据被写入到 FIFO,可以读取了。
HEADSIZE = 0 w_ctrl = 2, or w_ctrl = 3
HEADSIZE = 1 w_ctrl = 5
写指针从写时钟域传到读时钟域,并且是跳变信号,所以不能使用传统 Gray 码的方式处理。设计中采用了“滤波”的方式,过滤掉了跨时钟域传递出现的的杂乱信号。“使用条件”就表示了从信号跳变开始到信号稳定的时间。
新闻热点
疑难解答