FIFO学习:FIFO深度的计算、通过Verilog实现FIFO以及利用SRAM设计FIFO

本文档将记录对FIFO的学习以及通过verilog实现FIFO(同步、异步)的过程。

首先记录一个verilog语法知识:
memory型变量:可以通过reg型变量建立数组,来对存储器建模,可以描述RAM、ROM存储器。语言格式如下:
reg[n-1:0] 存储器名[m-1:0];
在语法中reg[n-1:0]定义了存储器中每一个存储单元的大小,即n位寄存器,在FIFO中对应宽度;[m-1:0]定义了存储器中n位寄存器的个数,在FIFO中对应深度。如 reg [7:0] memoryA[255:0]; 定义了一个名为memoryA的存储器,其中有256个8位寄存器。存储器的地址范围为0~255。

一.FIFO简介

FIFO为First In First Out的缩写,是一种先进先出的数据缓冲器。和普通存储器的区别为没有外部读写地址线。数据地址由内部读写指针自动加一完成,不能读取指定地址的数据。
用途1:异步FIFO采用读写两个不同的时钟,能解决跨时钟域系统的数据传输。
用途2:可以起到数据匹配的功能。用来对接不同宽度的数据接口。

二.FIFO分类

同步FIFO、异步FIFO,区别为读写时钟是否一致。

三.常见参数

宽度:一次读写操作的数据位。
深度:FIFO最多可以存储多少个N位数据(宽度为N)。
满标志:当FIFO已满或者将要满时拉高,阻止继续进行写操作而造成溢出overflow。
空标志:当FIFO已空或者将要空时拉高,阻止继续进行读操作而造成读出无效数据underflow。
读时钟:读操作时遵循的时钟,一个周期读一次数。
写时钟:写操作时遵循的时钟,一个周期写一次数。
读指针:指向下一次读操作要读取的单元,在读数的过程中自动加一。复位时指向第一个单元。
写指针:指向下一次写操作要写入的单元,在写数的过程中自动加一。复位时指向第一个单元。

四.FIFO深度的计算

这类问题在求职面试中很常见,问题有前提条件,即写时钟大于读时钟,且写操作并不连续,因为如果写操作连续而读操作速度过慢,不管多大的FIFO都会溢出。所以题目应理解为写操作是一个突发行为。
在数据传输的整个过程中,”写数据=读数据“才是一个有效的FIFO,但是当把观察范围缩小,比如在Burst突发情况下,写数据很有可能大于读数据,但是并没有影响,因为如果FIFO的深度足够,当写操作停止,一直到下一个Burst突发之前,读操作可以在这个时间间隙中把FIFO中的数据读出。下面看几种类型的例题。

  1. 单次发送,求FIFO最小深度。

e.g.1 一个8bit宽的FIFO,写时钟为100MHz,读时钟为95MHz,假设一个package为为4Kbit,且两个package中间发送间隔足够大,求FIFO最小深度。

思路:题中假设两个package中间间隔足够大,即可以理解为考虑发送一个package。那么整个传输过程就分为Burst和Idle两个阶段。在Burst阶段,读写操作同时进行,在Idle阶段,写操作结束,读操作继续直到将整个package

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值