基于FPGA的FIFO设计
基于FPGA的FIFO设计[20200406105602]
摘要
介绍了FIFO的几种结构类型以及它的工作原理,研究了如何通过FPGA内的双口RAM来实现多种设计FIFO的方案。本文主要集中在如何确定空/满标志信号,消除存在亚稳态电路的设计思路。数据信号在几个时钟域之间的数据传输,有可能会出现亚稳态导致数据出现无法想象的错误,为此在下文我研究了两种措施来减少亚稳态出现的概率:一是将数据信号经过同步器同步,二是将二进制转化为格雷码后对读写地址进行编码。
*查看完整论文请 +Q: 3 5 1 9 1 6 0 7 2
关键字:FIFO空/满标志格雷码亚稳态
目录
第一章 引言 5
1.1 FPGA简介 5
1.2 FIFO简介 5
1.3 存在的问题 6
1.4 研究思路 6
第二章 同步FIFO的设计 7
2.1 同步FIFO的组成 7
2.2 空满标志的判断 8
2.3 FIFO的工作原理 9
第三章 异步FIFO 12
3.1 设计困难点:亚稳态 12
3.2 亚稳态的解决办法 13
3.2.1 增加同步器 13
3.2.2 二进制转格雷码 14
3.3 异步FIFO的总体设计及组成部分 16
第四章 FIFO设计的应用 18
结语 19
参考文献 20
致谢 21
第一章 引言
1.1 FPGA简介
FPGA(现场可编辑门阵列)技术自20世纪80年代中期出现到至今,已经经历了20多年的发展,正得到越来越广泛的应用,它包括各个领域的数字系统,数字信号(DSP)系统的嵌入式系统都可能会用到FPGA器件。于此同时,FPGA也带来了电子设计技术翻天覆地的变革,现在系统的设计者可以直接在现场利用FPGA的可编程的特征,直接使用计算机上已经安装好的自动化设计软件,去完成数字系统产品的原型机设计、更新以及调试,这不仅仅可以让产品的面市时间缩短,而且也能及时适应或更新升级新的技术标准和协议.,增加了产品的使用寿命周期。同时在ASIC领域中FPGA也是一种半制定电路,因为它低廉的造价、方便修改错误和能够快速成品,因此在高速数据采集系统中的应用实例也越来越多。而基于FPGA的内部各时钟系统之间的数据串接问题也可以通过设计FIFO来轻松解决。
1.2 FIFO简介
FIFO(先入先出队列)这在电子电路方面是一种经典的顺序执行方法,同时也是一个数据缓冲器,它先输入第一个命令来完成操作,然后退出,紧接着根据第二个指令继续执行。与普通内存之间,他的区别是没有外部的读地址线,所以它是非常简单的,但缺点是只能依照顺序写入数据,不能随意写入,同时通过内部指针按顺序的读取数据,接着读写指针在各自的数据地址上会自动加一,所以它不能用象一般常存储器读出到指定的地址线或写入到一个指定的地址。 FIFO是一种应用广泛的电子组件,通常用于数据的缓存或异步信号,以适应于其中频率或具有相位差异的数据信号的传递与采集。也可应用于各种其他领域,包括高速缓存,高速大数据的采集和多处理器之间的通信接口等。
FPGA的设计技术要求是让设计师不断自我提升能力,除了自动化设计软件不断的改进和完善,更需要设计师拥有更多的设计知识,软件和硬件设计的技能和能力来处理面临实际突发问题的能力。这一次,我做了基于FIFO的FPGA设计与仿真,这是一个非常好的课题,我希望能通过这个设计不断提高和加强自己的设计能力,也希望能有在设计中对自己的能力有所突破。
1.3 存在的问题
在当前业界领域内设计的FIFO中,通常有两种方法来设计,一种是采用FPGA(可编程逻辑器件)来构建FIFO(如Xilinx,Inc),二是利用Verilog或VHDL等硬件描述语言来对FIFO进行详细的功能结构描述。在大多数的EDA软件中,对EDA的硬件语言的编译通常都是通过合成器来完成的,合成器将要描述的硬件描述语言转变为可实现的物理电路形式,因为FIFO是根基于RAM构造的,对FIFO描述的参考资料大多数都是基于数据存储和传输方面的,然而合成器对阵列的合成一般是将其转变为一个寄存器的结构,这就会带来一些缺陷,会使集成后的FIFO结构变得非常大,造成了大容量FIFO的设计将产生大面积的浪费,甚至有无法集成的危险。
1.4 研究思路
为了提高软件的利用效率和降低FIFO系统设计中的难度,本文采用了VHDL语言来描述FIFO的设计,这可以充分利用Xilinx 公司的ISE软件内FPGA 的系统资源, 我首先对FPGA做详细的了解,接着对FIFO的几种类型根据先后顺序逐一对其进行功能及设计原理的学习。
在对FIFO设计的思路上,我先对同步FIFO进行详细的摸索,然后设计一个完整的同步FIFO并进行时序仿真分析,再对异步FIFO的功能和设计原理进行了解,对异步FIFO的组成和其设计的难点进行了解,并最终尝试设计异步FIFO的VHDL代码。最后对FIFO的实际应用做一下了解,并做详细的说明
第二章 同步FIFO的设计
FIFO的分类有几种方法,其中一种就是根据FIFO所在的时钟域来分类,据此我们可以将它分类为以下2种:同步FIFO和异步FIFO。同步FIFO是指在同一个时钟周期信号上进行读写操作工作的FIFO,随着时钟上升沿的出现同时进行读和写操作。而异步FIFO是指读写操作的工作时钟域不是相同的一个时钟域,其读和写时钟域是互相独立且不受影响的。
2.1 同步FIFO的组成
图(1)FIFO原理框图
通过上图(1)可以看见,我将FIFO分为4大部分。
第一部分是一个具有独立读端口和独立写端口的双端口RAM存储器,为能够方便我们简化一些设计,我选用了能够存储少量信息的RAM存储器。
第二、第三部分分别是它的读和写两个端口各自拥有的两个计数器,他们可以各自产生位宽为log2(size)的互相独立的读以及写地址。为了方便接下来文章的叙述,我将这两个计数器称为读指针和写指针计数器。读指针指向下一个需要读取的地址,每次读取都会使读指针加1。而写指针则指向下一个将要写入的地址。每次写入都会使写指针加1。
第四部分是状态产生模块,它通过输入读写使能信号和时钟周期信号、复位信号等其他信号来判断产生空满状态信号,从而控制读写指针来达到控制FIFO的读写,它是FIFO的核心模块也是最重要的。因此如何判定并产生FIFO的空和满状态就成了FIFO设计的一个难关。为了能够保证设计出来的FIFO可以将正确的数据顺利的写入或读出,并且不发生溢处或读空这样错误的逻辑状态和现象,必须要使FIFO系统在内存写满的情况下,不能再进行写入操作。在内存读空的状态下不能够再进行读取操作。因此FIFO设计中一个极为重要的问题就是怎样判断并产生FIFO的满和空的状态标志。
2.2 空满标志的判断
图(1)中所示最下面的模块是状态模块。这个模块的目的就是给FIFO提供“空”与“满”信号。这些信号将会传达给外部电路FIFO一个信息,FIFO的读写操作已经进入临界状态:假如这个信息是满状态信号,则FIFO将变成只能进行写操作的特殊状态,它表示FIFO此时已经没有更多空间来存储更多的数据;如果是空状态信号,则FIFO将变成只能进行读操作的特殊状态,它表示FIFO此时没有更多的数据可以读出。状态产生模块还能提供给FIFO系统中发生满状态或空状态信号位置的数值。这都是通过指针的逻辑算术运算来达到目的的。
当然,实际的“满”或“空”状态判断与计算并不是特地为FIFO提供的。它被当做一个作报告机构提供给外部电路使用。然而,“满”和“空”状态信号在FIFO中是处于非常重要的地位的一个信号,它是为了能够帮助读取操作和写入操作实现他们各自的独立性而帮助运行访问管理数据的存取。这样做的意义不是将管理数据复制(或重读),而是可以通过控制FIFO指针的位置,来使读出和写入操作去改变指针数值。假使我们不改变处于临界状态指针状的态,而写入或读出数据,这是无法做到的,FIFO不可能在空内存的状态下读取数据也不可能在满内存的状态下写入数据。
摘要
介绍了FIFO的几种结构类型以及它的工作原理,研究了如何通过FPGA内的双口RAM来实现多种设计FIFO的方案。本文主要集中在如何确定空/满标志信号,消除存在亚稳态电路的设计思路。数据信号在几个时钟域之间的数据传输,有可能会出现亚稳态导致数据出现无法想象的错误,为此在下文我研究了两种措施来减少亚稳态出现的概率:一是将数据信号经过同步器同步,二是将二进制转化为格雷码后对读写地址进行编码。
*查看完整论文请 +Q: 3 5 1 9 1 6 0 7 2
关键字:FIFO空/满标志格雷码亚稳态
目录
第一章 引言 5
1.1 FPGA简介 5
1.2 FIFO简介 5
1.3 存在的问题 6
1.4 研究思路 6
第二章 同步FIFO的设计 7
2.1 同步FIFO的组成 7
2.2 空满标志的判断 8
2.3 FIFO的工作原理 9
第三章 异步FIFO 12
3.1 设计困难点:亚稳态 12
3.2 亚稳态的解决办法 13
3.2.1 增加同步器 13
3.2.2 二进制转格雷码 14
3.3 异步FIFO的总体设计及组成部分 16
第四章 FIFO设计的应用 18
结语 19
参考文献 20
致谢 21
第一章 引言
1.1 FPGA简介
FPGA(现场可编辑门阵列)技术自20世纪80年代中期出现到至今,已经经历了20多年的发展,正得到越来越广泛的应用,它包括各个领域的数字系统,数字信号(DSP)系统的嵌入式系统都可能会用到FPGA器件。于此同时,FPGA也带来了电子设计技术翻天覆地的变革,现在系统的设计者可以直接在现场利用FPGA的可编程的特征,直接使用计算机上已经安装好的自动化设计软件,去完成数字系统产品的原型机设计、更新以及调试,这不仅仅可以让产品的面市时间缩短,而且也能及时适应或更新升级新的技术标准和协议.,增加了产品的使用寿命周期。同时在ASIC领域中FPGA也是一种半制定电路,因为它低廉的造价、方便修改错误和能够快速成品,因此在高速数据采集系统中的应用实例也越来越多。而基于FPGA的内部各时钟系统之间的数据串接问题也可以通过设计FIFO来轻松解决。
1.2 FIFO简介
FIFO(先入先出队列)这在电子电路方面是一种经典的顺序执行方法,同时也是一个数据缓冲器,它先输入第一个命令来完成操作,然后退出,紧接着根据第二个指令继续执行。与普通内存之间,他的区别是没有外部的读地址线,所以它是非常简单的,但缺点是只能依照顺序写入数据,不能随意写入,同时通过内部指针按顺序的读取数据,接着读写指针在各自的数据地址上会自动加一,所以它不能用象一般常存储器读出到指定的地址线或写入到一个指定的地址。 FIFO是一种应用广泛的电子组件,通常用于数据的缓存或异步信号,以适应于其中频率或具有相位差异的数据信号的传递与采集。也可应用于各种其他领域,包括高速缓存,高速大数据的采集和多处理器之间的通信接口等。
FPGA的设计技术要求是让设计师不断自我提升能力,除了自动化设计软件不断的改进和完善,更需要设计师拥有更多的设计知识,软件和硬件设计的技能和能力来处理面临实际突发问题的能力。这一次,我做了基于FIFO的FPGA设计与仿真,这是一个非常好的课题,我希望能通过这个设计不断提高和加强自己的设计能力,也希望能有在设计中对自己的能力有所突破。
1.3 存在的问题
在当前业界领域内设计的FIFO中,通常有两种方法来设计,一种是采用FPGA(可编程逻辑器件)来构建FIFO(如Xilinx,Inc),二是利用Verilog或VHDL等硬件描述语言来对FIFO进行详细的功能结构描述。在大多数的EDA软件中,对EDA的硬件语言的编译通常都是通过合成器来完成的,合成器将要描述的硬件描述语言转变为可实现的物理电路形式,因为FIFO是根基于RAM构造的,对FIFO描述的参考资料大多数都是基于数据存储和传输方面的,然而合成器对阵列的合成一般是将其转变为一个寄存器的结构,这就会带来一些缺陷,会使集成后的FIFO结构变得非常大,造成了大容量FIFO的设计将产生大面积的浪费,甚至有无法集成的危险。
1.4 研究思路
为了提高软件的利用效率和降低FIFO系统设计中的难度,本文采用了VHDL语言来描述FIFO的设计,这可以充分利用Xilinx 公司的ISE软件内FPGA 的系统资源, 我首先对FPGA做详细的了解,接着对FIFO的几种类型根据先后顺序逐一对其进行功能及设计原理的学习。
在对FIFO设计的思路上,我先对同步FIFO进行详细的摸索,然后设计一个完整的同步FIFO并进行时序仿真分析,再对异步FIFO的功能和设计原理进行了解,对异步FIFO的组成和其设计的难点进行了解,并最终尝试设计异步FIFO的VHDL代码。最后对FIFO的实际应用做一下了解,并做详细的说明
第二章 同步FIFO的设计
FIFO的分类有几种方法,其中一种就是根据FIFO所在的时钟域来分类,据此我们可以将它分类为以下2种:同步FIFO和异步FIFO。同步FIFO是指在同一个时钟周期信号上进行读写操作工作的FIFO,随着时钟上升沿的出现同时进行读和写操作。而异步FIFO是指读写操作的工作时钟域不是相同的一个时钟域,其读和写时钟域是互相独立且不受影响的。
2.1 同步FIFO的组成
图(1)FIFO原理框图
通过上图(1)可以看见,我将FIFO分为4大部分。
第一部分是一个具有独立读端口和独立写端口的双端口RAM存储器,为能够方便我们简化一些设计,我选用了能够存储少量信息的RAM存储器。
第二、第三部分分别是它的读和写两个端口各自拥有的两个计数器,他们可以各自产生位宽为log2(size)的互相独立的读以及写地址。为了方便接下来文章的叙述,我将这两个计数器称为读指针和写指针计数器。读指针指向下一个需要读取的地址,每次读取都会使读指针加1。而写指针则指向下一个将要写入的地址。每次写入都会使写指针加1。
第四部分是状态产生模块,它通过输入读写使能信号和时钟周期信号、复位信号等其他信号来判断产生空满状态信号,从而控制读写指针来达到控制FIFO的读写,它是FIFO的核心模块也是最重要的。因此如何判定并产生FIFO的空和满状态就成了FIFO设计的一个难关。为了能够保证设计出来的FIFO可以将正确的数据顺利的写入或读出,并且不发生溢处或读空这样错误的逻辑状态和现象,必须要使FIFO系统在内存写满的情况下,不能再进行写入操作。在内存读空的状态下不能够再进行读取操作。因此FIFO设计中一个极为重要的问题就是怎样判断并产生FIFO的满和空的状态标志。
2.2 空满标志的判断
图(1)中所示最下面的模块是状态模块。这个模块的目的就是给FIFO提供“空”与“满”信号。这些信号将会传达给外部电路FIFO一个信息,FIFO的读写操作已经进入临界状态:假如这个信息是满状态信号,则FIFO将变成只能进行写操作的特殊状态,它表示FIFO此时已经没有更多空间来存储更多的数据;如果是空状态信号,则FIFO将变成只能进行读操作的特殊状态,它表示FIFO此时没有更多的数据可以读出。状态产生模块还能提供给FIFO系统中发生满状态或空状态信号位置的数值。这都是通过指针的逻辑算术运算来达到目的的。
当然,实际的“满”或“空”状态判断与计算并不是特地为FIFO提供的。它被当做一个作报告机构提供给外部电路使用。然而,“满”和“空”状态信号在FIFO中是处于非常重要的地位的一个信号,它是为了能够帮助读取操作和写入操作实现他们各自的独立性而帮助运行访问管理数据的存取。这样做的意义不是将管理数据复制(或重读),而是可以通过控制FIFO指针的位置,来使读出和写入操作去改变指针数值。假使我们不改变处于临界状态指针状的态,而写入或读出数据,这是无法做到的,FIFO不可能在空内存的状态下读取数据也不可能在满内存的状态下写入数据。
版权保护: 本文由 hbsrm.com编辑,转载请保留链接: www.hbsrm.com/dzxx/dzkxyjs/2371.html