《同步FIFO设计(5页).doc》由会员分享,可在线阅读,更多相关《同步FIFO设计(5页).doc(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-第 1 页同步同步 FIFO 设计设计-第 2 页同步 fifo 设计1功能定义:用 16*8 RAM 实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入 FIFO,并由读使能控制 FIFO 中数据的读出。写入和读出的操作由时钟的上升沿触发。当 FIFO 的数据满和空的时候分别设置相应的高电平加以指示。2顶层信号定义:信号名称I/O功能描述源/目标 备注RstIn全局复位(低有效)管脚ClkIn全局时钟管脚频率 10Mhz;占空比:50%Wr_enIn低有效写使能管脚Rd_enIn低有效读使能管脚Data_in7:0In数据输入端管脚Data_out7:0 Out数据输出
2、端管脚EmptyOut空指示信号管脚为高时表示 fifo 空FullOut满指示信号管脚为高时表示 fifo 满3顶层模块划分及功能实现该同步 fifo 可划分为如下四个模块,如图 1 所示:存储器模块(RAM)用于存放及输出数据;读地址模块(rd_addr)用于读地址的产生;写地址模块(wr_addr)用于写地址的产生标志模块(flag_gen)-用于产生 FIFO 当前空满状态。图 1 同步 FIFO 的模块划分1)RAM 模块本设计中的 FIFO 采用采用 16*8 双口 RAM,以循环读写的方式实现;l 根据 rd_addr_gen 模块产生的读地址,在读使能(rd_en)为高电平的时
3、候,将 RAM 中 rd_addr3:0地址中的对应单元的数据在时钟上升沿到来的时候,读出到 data_out7:0中。l根 据 wr_addr_gen 产 生 的 写 地 址 和 在 写 使 能(wr_en)为 高 电 平 的 时 候,将 输 入 数 据(data_in7:0)在时钟上升沿到来的时候,写入 wr_addr3:0地址对应的单元。以下是 ram 程序:module ram(clk,wr_en,rd_en,data_in,wr_addr,rd_addr,data_out);input clk;input rd_en;input wr_en;input7:0data_in;input
4、3:0wr_addr;input3:0rd_addr;output7:0data_out;reg 7:0data_out;parameter max_count=5b10000;reg 7:0fifo0:max_count;/读操作-第 3 页always (posedge clk)beginif(rd_en)data_out=fiford_addr;end/写操作always (posedge clk)beginif(wr_en)fifowr_addr=data_in;endendmodule2)wr_addr_gen:该模块用于产生 FIFO 写数据时所用的地址。由于 16 个 RAM 单
5、元可以用 4 位地址线寻址。本模块用 4 位计数器(wr_addr3:0)实现写地址的产生。l 在复位时(rst=0),写地址值为 0。l 如果 FIFO 未满(full)且有写使能(wr_en)有效,则 wr_addr3:0加 1;否则不变。module wr_addr_gen(clk,rst,full,wr_en,wr_addr);input clk,rst;input full;input wr_en;output 3:0wr_addr;reg 3:0wr_addr;always (posedge clk or negedge rst)beginif(!rst)wr_addr=4b000
6、0;else if(full=0&wr_en=1)wr_addr=wr_addr+1;elsewr_addr=4b0000;endendmodule3)rd_addr_gen:该模块用于产生 FIFO 读数据时所用的地址。由于 16 个 RAM 单元可以用 4 位地址线寻址。本模块用 4 位计数器(rd_addr3:0)实现读地址的产生。l 在复位时(rst=0),读地址值为 0。l 如果 FIFO 未空(empty)且有读使能(rd_en)有效,则 rd_addr3:0加 1;否则不变。module rd_addr_gen(clk,rst,emptyp,rd_en,rd_addr);inpu
7、t clk,rst;input emptyp;input rd_en;output 3:0rd_addr;reg 3:0rd_addr;-第 4 页always (posedge clk or negedge rst)beginif(!rst)rd_addr=4b0000;else if(emptyp=0&rd_en=1)rd_addr=rd_addr+1;elserd_addr=4b0000;endendmodule4)flag_gen 模块flag_gen 模块产生 FIFO 空满标志。本模块设计并不用读写地址判定 FIFO 是否空满。设计一个计数器,该计数器(pt_cnt)用于指示当前周
8、期中 FIFO 中数据的个数。由于 FIFO 中最多只有 16 个数据,因此采用 5 位计数器来指示 FIFO 中数据个数。具体计算如下:l 复位的时候,pt_cnt=0;l 如果 wr_en 和 rd_en 同时有效的时候,pt_cnt 不加也不减;表示同时对 FIFO 进行读写操作的时候,FIFO 中的数据个数不变。l 如果 wr_en 有效且 full=0,则 pt_cont+1;表示写操作且 FIFO 未满时候,FIFO 中的数据个数增加了 1;l 如果 rd_en 有效且 empty=0,则 pt_cont-1;表示读操作且 FIFO 未满时候,FIFO 中的数据个数减少了 1;l
9、如果 pt_cnt=0 的时候,表示 FIFO 空,需要设置 empty=1;如果 pt_cnt=16 的时候,表示 FIFO 现在已经满,需要设置 full=1。module flag_gen(clk,rst,full,emptyp,wr_en,rd_en);input clk,rst;input rd_en;input wr_en;output full,emptyp;reg full,emptyp;reg4:0count;parameter max_count=5b01111;always (posedge clk or negedge rst)beginif(!rst)count=0;elsebegincase(wr_en,rd_en)2b00:count=count;2b01:if(count!=5b00000)count=count-1;2b10:if(count!=max_count)-第 5 页count=count+1;2b11:count=count;endcaseendendalways(count)beginif(count=5b00000)emptyp=1;elseemptyp=0;endalways(count)beginif(count=max_count)full=1;elsefull=0;endendmodule最后的顶层模块如下所示:仿真波形:
限制150内