FIFO的一些重要参数
FIFO的宽度:也就是英文资料里常看到的THE
FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12,就可以存储12个8位的数据。
读指针:指向下一个读出地址。读完后自动加1。
写指针:指向下一个要写入的地址的,写完自动加1。
`timescale 1ns / 1ps
module fifo
# (
parameter B=8,
W=4 )
(
input wire clk, reset,
input wire rd, wr,
input wire [B-1:0] w_data,
output wire empty, full,
output wire [B-1:0] r_data
);
reg [B-1:0] array_reg [2**W-1:0] ; //定义了array_reg为2的四次方个8位存储器
reg [W-1:0] w_ptr_reg, w_ptr_next , w_ptr_succ;
reg [W-1:0] r_ptr_reg , r_ptr_next , r_ptr_succ ;
reg full_reg, empty_reg, full_next, empty_next;
wire wr_en;
// body
// r e g i s t e r f i l e w r i t e o p e r a t i o n
always @ ( posedge clk)
if (wr_en)
array_reg [w_ptr_reg] <= w_data ;
assign r_data = array_reg [r_ptr_reg] ;
assign wr_en = wr & ~full_reg;
// f i f o c o n t r o l l o g i c
// r e g i s t e r f o r r e a d and w'rite p o i n t e r s
always @ ( posedge clk or negedge reset)
if (!reset)
begin
w_ptr_reg <= 0;
r_ptr_reg <= 0;
full_reg <= 1'b0;
empty_reg <= 1'b1;
end
else
begin
w_ptr_reg <= w_ptr_next ;
r_ptr_reg <= r_ptr_next;
full_reg <= full_next;
empty_reg <= empty_next ;
end
// n e x t - s t a t e l o g i c f o r read and w r i t e p o i n t e r s
always @*
begin
// s u c c e s s i v e
w_ptr_succ = w_ptr_reg + 1;
r_ptr_succ = r_ptr_reg + 1;
w_ptr_next = w_ptr_reg;
r_ptr_next = r_ptr_reg;
full_next = full_reg;
empty_next = empty_reg;
2'b01: // r e a d
if (~empty_reg) // n o t empty
begin
r_ptr_next = r_ptr_succ ;
full_next = 1'b0;
if (r_ptr_succ==w_ptr_reg)
empty_next = 1'b1;
end
2'b10: // w r i t e
if (~full_reg) // not f u l l
begin
w_ptr_next = w_ptr_succ ;
empty_next = 1'b0
if (w_ptr_succ==r_ptr_reg)
full_next = 1'b1;
end
2'b11: // w r i t e and read
begin
r_ptr_next = r_ptr_succ ;
end
endcase
end
// output
assign full = full_reg;
assign empty = empty_reg;
endmodule
下面是testbench
`timescale 1ns / 1ps
// Company:
// Engineer:
//
// Create Date:
// Design Name:
// Module Name:
// Project Name:
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: fifo
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module fifo_test;
begin
end
endtask
task write_word;
input [7:0]
begin
end
endtask
end
task test1;
begin
repeat (6) begin
end
endtask
task test2;
reg [15:0] writer_counter;
begin
end
endtask
endmodule