同步FIFO设计

来源:互联网 发布:sql图标 编辑:程序博客网 时间:2024/05/21 10:45

同步FIFO设计与实现

 (2011-12-05 21:26:22)
转载
标签: 

fifo

分类: FPGA学习点滴

同步FIFO设计

 

1.功能定义:

 16*8 RAM实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。写入和读出的操作由时钟的上升沿触发。当FIFO的数据满和空的时候分别设置相应的高电平加以指示。

2.顶层信号定义:

 

信号名称

I/O

功能描述

/目标

备注

Rst

In

全局复位(低有效)

管脚

 

Clk

In

全局时钟

管脚

频率10Mhz;

占空比:50%

Wr_en

In

低有效写使能

管脚

 

Rd_en

In

低有效读使能

管脚

 

Data_in[70]

 

In

数据输入端

管脚

 

Data_out[70]

Out

数据输出端

管脚

 

Empty

Out

空指示信号

管脚

为高时表示fifo

Full

Out

满指示信号

管脚

为高时表示fifo

 

3.顶层模块划分及功能实现

该同步fifo可划分为如下四个模块,如图1所示:

①存储器模块(RAM    ——用于存放及输出数据;

②读地址模块(rd_addr)  ——用于读地址的产生;

③写地址模块(wr_addr)——用于写地址的产生

④标志模块(flag_gen) ---- 用于产生FIFO当前空满状态。

 

同步FIFO设计与实现

                1 同步FIFO的模块划分

1)  RAM模块

本设计中的FIFO采用采用16*8双口RAM,以循环读写的方式实现;

l  根据rd_addr_gen模块产生的读地址,在读使能(rd_en)为高电平的时候,将RAMrd_addr[3:0]地址中的对应单元的数据在时钟上升沿到来的时候,读出到data_out[7:0]中。

l  根据wr_addr_gen产生的写地址和在写使能(wr_en)为高电平的时候,将输入数据(data_in[7:0]) 在时钟上升沿到来的时候,写入wr_addr[3: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;
input[7:0]data_in;
input[3:0]wr_addr;
input[3:0]rd_addr;
output[7:0]data_out;
reg [7:0]data_out;
parameter max_count=5'b10000;
reg [7:0]fifo[0:max_count];
//读操作
always @ (posedge clk )
begin
  if(rd_en)
    data_out<=fifo[rd_addr];
end
//写操作
always @ (posedge clk )
begin
  if(wr_en)
   fifo[wr_addr]<=data_in;
end
endmodule

  生成模块:

                 同步FIFO设计与实现 

2wr_addr_gen

该模块用于产生FIFO写数据时所用的地址。由于16RAM单元可以用4位地址线寻址。本模块用4位计数器(wr_addr[3:0])实现写地址的产生。

l  在复位时(rst=0),写地址值为0

l  如果FIFO未满(~full)且有写使能(wr_en)有效,则wr_addr[3:0]1;否则不变。

module wr_addr_gen(clk,rst,full,wr_en,wr_addr);
input clk,rst;
input full;
input wr_en;
output [3:0]wr_addr;
reg [3:0]wr_addr;
always @ (posedge clk or negedge rst)
begin
  if(!rst)
    wr_addr<=4'b0000;
  else if(full==0&&wr_en==1)
    wr_addr<=wr_addr+1;
  else
    wr_addr<=4'b0000;
end
endmodule

                        同步FIFO设计与实现

3rd_addr_gen

该模块用于产生FIFO读数据时所用的地址。由于16RAM单元可以用4位地址线寻址。本模块用4位计数器(rd_addr[3:0])实现读地址的产生。

l  在复位时(rst=0),读地址值为0

l  如果FIFO未空(~empty)且有读使能(rd_en)有效,则rd_addr[3:0]1;否则不变。

    module rd_addr_gen(clk,rst,emptyp,rd_en,rd_addr);
input clk,rst;
input emptyp;
input rd_en;
output [3:0]rd_addr;
reg [3:0]rd_addr;
always @ (posedge clk or negedge rst)
begin
  if(!rst)
    rd_addr<=4'b0000;
  else if(emptyp==0&&rd_en==1)
    rd_addr<=rd_addr+1;
  else
    rd_addr<=4'b0000;
end
endmodule
 

同步FIFO设计与实现

4) flag_gen模块

flag_gen模块产生FIFO空满标志。本模块设计并不用读写地址判定FIFO是否空满。设计一个计数器,该计数器(pt_cnt)用于指示当前周期中FIFO中数据的个数。由于FIFO中最多只有16个数据,因此采用5位计数器来指示FIFO中数据个数。具体计算如下:

l  复位的时候,pt_cnt=0

l  如果wr_enrd_en同时有效的时候,pt_cnt不加也不减;表示同时对FIFO进行读写操作的时候,FIFO中的数据个数不变。

l  如果wr_en有效且full=0pt_cont+1;表示写操作且FIFO未满时候FIFO中的数据个数增加了1

l  如果rd_en有效且empty=0pt_cont-1; 表示读操作且FIFO未满时候FIFO中的数据个数减少了1

l  如果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;
reg[4:0]count;
parameter max_count=5'b01111;
always @ (posedge clk or negedge rst)
begin
  if(!rst)
   count<=0;
  else
   begin
   case({wr_en,rd_en})
   2'b00:count<=count;
   2'b01:
       if(count!==5'b00000)
       count<=count-1;
   2'b10:
       if(count!== max_count)   
        count<=count+1;
   2'b11:count<=count;
   endcase
   end
end
always @(count)
begin
   if(count==5'b00000)
    emptyp<=1;
   else
    emptyp<=0;
end
always @(count)
begin
   if(count== max_count)
   full<=1;
   else
   full<=0;                                 
end
endmodule

同步FIFO设计与实现

最后的顶层模块如下所示:

同步FIFO设计与实现

仿真波形:

   同步FIFO设计与实现



6

0

阅读(2788) 评论 (2)收藏(1) 转载(10) 喜欢 打印举报
已投稿到:
 排行榜
前一篇:FIFO深度计算分析
后一篇:关于verilog分频程序
评论 重要提示:警惕虚假中奖信息
[发评论]
  • zhou4539

    写的ferfect,呵呵

    2012-8-22  23:58回复(0)

  • 和阳光一起流浪


    顶层模块的代码呢??能分享下吗

    2015-8-18  17:39回复(0)

发评论
小新小浪炮炮兵张富贵旺狗悠嘻猴酷巴熊
更多>>
  • 就不买你
  • 股市
  • 发霉
  • 陈水边
  • 裁员
  • 音乐
  • 贴你
  • 抢车位

登录名: 密码: 找回密码 注册

    

按住左边滑块,拖动完成上方拼图

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

< 前一篇FIFO深度计算分析
后一篇 >关于verilog分频程序

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

0 0
原创粉丝点击