同步FIFO的设计与实现
同步缓冲器(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所示 图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); //输入信号 clock; //输入时钟 reset_n; //复位信号,低有效 [7:0] in_data; //输入的数据 read_n; //读限制信号,低有效 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) begin if(~reset_n) begin //计数器及读、写指针清零 rd_pointer<=#`DEL 4 b0; wr_pointer<=#`DEL 4 b0; counter<=#`DEL 5 b0; end else begin if(~read_n) begin //假如FIFO为空,不能