课程设计报告
高速异步FIFO设计
高速异步FIFO设计
目录
技术规范 ......................................................................................................................... 3 FIFO的功能描述 .................................................................................................................... 3 FIFO的引脚定义 .................................................................................................................... 3 总体方案设计 ................................................................................................................. 4 电路设计方框图 .................................................................................................................... 4 电路设计连接图 .................................................................................................................... 4 电路模块及其功能简介 ........................................................................................................ 4 电路设计思想 ........................................................................................................................ 5 仿真方案及其仿真激励源代码 ........................................................................................ 8 仿真方案 ................................................................................................................................ 8 仿真激励源代码 .................................................................................................................... 8 电路描述代码 ................................................................................................................. 9 功能仿真 ....................................................................................................................... 14 分块仿真 .............................................................................................................................. 14 双口RAM仿真 ................................................................................................................ 14 读数据控制电路仿真 ...................................................................................................... 15 写数据控制电路仿真 ...................................................................................................... 16 锁存器电路仿真 .............................................................................................................. 16 满空标志电路仿真 .......................................................................................................... 17 总体仿真 .............................................................................................................................. 18 综合与布局布线 ............................................................................................................ 18 综合布局布线报告 .............................................................................................................. 19 报告数据分析 ...................................................................................................................... 19 时序仿真 ....................................................................................................................... 19 实验心得 ....................................................................................................................... 20
2
高速异步FIFO设计
一、技术规范
1、 FIFO的功能描述
高速异步FIFO(First In First out)深度为256,数据宽度为8位(最大可存储256byte),可实时给出FIFO的满空标志,并可实现数据的平滑输出,其写时钟为带间隔的100MHz,读时钟为5MHz,从而实现了FIFO的异步数据传输。
2、 FIFO的应交定义
(1) 总体引脚对照表: 引脚符号 Data_in[7:0] Data_out[7:0] Clk_rd Clk_wr Rst En_rd En_wr Empty Full 引脚符号 Data_in[7:0] Data_out[7:0] Addr_wr[7:0] Addr_rd[7:0] 引脚符号 Clk_wr Rst En_wr Addr_wr[7:0] 引脚符号 Clk_rd Rst En_rd Addr_rd[7:0] 引脚符号 Clk Rst Data_in[7:0]
引脚说明 数据输入引脚,数据位为8位 数据输出引脚,数据位为8位 读数据时钟 写数据时钟 复位信号(低电平复位有效) 读数据使能信号(高电平使能) 写数据使能信号(高电平使能) FIFO空标志(高电平时为空) FIFO满标志(高电平时为满) 引脚说明 数据输入引脚,数据位为8位 数据输出引脚,数据位为8位 RAM的写地址指针,地址位宽为8位 RAM的读地址指针,地址位宽为8位 引脚说明 写数据时钟 写数据控制器使能信号(高电平使能) 写地址指针,位宽为8位 引脚说明 读数据时钟 读数据控制器使能信号(高电平使能) 读地址指针,位宽为8位 引脚说明 时钟信号 复位信号(低电平复位有效) 数据输入,位宽为8位 3
引脚类型 输入 输出 输入 输入 输入 输入 输入 输出 输出 引脚类型 输入 输出 输入 输入 引脚类型 输入 输入 输出 引脚类型 输入 输入 输出 引脚类型 输入 输入 输入 (2) 双口RAM引脚对照表: (3) 写数据控制器引脚对照表:
写数据控制器复位信号(低电平复位有效) 输入 (4) 读数据控制器引脚对照表:
读数据控制器复位信号(低电平复位有效) 输入 (5) 锁存器器引脚对照表: 高速异步FIFO设计
Data_out[7:0] 引脚符号 Rst Addr_wred[7:0] Addr_rded[7:0] Addr_wr[7:0] Addr_rd[7:0] Empty Full 输出上一个clk时输入的数据,位宽为8位 输出 引脚说明 复位信号(低电平复位有效) 上一个clk时的写地址指针,位宽为8位 上一个clk时的读地址指针,位宽为8位 写地址指针,位宽为8位 读地址指针,位宽为8位 FIFO空标志(高电平时为空) FIFO满标志(高电平时为满) 引脚类型 输入 输入 输入 输入 输入 输出 输出 (6) 满空标志模块引脚对照表: 二、 总体设计方案
1、
电路设计方框图(如图2.1所示)
图2.1
2、 3、
电路设计连接图(如图2.2所示) 电路模块及其功能简介
双口256*8bit的RAM:用于存储FIFO的缓冲数据
写数据控制器:用于控制FIFO中数据的写时序操作 FIFO 读数据控制器:用于控制FIFO数据中的读时序操作 锁存器: 用于锁存上一个clock时的读写地址指针 FIFO满空标志电路:用于实时标志FIFO的满空状态
4
高速异步FIFO设计
4、 电路设计思想
设计高速异步FIFO,首先,考虑如何实现数据的先进先出问题;为了解决这个问题,设计中就必须有一个可用于随机存取的存储器,又要实现异步,即异步读写,所以本设计中存储器选择采用双口RAM;其次,考虑如何实现在不同时钟下,实现读数据和写数据,在设计中,使用独立电路模块,分别控制读写操作;最后,一个要考虑的问题也是本设计中的难点,即对于高速异步FIFO来说,如何高速、实时判断FIFO的满和空。要实现高速,就不可以直接将读写指针做加减等运算,这样直接降低了FIFO的读取速度,最好使用比较方式,这样可以确保在一个clk内完成比较。根据数字追击的原理,当读写指针相等的时候,把上一个clk的读写指针和当前读写指针做比较,判断出是读指针追上写指针(FIFO空),还是写指针追上读指针(FIFO满)。
以下是设计中各电路模块的具体实现方法:
(1) 双口RAM
写数据时:当输入写地址指针发生变化时,将写地址指针对应地址的数据更
新为当前数据线上的数据;
读数据时:当输入读地址指针发生变化时,将读地址指针对应地址的数据输
出到当前数据线上;
(2) 写数据控制器
当复位信号为高电平并且读数据使能信号为高电平时:在每个输入时钟
的上升沿,读地址指针加一,并将读地址指针输出;
当复位信号为低电平或者读数据使能信号为低电平时:读地址指针初始化为0;
(3) 读数据控制器
当复位信号为高电平并且写数据使能信号为高电平时:在每个输入时钟
的上升沿,写地址指针加一,并将写地址指针输出;
当复位信号为低电平或者写数据使能信号为低电平时:写地址指针初始化为0;
(4) 锁存器
复位信号有效时:将地址指针和锁存单元初始化为0;
复位信号无效时:读入此时地址总线上的数据,并输出上一个clk时地址总
线上的数据;
(5) FIFO满空标志电路
复位信号有效时: 将满空标志分别初始化为0、1(对于满标志:‘0’表示
未满,‘1’表示满;对于空标志:‘0’表示为空,‘1’表示空);
复位信号无效时: 判断读地址指针和写地址指针是否相等,如果相等怎采
用下列方案解决如何实时显示满空标志:
解决方案:(数字追击)
5
高速异步FIFO设计
RAM的地址指针是从0~255,当地址指针指向最后一个地址,也就是255时,下一时刻就会指向0地址。也就是说,地址指针是从0~255~0~255这样的一个0~255循环。那么对于双口异步RAM来说,读写指针就会在某一时刻相等,而相等时又会有两种情况:1)读指针追上写指针,则RAM存储区域已空;2)写指针追上读指针,则RAM存储区已满;
两个数相等的之前,只有最后一位相差1。根据对二进制数据的分析,可得出下面的一种比较方法:
例如:第N-1个clk时:写指针为0x1011,读指针为0x1010 第N个clk时: 写指针为0x1011,读指针为0x1011
从上面的数据中可看出:在第N个clk时候,读写指针相等,所以要去判断是读指针追上写指针还是写指针追上读指针? 判断方法:
取出第N-1个clk时候读写指针二进制值的最后一位和取出第N个clk时候读写指针二进制值的最后一位分别为: a. N N-1 wr 1 0 rd 1 1
此时可看出:写地址追上了读地址,所以此时full=1
表达式为:full = ~(wr_N ^ rd_N-1) && (rd_N ^ wr_N-1)
b. N N-1 rd 1 0 wr 1 1
此时可看出:写地址追上了读地址,所以此时empty=1
表达式为:empty = ~ (rd_N ^ wr_N-1) && (wr_N ^ rd_N-1)
6
高速异步FIFO设计
图2.2 7
高速异步FIFO设计
三、 仿真方案及仿真激励源代码
1、
仿真方案
高速异步FIFO可实现不同时钟下的异步高速读写操作。所以验证方案也是针对于
读写时钟可能出现的三种情况对高速异步FIFO的性能进行仿真测试:
(1) 写时钟比读时钟频率高
设定写时钟的频率为读时钟的20倍,读时钟每20ns翻转一次,写时钟每1ns
翻转一次;写入的数据为0~255,按顺序写入,读写使能全部有效,并通过波形判断输出地址和满空标志;
(2) 读时钟比写时钟频率高
设定读时钟的频率为写时钟的2倍,读时钟每1ns翻转一次,写时钟每2ns翻
转一次;写入的数据为0~255,按顺序写入;读使能在写入20个数据后开始有效,写使能始终有效,并通过波形判断输出地址和满空标志;
(3) 读写时钟频率相同
设定读时钟与写时钟的频率相等,读写时钟每2ns翻转一次;写入的数据为
0~255,按顺序写入;读使能在写入1个数据后开始使能,写使能时钟有效,并通过波形判断输出地址和满空标志;
2、 仿真激励源代码
设计要求中写时钟为100MHz,读时钟为5MHz,所以可应用仿真方案一,即写时钟为读时钟的20倍,其仿真代码如下所示:
module stimulus; //仿真激励模块
reg [7:0] data_in;
reg clk_wr,clk_rd,en_wr,en_rd; reg rst;
wire[7:0] data_out; wire empty,full;
//实例化fifo模块
fifo f(data_in,
clk_wr, clk_rd, en_wr, en_rd, rst, data_out, empty, full );
8
高速异步FIFO设计
initial begin
clk_wr = 1; //初始化写时钟为高电平 clk_rd = 0; //初始化读时钟为低电平 en_wr = 0; //初始化写数据使能无效 en_rd = 0; //初始化读数据使能无效 rst = 0; //初始化复位信号低电平复位 data_in = 8'h01; //初始化数据为8‘h01; #2
rst = 1; //高电平不复位 #3
en_wr = 1; //写数据使能有效 en_rd = 1; //读数据使能有效 end
always #1 clk_wr = ~clk_wr; //设定写时钟每1ns翻转一次
always #20 clk_rd = ~clk_rd; //设定读时钟每20ns翻转一次
always #2 data_in = data_in + 1; //设定每2ns输入数据更新一次
endmodule
四、 电路描述代码 源代码.doc 五、 功能仿真
1、 分块仿真
(1) 双口RAM仿真
1) 异步仿真(写时钟比读时钟快)
9
高速异步FIFO设计
图5.1.1
仿真波形分析:(如图5.1.1)
写时钟比读时钟快,当写地址指针发生变化时,将写数据线上的地址写入到写地址指针所指向的地址中;当读地址指针发生变化时,将读地址指针所指向的地址中的数据输出到读数据线上;从图5.1.1这个仿真波形中可以看出,当写时钟比读时钟快时,双口RAM读写数据完全正确,不存在数据丢失;
2) 异步仿真(读时钟比写时钟快)
图5.1.2
仿真波形分析:(如图5.1.2)
仿真波形图从i=8开始,读时钟比写时钟快,当写地址指针发生变化时,将写数据线上的地址写入到写地址指针所指向的地址中;当读地址指针发生变化时,将读地址指针所指向的地址中的数据输出到读数据线上;从图5.1.2这个仿真波形中可以看出,当读时钟比写时钟快时,双口RAM读写数据完全正确,不存在数据丢失; 3) 同步仿真(读写时钟同步)
图5.1.3
仿真波形分析:(如图5.1.3)
读写时钟同步时,当写地址指针发生变化时,将写数据线上的地址写入到写地址指针所指向的地址中;当读地址指针发生变化时,将读地址指针所指向的地址中的数据输出到读数据线上;从图5.1.3这个仿真波形中可以看出,当读写时钟同步时,双口RAM读写数据完全正确,不存在数据丢失;
(2) 读数据控制电路仿真
仿真波形分析:(如图5.2)
1) 当rst复位信号为低电平复位并且读数据使能位不使能时,读地址指针初
10
高速异步FIFO设计
始化为首地址,即8‘h00,读数据时钟的翻转不影响读地址指针的变化; 2) 当rst复位信号为高电平不复位,读数据使能位使能时,读地址指针仍然
初始化为首地址(8‘h00),读数据时钟的翻转不影响读地址指针的变化; 3) 当rst复位信号高电平不复位并且读数据使能位是能使时,读地址指针在
每个读数据时钟上升沿时自加一,并将结果输出到读地址指针输出端口;
图5.2
(3) 写数据控制电路仿真
仿真波形分析:(如图5.3)
1) 当rst复位信号为低电平复位并且写数据使能位不使能时,写地址指针初
始化为首地址,即8‘h00,写数据时钟的翻转不影响读地址指针的变化; 2) 当rst复位信号为高电平不复位,写数据使能位使能时,写地址指针仍然
初始化为首地址(8‘h00),写数据时钟的翻转不影响写地址指针的变化; 3) 当rst复位信号高电平不复位并且写数据使能位是能使时,写地址指针在
每个读数据时钟的上升沿时自加一,并将结果输出到读地址指针的输出端口;
11
高速异步FIFO设计
图5.3
(4) 锁存器电路仿真
仿真波形分析:(如图5.4)
1) 当rst复位信号为低电平复位时,初始化缓冲单元和锁存器输出为8‘h00,
锁存器的的驱动时钟不影响锁存器的输出;
2) 当rst复位信号为高电平不复位时,在锁存器驱动时钟的每个上升沿,锁存
器输出上一个驱动时钟时输入端输入的数据;
图5.4
3) 满空标志电路仿真
仿真波形分析:(如图5.5)
1) 当rst复位信号为低电平复位时,所有的地址指针输入无效;
2) 当rst复位信号为高电平不复位时,a.读地址指针与写地址指针相等时,判
断出读地址指针追上写地址指针,空标志(empty)为高电平;b.读地址指针与写地址指针相等时,判断出写地址指针追上读地址指针,满标志(full)为高电平;c.读地址指针与写地址指针不相等时,满空标志都为低电平;(其中wred,rded 分别为上一个clk时的写地址指针和读地址指针,wr,rd分别为当前clk时的写地址指针和读地址指针)
12
高速异步FIFO设计
图5.5
2、
总体仿真
图5.6
(1) 仿真波形分析:(如图5.6)
1) 不复位并且写使能有效时,在写时钟的上升沿将当前写数据线上的
00000101写入到首地址中;
2) 不复位并且读使能有效时,在读时钟的上升沿将首地址中的00000101读
出;
13
高速异步FIFO设计
如图5.7
(2) 波形仿真分析
读写地址相同时,判断出是写地址指针追上读地址指针,所以满标志为高电平;
六、 综合与布局布线
1、
综合布局布线报告:(如图6.1)
图6.1
2、 报告数据分析
分析报告可知:
1) 本次综合选用的时Altera公司生产的Cyclone EP1C6Q240C6型号的FPGA芯片; 2) 该芯片中共包含5980个逻辑单元(LEs),而在本设计中总共使用了3723个逻
辑单元,占总资源的62%;
3) 该芯片中共包含185个引脚资源,设计中分配了23个引脚作为输入输出,占引
脚资源的12%;
4) 锁相环和内部存储器是没有被使用的;
七、 时序仿真
14
高速异步FIFO设计
图7.1
时序仿真波形分析:
数据线上的数据在每个写时钟的上升沿后,被写入到FIFO中;写入到FIFO中的数据
在每个读时钟的上升沿后,被输出,基本上可以实现数据的平滑输出;这段仿真波形中,还可以看到满标志,表示满标志对应的时刻,数据已经写满FIFO;
八、 实验心得
本次实验中,我学到了很多,比如在设计FIFO的过程中,既要考虑数据的平滑
输出,也要考虑如何高速实现异步FIFO等问题。这一系列的思考,需要去学习数字电路,计算机原理,Verilog等方面的知识,更重要的是必须有一个良好的数学功底,这样才会更好的分析逻辑上的一些问题,例如本设计中涉及到的数字追击问题。在设计过程中,还要考虑具体的实现方式,和所设计的FIFO的工作过程,其中最重要的就是时序分析问题。在此我曾遇到一个问题,就是所哟的模块全部连接到顶层模块,但是满空标志却始终没有产生满空信号,最后通过对电路时序的认真分析,最终发现有一个时钟信号连接是错误的,改正后,仿真完全正确。
通过这次实验,深深地体会到干什么事情都要认认真真的去专注于每一个细节,有时候就是因为忽视了某些细节,从而导致了极大的失败;还有一个体会就是知识之间有着很大的联系,所以再做一个东西的时候,一定要大胆的吧所学的知识应用进去,这样思维才会有创新性!
15
因篇幅问题不能全部显示,请点此查看更多更全内容