//这是一个简单的同步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 |