同步FIFO的FPGA设计及仿真.docx
- 文档编号:30314683
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:49
- 大小:877.07KB
同步FIFO的FPGA设计及仿真.docx
《同步FIFO的FPGA设计及仿真.docx》由会员分享,可在线阅读,更多相关《同步FIFO的FPGA设计及仿真.docx(49页珍藏版)》请在冰豆网上搜索。
同步FIFO的FPGA设计及仿真
电子科技大学成都学院
UniversityofElectronicScienceandtechnologyChengduUniversity
本科毕业设计(论文)
同步FIFO的FPGA设计与仿真
学院名称
成都学院
专业名称
机械制造设计及其自动化
学生姓名
冯川
学号
2840840634
指导教师
钟耀霞
二〇一二年六月
同步FIFO的FPGA的设计及仿真
摘要:
为实现目标识别与跟踪的应用目的,在基于TMS320DM642的FIFO基础上拓展储存空间,提出一种FPGA实现SDRAM控制器的方法。
分析所用SDRAM的特点及工作原理,介绍FPGA中SDRAM控制器的组成及工作流程。
给出应用中的SDRAM的时序图,FPGA采用模块化设计,增强SDRAM控制器的通用性,更方便满足实际需求。
关键词:
FIFO;SDRAM控制器;FPGA;实时跟踪
DesignandSimulationofFIFOBasedonFPGA
Abstract:
Inordertoachievetheapplicationoftargetrecognitionandtracking,thememoryonthebasisofTMS320DM642FIFOisexpanded.SDRAMcontrolleroftheimplementationbasingontheFPGAisdesigned,Firstly,thecharacteristicsandprinciplesofSDRAMareanalyzed.ThencharacteristicsandprinciplesofSDRAMcontrollerandworkflowinFPGAareintroduced,TheapplicationintimeofSDRAMtiming,chartisgiven.InordertomeettheactualneedsmoreconvenientandenhancetheversatilityofSDRAMcontrollerFPGAusedmodulardesign
Keywords:
FIFO;SDRAMcontroller;FPGA;real-tracking
第1章引言
1.1选题背景
FIFO是一种常用于数据缓存的电路器件,可应用于包括高速数据采集、多处理器接口和通信中的高速缓冲等各种领域。
在某数据采集和处理系统中,需要通过同步FIFO来连接8位A/D和16位数据总线的MCU,但是由于目前同步FIFO器件的输入出数据总线宽度相等,不能满足这种应用,因此通常采用输入与输出数据总线宽度均为8位的同步FIFO作为它们之间的数据缓冲,并对MCU数据总线的高8位采用软件进行屏蔽,或是在同步FIFO外围增加数据锁存器及逻辑控制器件的方法解决。
为了提高效率和降低系统设计的难度,本文采用VHDL描述语言,充分利用Xilinx公司SpartanIIFPGA的系统资源,设计实现了一种非对称同步FIFO(输入与输出数据总线宽度不一致的同步FIFO),它不仅提供数据缓冲,而且能进行数据总线宽度的转换。
FPGA技术自20世纪80年代中期出现到至今,已经经历了20多年的发展,正得到越来越广泛的应用,它包括各个领域的数字系统,数字信号(DSP)系统的嵌入式系统都可能会用到FPGA器件。
于此同时,FPGA也引起电子设计技术深刻变革,FPGA的可编程特性使设计者在应用现场,利用计算机上自动化设计软件完成数字系统产品样机的设计,更新和调试,不仅缩短了产品的上市时间,而且也能适应技术标准和协议的更新和升级,延长了产品的寿命周期。
FPGA技术是要求设计者的设计能力不断的提高,除了在自动化设计软件的不断提高和完善,还要求设计者有更丰富的设计知识、软件和硬件的设计本领和面对实际问题的处理能力。
这次我所做的是同步FIFO的FPGA设计及仿真,这是一个具有实用价值的课题,我希望能在这次的设计中不断的提高自身的能力,也希望能在这次的设计中有所突破。
1.2研究目标和意义
研究同步FIFO的FPGA设计的目标是:
通过视频处理和视频图帧格式以及FIFO缓冲器,提出基于FPGA的视频图像处理系统设计
通过研究视同步FIFO的读写时钟频率相同、来源相同,这种FIFO的设计较为简单也快速,因为它避免了由于异步时钟逻辑产生的许多设计中具有挑战性的难题。
同步FIFO通常用于读写时钟相同的接口部分,这种FIFO相比较而言,逻辑较为简单,延时较小,传输数据的速度比较快,同步FIFO还具有深度可扩展性。
1.3研究思路
首先了解同步FIFO的功能及设计原理,同步VHDL语言描述、时序仿真机分析。
其次了解FPGA结构及工作原理,FPGA的逻辑阵列、嵌入式阵列、快速通道、I/O单元与专用输入端
最后利用FPGA实现同步FIFO设置,先对非对称同步同步FIFO进行设计,再了解FIFO的类型、FPGA的设计,再对FPGA内部软FIFO进行仿真。
第二章FIFO设计
1.什么是FIFO
FIFO是英文FirstInFirstOut的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
2.什么情况下用FIFO?
FIFO一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位100KSPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。
另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。
3.FIFO的一些重要参数
FIFO的宽度:
也就是英文资料里常看到的THEWIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。
FIFO的深度:
THEDEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。
如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。
在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。
在一个具体的应用中也不可能由一些参数算数精确的所需FIFO深度为多少,这在写速度大于读速度的理想状态下是可行的,但在实际中用到的FIFO深度往往要大于计算值。
一般来说根据电路的具体情况,在兼顾系统性能和FIFO成本的情况下估算一个大概的宽度和深度就可以了。
而对于写速度慢于读速度的应用,FIFO的深度要根据读出的数据结构和读出数据的由那些具体的要求来确定。
满标志:
FIFO已满或将要满时由FIFO的状态电路送出的一个信号,以阻止FIFO的写操作继续向FIFO中写数据而造成溢出(overflow)。
空标志:
FIFO已空或将要空时由FIFO的状态电路送出的一个信号,以阻止FIFO的读操作继续从FIFO中读出数据而造成无效数据的读出(underflow)。
读时钟:
读操作所遵循的时钟,在每个时钟沿来临时读数据。
写时钟:
写操作所遵循的时钟,在每个时钟沿来临时写数据。
读指针:
指向下一个读出地址。
读完后自动加1。
写指针:
指向下一个要写入的地址的,写完自动加1。
读写指针其实就是读写的地址,只不过这个地址不能任意选择,而是连续的。
4.FIFO的分类
根均FIFO工作的时钟域,可以将FIFO分为同步FIFO和异步FIFO。
同步FIFO是指读时钟和写时钟为同一个时钟。
在时钟沿来临时同时发生读写操作。
异步FIFO是指读写时钟不一致,读写时钟是互相独立的。
5.FIFO设计的难点
FIFO设计的难点在于怎样判断FIFO的空/满状态。
为了保证数据正确的写入或读出,而不发生益处或读空的状态出现,必须保证FIFO在满的情况下,不能进行写操作。
在空的状态下不能进行读操作。
怎样判断FIFO的满/空就成了FIFO设计的核心问题。
由于同步FIFO几乎很少用到,这里只描述异步FIFO的空/满标志产生问题。
在用到触发器的设计中,不可避免的会遇到亚稳态的问题。
在涉及到触发器的电路中,亚稳态无法彻底消除,只能想办法将其发生的概率将到最低。
其中的一个方法就是使用格雷码。
格雷码在相邻的两个码元之间只由一位变换(二进制码在很多情况下是很多码元在同时变化)。
这就会避免计数器与时钟同步的时候发生亚稳态现象。
但是格雷码有个缺点就是只能定义2^n的深度,而不能像二进制码那样随意的定义FIFO的深度,因为格雷码必须循环一个2^n,否则就不能保证两个相邻码元之间相差一位的条件,因此也就不是真正的各雷码了。
第二就是使用冗余的触发器,假设一个触发器发生亚稳态的概率为P,那么两个及联的触发器发生亚稳态的概率就为P的平方。
但这回导致延时的增加。
亚稳态的发生会使得FIFO出现错误,读/写时钟采样的地址指针会与真实的值之间不同,这就导致写入或读出的地址错误。
由于考虑延时的作用,空/满标志的产生并不一定出现在FIFO真的空/满时才出现。
可能FIFO还未空/满时就出现了空/满标志。
这并没有什么不好,只要保证FIFO不出现overfloworunderflow就OK了
2.1FIFO系统设计
FIFO系统由FGPA和SDRAM两部分组成。
其中,FGPA内部包含FIFO.、缓冲器、SDRAM控制器三个模块。
FIFO.的作用是将FIFO的状态转变成状态机的读、写信号。
若操作为向SDRAM写数据,则在FIFO已满时,FIFO.送出一个信号,以阻止写操作继续向FIFO中写数据而造成溢出;若操作为向SDRAM读数据,则在缓冲器已空时,FIFO.送出一个信号,以阻止读操作继续从FIFO中读数据而造成无效数据的读出。
FIFO的模块结构如图1所示。
SDRAM控制器内部包括:
初始化模块、模式寄存器、控制模块和状态机。
SDRAM的接口设计是极其关键的,可根据SDRAM内部操作状态之间的联系,通过状态机来实现接口设计。
初始化模块负责SDRAM的初始化,在上电和时钟稳定后等待100ms,至少执行一条空操作,然后对所有页执行预充电操作,使所有页处于空闲状态,接着向各页发出两条刷新操作指令,最后发出一个模式寄存器装载命令,使SDRAM有确定的状态进行读写操作。
模式寄存器可根据要求对SDRAM的突发长度、突发类型、CAS延时的时钟数、运行模式和写突发模式进行设置,确定SDRAM在读写操作时的工作状态。
模式寄存器M0~M2用于规定突发长度,可以为1,2,4,8。
M3用于规定突发类型,当M3=0时,突发类型是连续的;当M3=1时,突发类型是交错的。
M4~M6用于规定CAS延迟的时钟周期数,可以分为1,2,3。
M7,M8用于规定运行模式。
M9用于规定写突发模式,当M9=0时,按实际编程的突发长度存取;当M9=1时,按单个存取单元写入,但可按实际编程的突发长度读出。
SDRAM控制器的模块结构如图2所示
2.2FIFO的实现及控制
设计中采用FPGA来实现双通道数据的缓存和数据传输的逻辑控制。
Spartan3E是一款高性能低价格的可编程逻辑器件,具有丰富的逻辑单元和存储单元。
其内部的BlockRam可以配置为大小不同的各种类型存储器,如单口RAM、双口RAM和同步FIFO,其中FIFO更适合作为A/D采样数据高速写入的存储器。
FIFO存储器就像数据管道一样,数据从管道的一头流入、从另一头流出,先进入的数据先流出。
FIFO具有两套数据线而无地址线,可在其一端写操作而在另一端进行读操作,数据在其中顺序移动,从而达到很高的传输速度和效率,且由于省去了地址线,有利于PCB板布线。
采用FIFO构成高速A/D采样缓存时,由于转换速度较快,如果直接将ADC采样后的数据存储到FIFO中,对时序配置要求非常严格,如果两者时序关系配合不当,就会发生数据存储出错或者掉数。
利用FPGA可以方便地控制时序和数据传输,简单、可靠地实现采样和存储是选用FPGA的优点。
该数据采集系统中只采用了一个外部时钟源,直接输入到FPGA,经DCM分频后作为FIFO和ADC的时钟源。
在软件设计中,采用ISE开发环境开发FPGA时,调用CoreGenerator来构造FIFO,可以设置FIFO的参数,如深度和宽度;设置FIFO的各种标志和控制位,如空满、半满全满、半空全空、可编程满和可编程空等标志位;写使能、读使能等控制位,以便实现与高速A/D和DSP的逻辑接口。
FIFO的输入输出引脚如表所示:
其中WR_EN由DSP的GPIO口引出,控制数据是否写入到FIFO中,输出引脚中只用到了PROG_FULL即可与DSP进行数据传输。
FPGA的作用除了构造FIFO以实现数据通道复用外,还可以作为协处理器进行实时要求性高的数据预处理(如插值、取平均、FIR滤波等),以减少DSP处理的数据量。
设计中采用分布式算法的FIR滤波,首先对ADC转换后的数据进行FIR滤波,然后存入FIFO中以等待DSP的读取。
FPGA代替ASIC和DSP作为前端数字信号处理的运算,在规模、重量和功耗方面都有所降低,而且吞吐量更高,开发成本进一步缩小。
FPGA设计中,需提供外部闪存来存储FPGA的下载文件,上电后数据会自动下载到FPGA内部,以对FPGA进行配置。
FPGA有多种配置方式,包括主串、从串、主并、从并、SPI、BPI,以及JTAG等方式。
串行方式即逐位串行配置,接线简单,但速度比较慢,并行方式即8位同时传输,速度快,但接线复杂。
串行方式和并行方式都需要外加闪存作为配置文件的存储器。
设计中本文采用C6416的多通道缓存串行口(McBSP)以SPI方式对FPGA进行配置。
图1:
系统结构框图
1.3亚稳态
亚稳态是指出发前无法在某个规定的时间内达到一个可确定的状态。
当一个触发器进人亚稳态时,既无法预测单元输出电平,也无法预测什么时候输出才稳定在某个正确的电平上。
在这个稳定的期间,触发器输出一些中间级电平,或者可能处于震荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。
2.3.1什么是亚稳态
数字电路中的简单双稳态电路就是两个反相器首尾相连组成(加一些控制逻辑变成锁存器,触发器),然而并不像名字显示的,这种电路其实还有第三种半稳定态——就是当两个反相器都处于中间值的情况——这称之为亚稳态。
2.3.2亚稳态发生原因
在同步系统中,如果触发器的setuptime/holdtime不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端毛刺、震荡、固定的某一电压值,而不是等于数据输入端D的值。
这段之间成为决断时间(resolutiontime)。
经过resolutiontime之后Q端将稳定到0或1上,但是究竟是0还是1,这是随机的,与输入某一必然的关系。
2.3.3亚稳态的危害
由于输出在稳定下来之前可能是毛刺、震荡、固定的某一电压值,因此亚稳态除了导致逻辑误判之外,输出0~1之间的中间电压值还会使下一级产生亚稳态(即导致亚稳态的传播)。
逻辑误判有可能通过电路的特殊设计减轻危害,而亚稳态的传播则扩大了故障面,难以处理。
2.3.4亚稳态的解决方法
只要系统中有异步元件,亚稳态就是无法避免的,因此设计的电路首先要减少亚稳态导致错误的发生,其次要使系统对产生的错误不敏感。
前者用同步来实现,而后者根据不同的设计应用不同的处理方法。
用同步来减少亚稳态发生的机会的典型电路如图
左边为异步输入端,经过两级触发器同步,在右边输出将是同步的,而且该输出基本不存在亚稳态。
其原理是即第一个触发器的输出端存在亚稳态,经过一个CLK周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。
注意,这里说的是“基本”,也就是无法“根除”,那么如果第二触发器Q出现亚稳态会有什么后果呢?
后果的严重程度是由设计绝定的,如果系统对产生的错误不敏感,那么系统可能正常工作,或者经过短暂的异常之后可以恢复正常工作,如果设计上没有考虑如何降低系统对亚稳态的敏感程度,那么一旦出现亚稳态系统就可能崩溃。
2.4.关于FIFO的一点的思考
关于FIFO丢数据的问题,其实各位对同一个问题的理解有偏差,才造成了相互误解。
如果在理想状况下(时钟同步不回出现错码),FIFO由读写指针控制是不会丢数的,(这不是废话吗,现实中哪来的理想状况!
)且慢,我的意思是说丢数据并不是读写谁快谁慢造成的,在正确的设置空满标志算法的情况下,数据的overflow和underflow是不会发生的。
而往往现实中因为亚稳态的存在,才出现了丢数的情况,也就是说是只要读写时钟不同步,在采样的过程中采样出错,使得本该是0100的变成了1101等等,就会出现读写的错误,我们称其为丢数,其原因就是在时钟同步指针的时候出现亚稳态,由于二进制码加1的时候很多位同时变化,所以很容易出现亚稳态。
因此才用格雷码将此问题发生的概率比降到最小,其次用多余的触发器使其概率进一步降低,也就是说错误难免,但我们可以将其发生的概率降到最低,并且在出现错误时也不会错的态离谱(详见VijayA.Nebhrajani的《异步FIFO结构》第二篇)。
二进制码指针并非不好用,在前面也提到了它有自身的优势,由于通过设置握手信号,指针可以有多位同时变化,二进制指针每次移动可以跳跃过任意的长度,这样给FIFO的某些功能的实现带来了方便(例如,硬件直接控制FIFO从缓存的数据流中丢弃一个出错的包);而格雷码指针一般只能做递增或递减的移动。
设置握手信号虽然可以保证指针不出错,但这样你来我往的经过三四个回合才能开始传数据,所以对于高速的场合就不适用了。
第三章FPGA结构及工作原理
3.1什么是FPGA
FPGA采用了逻辑单元阵列LCFPGA是英文FieldProgrammableGateArray的缩写,即现场可编程门阵列,它是在PAL、GAL、PLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
A(LogicCellArray)这样一个新概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
FPGA的基本特点主要有:
1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。
2)FPGA可做其它全定制或半定制ASIC电路的中试样片。
3)FPGA内部有丰富的触发器和I/O引脚。
4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
3.1.1逻辑阵列
逻辑阵列由一系列逻辑阵列块(LAB)构成。
每个LAB由八个逻辑单元(LE)和一些局部互连组成。
每个LAB相当于96个可用逻辑门,可用构成一个中规模的逻辑块,如8位计数器、地址译码器或状态机等。
也可用将多个LAB组合起来构成一个更大规模的逻辑块。
逻辑阵列LAB(LogicArrayBlock)是由一系列的相邻LE构成的。
每个LAB包括八个LE相连的进位链和级联链,LAB控制信号与LAB局部互连。
LAB构成了开发软件的“粗粒度”结构,有利于EDA软件进行布局线,优化器件的利用,提高可能性。
逻辑单元LE(LogicElement)是FLEX10K/ACEX1K结构中最小单元,它能有效的实现逻辑功能。
每个LE包括一个4输入的LUT、一个带有使能的可编程触发器。
一个进位链和一个级联链。
每个LE有两个输出,分别可以驱动局部互连和快速通道(FsatTrack)互连。
LE中的LUT是一种函数发生器,它能实现4输入的任意逻辑函数。
LR中的可编程触发器可设置成D、T、JK或RS触发器。
该寄存器的时钟、清零和置位信号可由全局信号、通用I/O引脚或任何内部逻辑驱动。
对于组合逻辑的实现,可将触发器旁路,LUT输出作为LE的输出。
LE有两个驱动内部互连的输出信号。
一个用于驱动局部互连,另一个用于驱动性和列的快速通道的互连输出。
这两个输出信号可以单独控制。
可以实现在一个LE中,LUT驱动一个输出,而寄存器驱动另一个输出。
因为在一个LE中触发器和LUT能够用来完成不相关的功能,因而能够提高LE的资源利用率。
在FLEX10K/ACEX1K结构中还提供了两种专用高速数据通道:
进位链(Carry-In)和级联链(Cascade-In),用于连接相邻的LE,但不占用局部互连通路。
进位链提供LE之间快速的向前进功能。
来自低位的进位信号进位链向前送到高位,同时馈入LUT和进位链的下一段。
这一特点使得FLEX10K/ACEX1K结构能够实现高速设计器、加法器和宽位的比较器。
级联链可以用来实现多输入(Wide-Input)逻辑函数,而且延时很小。
相邻的LUT用来并行地完成部分逻辑功能,级联链把中间结果串接起来。
级联链可以使用逻辑“与”或者逻辑“或”来连接相邻LE的输出。
每增加一个LE,逻辑的有效输入宽度增加4个,其延迟会增加约0.7ns。
级联链和进位链可以连接同一个LAB中的所有LE和同一行中所有LAB,但是进位链和级联链的大量使用会限制逻辑布线的灵活性,会导致资源的浪费,因此,使用进位链和级联链限于速度有要求的关键部分设计。
进位链和级联链都可由开发软件在进行设计处理时自动生成。
FLEX10K/ACEX1K的LE共有4种工作模式:
正常模式、运算模式、加减法计数模式和可清零计数模式。
每种模式中,LE的7个可用输入信号被连接到不同的位置,以实现所要求的逻辑功能。
这7个输入信号时来自LAB局部互连的4个数据输入,来自可编程寄存器的反馈信号以及一个LE的进位输入和级联输入。
另外加到LE的其余3个输入为寄存器提供时钟、清零和置位信号。
在所有的4种模式下,FLEX10K/ACEX1K结构还为寄存器提供了一个同步时钟使能端,利于实现全同步设计
3.1.2嵌入式阵列
嵌入式阵列由一系列嵌入式阵列块(EAB)构成。
在要实现存储器功能时,每个EAB可提供2048个存储位,用来构成RAM、ROM、FIFO、和双口RAM。
在实现器、微控制器、状态机及复杂逻辑时,每个EAB可贡献100到600个门,EAB可单独使用,也可组合使用。
如果需要,一个器件中所有的EAB可级联成一个单一RAM,EAB级联形成的RAM块不影响时序。
3.1.3快速通道
在FLEX10K/ACEX1K结构中,LE和器件I/O引脚之间的连接时通过快速通
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 同步 FIFO FPGA 设计 仿真