//这是一个简单的同步FIFO,
// 虽然其简单了点,但是通过其练习,可以较好的理解
// fif0 的读写和状态的空满.
// 对理解复杂的fifo很有帮助.
module fifo ( data_out,                 // 数据输出总线
        full,                     // 满标志
     empty,                    // 空标志
     data_in,                  // 数据输入总线
     we,                       // 写使能
     clk,                      // 系统时钟
     rst_n,                      // 复位
     re                        // 读使能
    );
   parameter data_width=8;         // 定义了存储器的位宽和地址的长度,
   parameter addr_depth=8;         // 虽然比较小,但是可以很好的说明问题!!
   parameter ptr_depth=3;
  
    output [data_width-1:0] data_out;
    output       full, empty;
   
    input [data_width-1:0] data_in;
    input       we,re;
    input       clk;
    input         rst_n;
   
   reg [data_width-1:0]   ram [addr_depth-1:0] ;    // 定义FIFO的RAM;
   reg [ptr_depth-1:0]     read_ptr, write_ptr;
   reg [ptr_depth :0] ptr_gap;
   reg [ data_width-1:0] data_out ;
  
assign full=(ptr_gap==addr_depth);      // countinues fuzhi输出FIFO的满状态
assign empty=(ptr_gap==0);                         // 连续赋值,输出FIFO的空状态。

always @(posedge clk,negedge rst_n)
   if(!rst_n)
    begin
     data_out<=0;
     read_ptr<=0;
     write_ptr<=0;
     ptr_gap<=0;
    end
   else if((we&&(!full))&&(!re))      // 执行写数据操作
    begin
     ram[write_ptr]<=data_in;
     write_ptr<=write_ptr+1;
     ptr_gap<=ptr_gap+1;
    end
   
   else if((re&&(!empty))&&(!we))                // 执行读操作。
    begin
     data_out<=ram[read_ptr];
     read_ptr<=read_ptr+1;
     ptr_gap<=ptr_gap-1;
    end
endmodule
posted on 2009-11-06 19:34  水成文  阅读(2419)  评论(1编辑  收藏  举报