版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、深入理解FIFO (包含有FIFO深度的解释)FIFO:一、先入先出队列(First Input First Output , FIFO)这是一种 传统的按序执行方法, 先进入的指令先完成并引退, 跟着才执行第二 条指令。1 什么是 FIFOFIFO是英文First In First Out的缩写,是一种先进先出的数据缓存器, 他与普通存储器的区别是没有外部读写地址线, 这样使用 起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其 数据地址由内部读写指针自动加 1 完成, 不能像普通存储器那样可以 由地址线决定读取或写入某个指定的地址。2 什么情况下用FIFOFIFO 一般用于不同时
2、钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为 16位100K SPI ,那么每秒的数据量为100Kx 16bit=,而PCI总线的 速度为33MHz总线宽度32bit,其最大传输速率为1056Mbps,在两个 不同的时钟域间就可以采用 FIFO来作为数据缓冲。另外对于不同宽 度的数据接口也可以用 FIFO,例如单片机位8位数据输出,而DSP 可能是16位数据输入,在单片机与DSP11接时就可以使用FIFO来达 到数据匹配的目的。3 FIFO 的一些重要参数FIFO的宽度:也就是英文资料里常看到的 THEWIDTH它只的是FIFO一次读
3、写操作的数据位,就像 MCUT 8位和16位,ARM32位等 等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用 FPGA!己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。FIFO的深度:THE DEEPTH它指的是FIFO可以存储多少个 N位 的数据(如果宽度为N)o如一个8位的FIFO,若深度为8,它可以 存储 8 个 8 位的数据,深度为 12 ,就可以存储12 个 8 位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公 式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写 入或读出。 在一个具体的应用中也不可能由一些参数算数
4、精确的所需FIFO 深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。一般来说根据电路 的具体情况,在兼顾系统性能和 FIFO成本的情况下估算一个大概的 宽度和深度就可以了。而对于写速度慢于读速度的应用, FIFO 的深 度要根据读出的数据结构和读出数据的由那些具体的要求来确定。满标志: FIFO 已满或将要满时由 FIFO 的状态电路送出的一个信 号,以阻止FIFO 的写操作继续向 FIFO 中写数据而造成溢出( overflow ) 。空标志: FIFO 已空或将要空时由 FIFO 的状态电路送出的一个信号,以阻止FIFO的读操作继续从FI
5、FO中读出数据而造成无效数据的 读出( underflow ) 。读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。读指针:指向下一个读出地址。读完后自动加 1。写指针:指向下一个要写入的地址的,写完自动加 1。读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。4 FIFO 的分类根均 FIFO 工作的时钟域,可以将FIFO 分为同步 FIFO 和异步FIFO。同步FIFO是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步 FIFO 是指读写时钟不一致,读写时钟是互相独立的。5 . FIFO设计的难点
6、FIFO 设计的难点在于怎样判断FIFO 的空 / 满状态。为了保证数据正确的写入或读出,而不发生溢出或读空的状态出现,必须保证FIFO 在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断FIFO的满/空就成了 FIFO设计的核心问题。由于同步FIFO 几乎很少用到,这里只描述异步 FIFO 的空 / 满标志产生问题。在用到触发器的设计中, 不可避免的会遇到亚稳态的问题 (关于亚稳态这里不作介绍, 可查看相关资料) 。 在涉及到触发器的电路中,亚稳态无法彻底消除, 只能想办法将其发生的概率将到最低。 其中的一个方法就是使用格雷码。 格雷码在相邻的两个码元之间只由一位变换(二进制
7、码在很多情况下是很多码元在同时变化 ) 。 这就会避免计数器与时钟同步的时候发生亚稳态现象。 但是格雷码有个缺点就是只能定义2An的深度,而不能像二进制码那样随意的定义FIFO的深度, 因为格雷码必须循环一个2An,否则就不能保证两个相邻码元之间相差一位的条件, 因此也就不是真正的各雷码了。 第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为 P 的平方。 但这回导致延时的增加。 亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同, 这就导致写入或读出的地址错误。 由于考虑延时的作用,空/满标志的产生并不一定出现
8、在 FIFO真的空/满时才出现。可 能FIFO还未空/满时就出现了空/满标志。这并没有什么不好,只要 保证 FIFO不出现 overflow or underflow 就 OK了。很多关于 FIFO 的文章其实讨论的都是空 / 满标志的不同算法问 题。在Vijay A. Nebhrajani 的异步FIFO结构一文中,作者提 出了两个关于FIFO空/满标志的算法。第一个算法:构造一个指针宽度为N+1,深度为2AN字节的FIFO(为便方比较将格雷码指针转换为二进制指针) 。当指针的二进制码中最高位不一致而其它 N位都相等时,FIFO为满(在 Clifford E.Cummings 的文章中以格雷
9、码表示是前两位均不相同,而后两位LSB相同为满,这与换成二进制表示的MS杯同其他相同为满是一样的)。当指针完全相等时, FIFO 为空。这也许不容易看出,举个例子说明一下:一个深度为 8 字节的 FIFO 怎样工作(使用已转换为二进制的指针) 。 FIFO_WIDTH=,8 FIFO_DEPTH= 2AN = 8, N = 3 ,指针宽度为N+1=4 起初 rd_ptr_bin 和 wr_ptr_bin 均为 “ 0000”。止匕时 FIFO 中 写入 8 个字节的数据。 wr_ptr_bin =“ 1000” , rd_ptr_bin= “0000”。当然,这就是满条件。现在,假设执行了 8
10、 次的读操作,使得rd_ptr_bin =“1000” ,这就是空条件。另外的 8 次写操作将使wr_ptr_bin 等于“0000” ,但rd_ptr_bin 仍然等于“1000” ,因此FIFO 为满条件。显然起始指针无需为“ 0000”。假设它为“ 0100”,并且FIFO为 空,那么 8 个字节会使wr_ptr_bin =“ 1100” , , rd_ptr_bin 仍然为“ 0100”。这又说明FIFO 为满。在Vijay A. Nebhrajani 的这篇异步FIFO结构文章中说明 了怎样运用格雷码来设置空满的条件, 但没有说清为什么深度为 8 的 FIFO其读写指针要用3+1位的
11、格雷码来实现,而3+1位的格雷码可 以表示16位的深度,而真实的FIFO只有8位,这是怎么回事而这个 问题在 Clifford E. Cummings 的文章中得以解释。三位格雷码可表示8位的深度,若在加一位最为 MSB则这一位加其他三位组成的格雷码并不代表新的地址, 也就是说格雷码的 0100 表示表示 7, 而 1100仍然表示7,只不过格雷码在经过一个以0位MSB勺循环后进入一个 以1为MSB勺循环,然后又进入一个以0位MSB勺循环,其他的三位 码仍然是格雷码,但这就带来一个问题,在 0100 的循环完成后,进 入 1000,他们之间有两位发生了变换,而不是1 位,所以增加一位MSB勺做
12、法使得该码在两处:01001000, 11000000有两位码元发生 变化,故该码以不是真正的格雷码。增加的MS提为了实现空满标志 的计算。 Vijay A. Nebhrajani 的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转换,而 Clifford E. Cummings 的文章中直接在格雷码条件下得出空满条件。其实二者是一样的,只是实现方式不同罢了。第二种算法:Clifford E. Cummings 的文章中提到的 STYLE #2 它将FIFO地址分成了 4部分,每部分分别用高两位的 MSB 00、01、 11、10决定FIFO是否为going full 或goi
13、ng empty (即将满或空)。 如果写指针的高两位 MSBJ、于读指针的高两位 MS刖FIFO为“几乎 满”,若写指针白高两位MS耿于读指针的高两位MSB® FIFO为“几 乎空”。在Vijay A. Nebhrajani 的异步FIFO结构第三部分的文章 中也提到了一种方法,那就是方向标志与门限。设定了 FIFO容量的 75%乍为上限,设定FIFO容量的25恸下限。当方向标志超过门限便 输出满/空标志,这与 Clifford E. Cummings的文章中提到的STYLE#2可谓是异曲同工。他们都属于保守的空满判断。其实这时输出空 满标志FIFO并不一定真的空/满。说到此,我们已经清楚地看到,FIFO设计最关键的就是产生空/ 满标志的算法的不同产生了不同的FIFO。但无论是精确的空满还是保守的空满都是为了保证 FIFO工作的可靠二、先进先出法 (first in,first out, FIFO)先进先出法是指根据先入库先发出的原则, 对于发出的存货以先入库存货的单价计算发出存货成本的方法 . 采用这种方法的具体做法是: 先按存货的期初余额的单价计算
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东alc板施工方案(3篇)
- 店铺装修围挡施工方案(3篇)
- 扁鹊医生营销方案(3篇)
- 方管雨棚施工方案(3篇)
- 月子店营销方案(3篇)
- 桥面混凝土浇筑施工方案(3篇)
- 质量管理演讲稿(23篇)
- 淮南冲孔围挡施工方案(3篇)
- 监理对施工方案变更(3篇)
- 窗户补胶施工方案(3篇)
- 沉浸式剧本杀《祝福》公开课 课件 高一语文统编版必修下册
- DBJ-T13-144-2019 福建省建设工程监理文件管理规程
- 部编版四年级语文上册第四单元习作《我和-过一天》教材分析
- 辽宁省锦州市招考引进“双一流”建设高校和部分重点高校急需专业届毕业生到市属事业单位工作公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 交警酒驾案件培训课件
- 客户第一华为客户关系管理法-读后感
- 消防设施操作员(基础知识初级技能)PPT完整全套教学课件
- 全国城市一览表-excel
- 干部学历学位认证表A
- 国家义务教育质量监测四年级劳动教育创新作业测试卷【附答案】
- 工业互联网综合服务平台建设方案
评论
0/150
提交评论