同步FIFO的设计与实现

合集下载

fifo电路结构结构

fifo电路结构结构

fifo电路结构结构
FIFO电路结构是一种特殊的存储器结构,主要用于数据的缓存和传输。

FIFO,即First In First Out,意为先入先出,其特性是数据按照进入的顺序依次被读出。

这种特性使得FIFO在数据传输和缓冲中扮演着重要的角色。

FIFO电路结构主要由两部分组成:输入部分和输出部分。

输入部分负责接收数据并将其存储到FIFO中,而输出部分则负责从FIFO中读取数据并将其输出。

这种结构使得数据在FIFO中的流动呈现出一种线性、有序的状态。

在FIFO中,数据的存储和读取都是通过指针来实现的。

指针是一个地址指示器,它指向FIFO中当前要读取或写入的数据的位置。

当数据被写入FIFO时,写指针会向前移动,指向下一个可用的存储位置。

当数据被从FIFO中读取时,读指针会向前移动,指向下一个要读取的数据位置。

由于FIFO的先入先出特性,写指针和读指针的移动方向是一致的,都是从FIFO的一端向另一端移动。

FIFO电路结构有两种主要类型:触发导向结构和零导向传输结构。

触发导向结构的FIFO 由寄存器阵列构成,当满足一定条件时,数据会被写入或读取。

而零导向传输结构的FIFO 则是由具有读和写地址指针的双口RAM构成,数据的读写操作是通过地址指针来完成的。

FIFO电路结构在许多领域都有广泛的应用,如计算机系统中的缓存、数据传输、图像处理等。

由于其先入先出的特性,FIFO能够有效地缓解数据传输和处理过程中的速度不匹配问题,提高系统的整体性能。

存储器模块FIFO结构和设计实现

存储器模块FIFO结构和设计实现

存储器模块FIFO结构和设计实现前言:在现代系统中,为了提高系统的性能,设计者对数据的传输率、数据的传输量,对系统各部分之间的接口部分不同数据输入和接收传输率的匹配有越来越高的要求,FIFO存储器以其合理的价格、使用的方便灵活性以及对速度匹配的应用而成为解决这类问题的理想途径,尤其利用FIFO可以实现快速处理,提高控制的速度,比如我们SPI,IIC或者UART将采集的一组数据送出去,但是这些数据传送都是需要一定时间的,有时为了不耽误数据采集的时间,就可以采集的数据直接先连续的存放在缓冲区内.数据的发送交给另外一个任务去处理.这样就不会耽误数据采集任务的时间来等待每个字节的发送完毕了.因此FIFO存储器在计算机、多媒体和数据通信领域都有着广泛的应用,它的实现具有理论上和实际应用上的双重意义。

正文:存储器模块FIFO的定义及简介:FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。

FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。

另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。

FIFO的现状:在大规模集成电路设计中,一个系统包含了很多不相关的时钟信号,当其目标域时钟与源域时钟不同时,因而在这些不同域之间传递数据成为了一个重要问题。

FIFO设计

FIFO设计

• 4) FULL信号控制进程 • 如何判断FULL信号为‘1’;
• 1、当前没有读/写数据有效信号,FIFO数 据已满 • 2、当前没有读有效信号,有写有效信号, 而且FIFO还差一个就满了。
• 4) FULL信号控制进程

Process(clk,reset) begin if reset='1' then full_mid<='1'; elsif rising_edge(clk) then if (rd_enable='0' and (fifo_cnt(8 downto 1) = "11111111") and ((fifo_cnt(0)='1') or (wr_enable='1'))) then full_mid<='1'; else full_mid<='0'; end if; end if; end process;
同步FIFO的操作
1、 同步FIFO的操作 当FIFO不满且wr_en有效时,向FIFO写数据,并 置写使能wr_enable有效; 当FIFO不空且rd_en有效时,从FIFO从读出数据 并置读使能rd_enable有效; 当FIFO满且wr_en有效时,置写使能wr_enable
无效且作废此次写操作; 当FIFO空且rd_en有效时,置读使能rd_enable 无效且作废此次读操作。
异步FIFO的设计
• 异步FIFO的数据读、写受不同时钟的控制; • 异步FIFO的空、满状态不能依靠计数的方 式进行,因为读、写均需要对计数器进行 操作; • 如何判断异步FIFO的空、满情形?如何操 作?

同步FIFO的应用

同步FIFO的应用

同步FIFO的应用
随着社会生产与研究设计对喷绘产品高速化的需求与日俱增,传统的数字喷墨式印刷机已经不能满足这种需求。

而大幅面高速彩色喷绘机无论是
在数据的传输速度还是在打印的质量上都超过了传统的数字喷墨式印刷机。

但是,大幅面高速彩色喷绘机的技术并不是十分成熟,还有许多的地方可以
改进。

近年来,随着微电子设计技术与工艺的发展,数字集成电路从电子管、晶体管、中小规模集成电路、超大规模集成电路逐步发展到今天的专用集成
电路(ASIC)。

ASIC的出现降低了产品的生产成本,提高了系统的可靠性,缩小了电路的物理尺寸,推动了社会的数字化进程[1]。

数字电路设计当中用FPGA来实现FIFO的功能可以更好地解决并行性和实时性问题,而且用FPGA实现的FIFO更容易修改和测试,可以降低成本和缩短开发周期。

1像素数据传输定时分析
像素数据传输时序如图1所示,像素数据传输在CLK的同步下进行,每次传送256&TImes;2bit,使用256个CLK时钟。

在传输开始前和传输结束后,CLK应该保持在高电平。

每次传输完后,等待3个连续的像素时钟。

使用FIFO完成数据传输与同步_上_

使用FIFO完成数据传输与同步_上_

今年快闪存储记忆卡出口额增幅将达 100%
环球资源近日发表“中国采购资讯报告:快闪存储记忆卡与读卡器”;报告显示中国大陆制造商 在 2005 年将出口价值 3 亿 240 万美元的快闪存储记忆卡及价值 2,520 万美元的读卡器—— —比 2004 年分别增加 100%与 20%。
此外,制造商的生产重点正转向 miniSD 卡(mini Secure Digital)与 RS 多媒体卡(Reduced- Size MultiMediaCards) ,这两种卡的尺寸约为原来尺寸的一半。
CIC 中国集成电路 China lnte gra te d Circult
设计开发
使用 F IF O 完成数据传输与同步( 上)
中关村益华软件技术学院 赵震甲
摘要:将数据从一个时钟域同步至另一个时钟域,常用的两个方法为: 1、使用握手(handshake)信号; 2、使用 FIFO。使用握手方法的缺点是传递及辩识用于数据传输的所有握手信号所需的潜伏时间 (latency) 会增加延迟并降低传输效率。因此时钟域之间传递数据最常用的方法是使用 FIFO。异步 FIFO 的运作(operation)方法是: 数据从一个时钟域写入 FIFO,该数据从另一个时钟域自 FIFO 读出。 本文讨论两种异步 FIFO 的设计技巧: 1、比较同步指针;2、比较异步指针。 关键词: 先进先出存储存器 FIFO (First-In-First-Out memories),位 (bit),时钟边界(clock boundary),时钟域 (clock domain),时钟沿 (clock edge),格雷码 (Gray code),亚稳定状态 (metastability),指 针 (pointer),读 指 针 (read pointer),写 指 针 (write pointer),读 时 钟 (read clock),写时钟 (write clock),读运作 (read operation),写运作 (write operation),同步 (synchronize),同步作用(synchronization),同步器(synchronizer),异步(asynchronous)。

FIFO经验谈

FIFO经验谈

名称
同步和异步 FIFO设计
作者
喻志清
参考资料清单
编号
发布日期
查阅地点或渠道
1 引言
先进先出缓存电路FIFO在大规模逻辑设计当中 得到普遍地使用 几乎每个芯片都会涉及到 它 也就是说每个大规模逻辑设计者都必须掌握该种电路的设计方法 但在实际应用中 FIFO的 类型又不尽相同 有的电路需要的是同步FIFO 即 读写时钟为同一个时钟 有的需要异步 FIFO 即 读写时钟的频率或相位不一样 有的电路对FIFO的速度要求不高 有的则需要高速 FIFO 比如工作频率在100MHz以上 同时具体电路对FIFO的空满标志的产生也有一定的要求 有按一个深度进行读写的 也有连续读写一块的 Burst read/write 有读写位宽一致的(256深 80bit <==> 256深 80bit 也有读写位宽是倍数关系的 256深 80bit<==>1024深 20bit) 异步 FIFO的读写地址转变为格雷码再进行比较 产生空满标志 从而保证电路的可靠性
深圳市华为技术有限公司
研究管理部文档中心
文档编号 产品名称
产品版本 1.0
密级 公开 共41页
FIFO经验谈
(仅供内部使用)
文档作者 项目经理 研究部 总体组 文档管理员
刘智勇
日期
2000/10/23
日期
//
日期
//
日期
//
日期
//
深圳市华为技术有限公司
版权所有 侵权必究
FIFO经 验
请输入文档编号
end复位状态允许读操作禁止读操作cntfifoupwater或者cntfifoupwater或者cntfifolowwatercntpkt1cntpkt1其余情况其余情况其余情况有数据包信号drpa的产生状态机最佳状态是设计过程中不会出现空和满标志这样控制逻辑简单而且速度可以达到很高如pimux的1k37的异步大fifo原来设计考虑了满和空标志并且用它们制约读写地址的产结果极大的影响了fpga的速度后来仔细考虑下该fifo是基于包调度当fifo内有完整的pktvalid有效才开始允许读所以fifo出现空的情况很少当fifo内只有一个包且刚好读完包尾的同时fifo空了所以空标志的产生电路是冗余的完全可由pktvalid信号取节约了大路的电路并极大的提高的fpga的实现速度原来rdallowrden

利用FPGA实现同步FIFO设置方法

利用FPGA实现同步FIFO设置方法

第29卷第1期 2006年2月电 子 测 量 技 术EL ECT R ON IC M EASU R EM EN T T ECH N OL OG Y信息技术利用FPGA 实现同步FIFO 设置方法刘志杨 郭继昌 关 欣 黄彩彩 天津大学摘 要 文中在Q ua rtus 环境中,用V H DL 作为编程语言,实现用F PG A 器件对同步FIF O 设置的方法,在基于DSP 的图像处理系统中达到使同步FIF O 高效完成数据缓冲作用的目的。

这种方法对F IFO 的使用具有很好的借鉴意义。

关键词 先进先出(FIFO) 硬件描述语言 偏置寄存器Method of using FPGA to realize synchronous FIFO configurationL iu Zhiyang G uo Jichang Guan X in Huang CaicaiAbstract In this paper,a config ur ation method of synchro no us FI FOs w ith FP GA and V HD L lang uag e is realized in the Quar tus develo pment envir onment.A nd the pur po se o f effect ive data buffer with sy nchro no us F IFO s is obtained in the infrar ed imag e processing system based on DSP.T his metho d is o f import ant r eference v alue to the utility o f FIF Os.Keywords F IFO har dw are descr iption lang uage offset r egister1 系 统在基于DSP 的红外图像数据处理系统中,FIFO 器件IDT72V263[1]用作高速DSP 与低速设备的缓冲接口,系统的原理框图如图1所示。

同步FIFO

同步FIFO

读和写的使能
如果系统reset后,读写使能同时有效,这 时RAM输出的数据并不是输入的数据。
如果读写地址不同,读写使能同为1时,读 不会延迟两个clock。 用这种方法可以处理这种情况。
FIFO的模块端口
FIFO 内部结构图
CONTROL的结构
THE END
FIFO 存储器主要分为基于移位寄存器型和 基于 RAM 型。而 RAM 型的又有单口 RAM 和双口 RAM 之分,目前来说用的较为广泛 的是基于双端口 RAM 的 FIFO。下面给大家 介绍的就是基于双端口 RAM 的 FIFO。
FIFO的模块端口
双口 RAM
在介绍FIFO原理之前先给大家说说双口RAM, 因为FIFO的主要功能就是对RAM的控制,产生 空满信号。 双口RAM指的就是带读和写地址、使能端的存 储器。
什么叫synchronous FIFO
Synchronous FIFO 同步FIFO 前面介绍的功能主要讲的是异步的FIFO。 同步指的是读和写都在一个clock下工作。 显然异步FIFO就是指不在同一个clock下工 FIFO clock 作的。这里不作描述。 ☀读写在同一时钟下叫同步,不同时钟叫异 步。
空满信号的判断
通过比较读写指针信号可以判断FIFO的空 满状态。 当读指针和写指针相等时,FIFO 可能处于满 状态或空状态。
空满信号的简单示意图
如何判断是空是满呢?
可以用不同的方法判断是写指针从后面追 上了读指针还是读指针从后面追上了写指 针。本文所应用的方法是分别将读/写地址 寄存器扩展一位,将最高位设置为状态位,其 余低位作为地址位,指针由地址位以及状态 位组成。首先把读、写状态位全部复位, 如果地址循环了奇数次,则状态位置1,偶 数次则又重新复位,应用地址位和状态位 的结合实现对空、满标志位的控制。当读 写指针的地址位和状态位全部吻合的时候, 读写指针经历了相同次数的循环移动,也就 是说,FIFO 处于空状态;如果读写指针的地址 位相同而状态位相反,写指针比读指针多循 环一次,标志FIFO处于满状态。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

同步缓冲器(FIFO)的设计与实现姓名:学号:012004022102班级:2010级测控1班院系:控制系专业:测控技术与仪器同组人姓名:(说明:我们三个人前面的报告部分是一样的,因为课设基本是三个人商议完成,所以就感觉报告部分没什么不同的就只写了一份报告)目录1原理与系统设计 (3)2设计思想 (4)3源码与注释 (5)4仿真 (12)5综合 (15)6心得体会与建议 (19)1 原理与系统设计FIFO(First In First Out)——是一种可以实现数据先入先出的存储器件。

FIFO就像一个单向管道,数据只能按固定的方向从管道一头进来,再按相同的顺序从管道另一头出去,最先进来的数据必定是最先出去。

FIFO被普遍用作数据缓冲器。

FIFO的基本单元是寄存器,作为存储器件,FIFO的存储能力是由其内部定义的存储寄存器的数量决定的。

本题中所设计的是同步FIFO(即输出输入端时钟频率一致),异步复位,其存储能力为(16x8),输出两个状态信号:full与empty,以供后继电路使用。

根据系统要求,画出的系统框图,如图1所示clockreset 读控制信号写控制信号inputfullemptyoutput 图1同步FIFO框图端口说明:输入:in_data: 输入数据端口,位宽为8位;read_n: 读使能端,当read_n=0时,可以读出数据;write_n: 写使能端,当write_n=0时,可以写入数据;clock: 时钟信号,在时钟的正边沿进行采样;reset_n: 复位信号,当reset_n=0时,计数器及读写都被清零(即:读写地址指针都指向0)输出:out_data: 输出数据端口,位宽为8位;;full:FIFO状态信号,当full=1时,表明该FIFO存储器已经写满;empty:FIFO状态信号,当empty=1时,表明该FIFO存储器已经读空;FIFO满的情况下,不能再写,写指针不能加1;FIFO空的情况下,不能再读,读指针不能加1;2 设计思想由以上的系统框图和端口分析,我们将设计的重点定在了解决以下三个核心问题上:1.FIFO的存储体如何表示?2.如何实现“先进先出”的逻辑功能?3.如何知道FIFO内部使用了多少,是满是空?针对以上三个问题,我们所采取的方法是:1.定义一个16×8的二维数组来表示FIFO的存储体。

2.为了实现“先进先出”的逻辑功能,我们定义了“读指针”及“写指针”,分别用来指示读操作与写操作的位置。

3.为了表示FIFO是满还是空,我们定义了一个计数器,用以标志FIFO已使用了多少空间。

在解决了以上三个重点问题以后,针对同步FIFO的逻辑功能,我们拟定了以下一个结构图,如图2所示:图2 FIFO设计结构图3.源码与注释3.1源代码我们在完成了之前两步的准备工作之后,进行了源码的设计,具体的代码如下:`define DEL 1 //为了使仿真接近真实情形,我们定义了从时钟到输出的延时module sfifo(clock,reset_n,in_data,read_n,write_n,out_data,full,empty);//输入信号input clock; //输入时钟input reset_n; //复位信号,低有效input[7:0] in_data; //输入的数据input read_n; //读控制信号,低有效input write_n; //写控制信号,低有效//输出信号output[7:0] out_data; //FIFO的输出数据output full; //FIFO满标志信号output empty; //FIFO空标志信号//信号声明reg [7:0] out_data;reg [7:0] fifo_mem[15:0]; //FIFO存储体即8*16存储器,用数组表示reg [4:0] counter; //计数器表示FIFO中已用了多少reg [3:0] rd_pointer; //FIFO读指针,指向下次读操作的地址reg [3:0] wr_pointer; //FIFO读指针,指向下次读操作的地址//赋值声明,给出满标志与空标志的实现assign #`DEL full=(counter==16)?1'b1:1'b0;assign #`DEL empty=(counter==0)?1'b1:1'b0;//本模块实现读指针、写指针和计数器的功能always@(posedge clock or negedge reset_n)beginif(~reset_n)begin //计数器及读、写指针清零rd_pointer<=#`DEL 4'b0;wr_pointer<=#`DEL 4'b0;counter<=#`DEL 5'b0;endelsebeginif(~read_n)begin//如果FIFO为空,不能再读,并报错if(counter==0)//检查fifo是否溢出(empty)begin$display("\nERROR at time %0t:",$time);$display("FIFO Underflow\n");$stop; //终止系统任务,用于调试end//读有效,写无效时,计数器减1if(write_n)begincounter<=#`DEL counter-1;end//如果读指针已指到最后一个位置,则返回起始位置if(rd_pointer == 15)rd_pointer <= #`DEL 4'b0;elserd_pointer <= #`DEL rd_pointer + 1;endif(~write_n)//检查fifo是否溢出(full)beginif(counter>=16)begin$display("\n ERROR at time %0t:", $time);$display("FIFO overflow\n");$stop;endif(read_n)//写有效,读无效时,计数器加1begincounter <= #`DEL counter + 1;endif(wr_pointer == 15)//如果写指针已指到最后一位,则返回起始位置wr_pointer <= #`DEL 4'b0;elsewr_pointer <= #`DEL wr_pointer + 1;endendendalways@(posedge clock)//本模块实现数据的读写功能beginif(~write_n)beginfifo_mem[wr_pointer] <= #`DEL in_data;endif(~read_n)beginout_data <= #`DEL fifo_mem[rd_pointer];//读取数据endendendmodule3.2测试文件本设计中为了让输入激励能够完整地测试出设计的功能,以证明FIFO确实能起到数据缓冲的作用,因而要测试当读写速度不一致的情况,即要仿真写速度大于读速度的情形以及读速度大于写速度的情形。

测试文件中:异步复位如下进行:reset_n=1; #20 reset_n=0; #20 reset_n=1;时钟信号如下产生:always #100 clock<=~clock;写入数据递增加1产生:in_data <= in_data + 1;而编写测试文件的核心问题在于:在同一文件中如何既能仿真写快与读的情形又能仿真读快于写的情形?对此,我们的想法:先让写快于读以达到满的状态(full=1),而后让读快于写以达到排空的状态(empty=1)由此我们定义了两个状态信号:fast_read: fast_read=1时以高速度进行读操作fast_write:fast_write=1时以高速度进行写操作又为了让读和写的速度产生差异,我们定义了一个周期计数信号cycle_count(其周期计数的值为......01010101......),它用来控制生成读写使能信号,控制方式为:当fast_write=1时,只要FIFO 非满就使写入,得到写使能信号;在非空的情况下,当cycle_count==1时才产生读使能信号;当fast_read=1时,只要FIFO非空就使读取,得到读使能信号;在非满的情况下,当cycle_count==1时才产生写使能信号;从而达到了让快的一方速度是慢的一方速度2倍的效果。

在解决了以上核心问题之后,具体的测试代码如下://DEFINES`define DEL 1 //时钟到输出的延时module test_sfifo(clock,reset_n,in_data,read_n,write_n,out_data,full,empty);//INPUTSinput [7:0]out_data;input empty,full;//OUTPUTSoutput clock,reset_n,read_n,write_n;output [7:0]in_data;//信号声明,这些信号应与测试模块中的端口信号一一对应reg clock;reg reset_n;reg[7:0] in_data; //输入到端口in_data的激励信号reg read_n;reg write_n;wire[7:0] out_data; //从端口out_data输出的信号wire full;wire empty ;//定义需要的一些信号integer fifo_count; //记录FIFO中的字节数,定义为实型整数reg[7:0] exp_data; //期望从FIFO输出的数据reg fast_read; //标志以高速度进行读操作reg fast_write; //标志以高速度进行写操作reg filled_flag; //标志FIFO已填满reg cycle_count; //周期计数,用来生成读写控制信号//对FIFO进行实例化sfifo Sfifo(.clock(clock),.reset_n(reset_n),.in_data(in_data),.read_n(read_n),.write_n(write_n),.out_data(out_data),.full(full),.empty(empty));initial beginin_data=0;exp_data=0;fifo_count=0;read_n=1;write_n=1;filled_flag=0;cycle_count=0;clock=1;//写速度大于读速度fast_write=1;fast_read=0;//复位reset_n=1;#20 reset_n=0;#20 reset_n=1;//初始情况下,FIFO应该为空,即empty==1且full==0if(empty!==1)begin$display("\nERROR at time %0t:",$time);$display("After reset,empty status not asserted\n");//报错$stop;endif(full!==0)begin$display("\nERROR at time %0t:",$time);$display("After reset,empty status not asserted\n");$stop;endend//生成时钟信号always #100 clock<=~clock;//对FIFO中的字节数进行计数。

相关文档
最新文档