FPGAFIFORAM等相关知识

上传人:宝路 文档编号:7513760 上传时间:2017-09-21 格式:DOCX 页数:25 大小:488.34KB
返回 下载 相关 举报
FPGAFIFORAM等相关知识_第1页
第1页 / 共25页
FPGAFIFORAM等相关知识_第2页
第2页 / 共25页
FPGAFIFORAM等相关知识_第3页
第3页 / 共25页
FPGAFIFORAM等相关知识_第4页
第4页 / 共25页
FPGAFIFORAM等相关知识_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《FPGAFIFORAM等相关知识》由会员分享,可在线阅读,更多相关《FPGAFIFORAM等相关知识(25页珍藏版)》请在金锄头文库上搜索。

1、FIFO 简介First Input First Output 的缩写,先入先出队列,这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令。是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加 1 完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。FIFO 是队列机制中最简单的,每个接口上只有一个 FIFO 队列,表面上看 FIFO 队列并没有提供什么 QoS 保证,甚至很多人认为 FIFO 严格意义上不算做一种队列技术,实则不然,FIFO

2、是其它队列的基础,FIFO 也会影响到衡量 QoS 的关键指标:报文的丢弃、延时、抖动。既然只有一个队列,自然不需要考虑如何对报文进行复杂的流量分类,也不用考虑下一个报文怎么拿、拿多少的问题,即 FIFO 无需流分类、调度机制,而且因为按顺序取报文,FIFO 无需对报文重新排序。简化了这些实现其实也就提高了对报文时延的保证。FIFO 关心的就是队列长度问题,队列长度会影响到时延、抖动、丢包率。因为队列长度是有限的,有可能被填满,这就涉及到该机制的丢弃原则,FIFO 使用 Tail Drop 机制。如果定义了较长的队列长度,那么队列不容易填满,被丢弃的报文也就少了,但是队列长度太长了会出现时延的

3、问题,一般情况下时延的增加会导致抖动也增加;如果定义了较短的队列,时延的问题可以得到解决,但是发生 Tail Drop 的报文就变多了。类似的问题其它排队方法也存在。Tail Drop 机制简单的说就是如果该队列如果已经满了,那么后续进入的报文被丢弃,而没有什么机制来保证后续的报文可以挤掉已经在队列内的报文。FIFO 队列原理简述FIFO 队列不对报文进行分类,当报文进入接口的速度大于接口能发送的速度时,FIFO 按报文到达接口的先后顺序让报文进入队列,同时, FIFO 在队列的出口让报文按进队的顺序出队,先进的报文将先出队,后进的报文将后出队。FIFO 队列具有处理简单,开销小的优点。但 F

4、IFO 不区分报文类型,采用尽力而为的转发模式,使对时间敏感的实时应用(如 VoIP)的延迟得不到保证,关键业务的带宽也不能得到保证。使用 FIFOFIFO 一般用于不同时钟域之间的数据传输,比如 FIFO 的一端是 AD 数据采集,另一端是计算机的 PCI 总线,假设其 AD 采集的速率为 16 位 100K SPS,那么每秒的数据量为100K16bit=1.6Mbps,而 PCI 总线的速度为 33MHz,总线宽度 32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用 FIFO 来作为数据缓冲。另外对于不同宽度的数据接口也可以用 FIFO,例如单片机位 8 位数据输

5、出,而 DSP 可能是 16 位数据输入,在单片机与 DSP 连接时就可以使用 FIFO 来达到数据匹配的目的。FIFO 的宽度:也就是英文资料里常看到的 THE WIDTH,它指的是 FIFO 一次读写操作的数据位,就像 MCU 有 8 位和 16 位,ARM32 位等等,FIFO 的宽度在单片成品 IC 中是固定的,也有可选择的,如果用 FPGA 自己实现一个 FIFO,其数据位,也就是宽度是可以自己定义的。FIFO 的深度:THE DEEPTH,它指的是 FIFO 可以存储多少个 N 位的数据(如果宽度为 N) 。如一个 8 位的 FIFO,若深度为 8,它可以存储 8 个 8 位的数据

6、,深度为 12 ,就可以存储 12 个 8 位的数据,FIFO 的深度可大可小,个人认为 FIFO 深度的计算并无一个固定的公式。在 FIFO 实际工作中,其数据的满/ 空标志可以控制数据的继续写入或读出。在一个具体的应用中不可能由一些参数精确算出所需的 FIFO 深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的 FIFO 深度往往要大于计算值。一般来说根据电路的具体情况,在兼顾系统性能和 FIFO 成本的情况下估算一个大概的宽度和深度就可以了。而对于写速度慢于读速度的应用,FIFO 的深度要根据读出的数据结构和读出数据由那些具体的要求来确定。满标志:FIFO 已满或将要

7、满时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO 的写操作继续向 FIFO 中写数据而造成溢出(overflow ) 。空标志:FIFO 已空或将要空时由 FIFO 的状态电路送出的一个信号,以阻止 FIFO 的读操作继续从 FIFO 中读出数据而造成无效数据的读出(underflow) 。读时钟:读操作所遵循的时钟,在每个时钟沿来临时读数据。写时钟:写操作所遵循的时钟,在每个时钟沿来临时写数据。读指针:指向下一个读出地址。读完后自动加 1。写指针:指向下一个要写入的地址的,写完自动加 1。读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。4FIFO 的分类根据

8、FIFO 工作的时钟域,可以将 FIFO 分为同步 FIFO 和异步 FIFO。同步 FIFO 是指读时钟和写时钟为同一个时钟。在时钟沿来临时同时发生读写操作。异步 FIFO 是指读写时钟不一致,读写时钟是互相独立的。5FIFO 设计的难点FIFO 设计的难点在于怎样判断 FIFO 的空/ 满状态。为了保证数据正确的写入或读出,而不发生溢出或读空的状态出现,必须保证 FIFO 在满的情况下,不能进行写操作。在空的状态下不能进行读操作。怎样判断 FIFO 的满/ 空就成了 FIFO 设计的核心问题。由于同步 FIFO 几乎很少用到,这里只描述异步 FIFO 的空/ 满标志产生问题。在用到触发器的

9、设计中,不可避免的会遇到亚稳态的问题(关于亚稳态这里不作介绍,可查看相关资料) 。在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。其中的一个方法就是使用格雷码。格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化 )。这就会避免计数器与时钟同步的时候发生亚稳态现象。但是格雷码有个缺点就是只能定义 2n 的深度,而不能像二进制码那样随意的定义 FIFO 的深度,因为格雷码必须循环一个 2n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的格雷码了。第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为 P,那么两个级联

10、的触发器发生亚稳态的概率就为 P的平方。但这会导致延时的增加。亚稳态的发生会使得 FIFO 出现错误,读/ 写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。由于考虑延时的作用,空/满标志的产生并不一定出现在 FIFO 真的空/满时才出现。可能 FIFO 还未空/ 满时就出现了空/满标志。这并没有什么不好,只要保证 FIFO 不出现 overflow or underflow 就 OK 了。很多关于 FIFO 的文章其实讨论的都是空/满标志的不同算法问题。在 Vijay A. Nebhrajani 的异步 FIFO 结构一文中,作者提出了两个关于 FIFO空/满标志的算法

11、。第一个算法:构造一个指针宽度为 N+1,深度为 2N 字节的 FIFO(为方便比较,将格雷码指针转换为二进制指针) 。当指针的二进制码中最高位不一致而其它 N 位都相等时,FIFO 为满(在 Clifford E. Cummings 的文章中以格雷码表示是前两位均不相同,而后两位LSB 相同为满,这与换成二进制表示的 MSB 不同其他相同为满是一样的) 。当指针完全相等时,FIFO 为空。这也许不容易看出,举个例子说明一下:一个深度为 8 字节的 FIFO 怎样工作(使用已转换为二进制的指针) 。FIFO_WIDTH=8,FIFO_DEPTH= 2N = 8,N = 3,指针宽度为 N+1=

12、4。起初 rd_ptr_bin 和 wr_ptr_bin 均为 “0000”。此时 FIFO 中写入 8个字节的数据。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。当然,这就是满条件。现在,假设执行了 8 次的读操作,使得 rd_ptr_bin =“1000”,这就是空条件。另外的 8 次写操作将使 wr_ptr_bin 等于“0000”,但 rd_ptr_bin 仍然等于“1000”,因此 FIFO 为满条件。显然起始指针无需为“0000”。假设它为“0100” ,并且 FIFO 为空,那么 8 个字节会使wr_ptr_bin =“1100”,, rd_ptr_b

13、in 仍然为“0100”。这又说明 FIFO 为满。在 Vijay A. Nebhrajani 的这篇异步 FIFO 结构文章中说明了怎样运用格雷码来设置空满的条件,但没有说清为什么深度为 8 的 FIFO 其读写指针要用 3+1 位的格雷码来实现,而 3+1 位的格雷码可以表示 16 位的深度,而真实的 FIFO 只有 8 位,这是怎么回事?而这个问题在 Clifford E. Cummings 的文章中得以解释。三位格雷码可表示 8 位的深度,若在加一位最为 MSB,则这一位加其他三位组成的格雷码并不代表新的地址,也就是说格雷码的 0100 表示表示 7,而 1100 仍然表示 7,只不过

14、格雷码在经过一个以 0 位 MSB 的循环后进入一个以 1 为 MSB 的循环,然后又进入一个以 0 位 MSB 的循环,其他的三位码仍然是格雷码,但这就带来一个问题,在 0100 的循环完成后,进入 1000,他们之间有两位发生了变换,而不是 1 位,所以增加一位 MSB 的做法使得该码在两处:01001000,11000000 有两位码元发生变化,故该码以不是真正的格雷码。增加的MSB 是为了实现空满标志的计算。Vijay A. Nebhrajani 的文章用格雷码转二进制,再转格雷码的情况下提出空满条件,仅过两次转换,而 Clifford E. Cummings 的文章中直接在格雷码条件

15、下得出空满条件。其实二者是一样的,只是实现方式不同罢了。第二种算法:Clifford E. Cummings 的文章中提到的 STYLE#2。它将 FIFO 地址分成了 4 部分,每部分分别用高两位的 MSB 00 、01、 11、 10 决定 FIFO 是否为 going full 或 going empty (即将满或空) 。如果写指针的高两位 MSB 小于读指针的高两位 MSB 则FIFO 为 “几乎满”,若写指针的高两位 MSB 大于读指针的高两位 MSB 则 FIFO 为“几乎空” 。在 Vijay A. Nebhrajani 的异步 FIFO 结构第三部分的文章中也提到了一种方法,

16、那就是方向标志与门限。设定了 FIFO 容量的 75%作为上限,设定 FIFO 容量的 25%为下限。当方向标志超过门限便输出满/空标志,这与 Clifford E. Cummings 的文章中提到的STYLE #2 可谓是异曲同工。他们都属于保守的空满判断。其实这时输出空满标志 FIFO并不一定真的空/满。说到此,我们已经清楚地看到,FIFO 设计最关键的就是产生空/ 满标志的算法的不同产生了不同的 FIFO。但无论是精确的空满还是保守的空满都是为了保证 FIFO 工作的可靠。随机存取存储器 RAM随机存取存储器(英文:random access memory,RAM)又称作“随机存储器” ,是与CPU 直接交换数据的内部存储器,也叫主存。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。 按照存储信息的不同,随机存储器又分为静态随机存储器

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号