同步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_n0时,可以读出数据; write_n 写使能端,当write_n0时,可以写入数据; clock 时钟信号, 在时钟的正边沿进行采样; reset_n 复位信号,当reset_n0时,计数器及读写都被清零(即读写地址指针都指向0) 输出out_data 输出数据端口,位宽为8位;; fullFIFO状态信号,当full1时,表明该FIFO存储器已经写满; emptyFIFO状态信号,当empty1时,表明该FIFO存储器已经读空; FIFO满的状况下,不能再写,写指针不能加1; FIFO空的状况下,不能再读,读指针不能加1; 2 设计思想 由以上的系统框图和端口分析,我们将设计的重点定在了解决以下三个核心问题上 1. FIFO的存储体如何表示 2. 如何实现“先进先出”的逻辑功能 3. 如何知道FIFO内部运用了多少,是满是空 针对以上三个问题,我们所实行的方法是 1. 定义一个168的二维数组来表示FIFO的存储体。 2. 为了实现“先进先出”的逻辑功能,我们定义了“读指针”及“写指针”,分别用来指示读操作与写操作的位置。 3. 为了表示FIFO是满还是空,我们定义了一个计数器,用以标记FIFO已运用了多少空间。 在解决了以上三个重点问题以后,针对同步FIFO的逻辑功能,我们拟定了以下一个结构图,如图2所示 图2 FIFO设计结构图 3.源码与注释 3.1源代码 我们在完成了之前两步的打算工作之后,进行了源码的设计,详细的代码如下 define DEL 1 //为了使仿真接近真实情形,我们定义了从时钟到输出的延时 module sfifoclock,reset_n,in_data,read_n,write_n,out_data,full,empty; //输入信号 clock; //输入时钟 reset_n; //复位信号,低有效 [70] in_data; //输入的数据 read_n; //读限制信号,低有效 write_n; //写限制信号,低有效 //输出信号 output[70] out_data; //FIFO的输出数据 output full; //FIFO满标记信号 output empty; //FIFO空标记信号 //信号声明 reg [70] out_data; reg [70] fifo_mem[150]; //FIFO存储体即8*16存储器,用数组表示 reg [40] counter; //计数器表示FIFO中已用了多少 reg [30] rd_pointer; //FIFO读指针,指向下次读操作的地址 reg [30] wr_pointer; //FIFO读指针,指向下次读操作的地址 //赋值声明,给出满标记与空标记的实现 assign DEL fullcounter161b11b0; assign DEL emptycounter01b11b0; //本模块实现读指针、写指针和计数器的功能 alwaysposedge clock or negedge reset_n begin ifreset_n begin //计数器及读、写指针清零 rd_pointerDEL 4b0; wr_pointerDEL 4b0; counterDEL 5b0; end else begin ifread_n begin //假如FIFO为空,不能