module fifo(clock,reset,read,write,fifo_in,fifo_out,fifo_empty,fifo_half,fifo_full);
input clock,reset,read,write;
input [7:0] fifo_in;
output [7:0] fifo_out;
output fifo_empty,fifo_half,fifo_full; //表示存储单元使用情况的标志位
reg [7:0] fifo_out;
reg [2:0] read_ptr,write_ptr,counter; //读,写指针及计数器
reg [7:0] ram [7:0]; //8个8位的存储单元
wire fifo_empty,fifo_half,fifo_full;
always@(posedge clock) //复位信号有效时给系统复位
if (reset)
begin
read_ptr=0;
write_ptr=0;
counter=0;
fifo_out=0;
end
else //做读(数据输出),写(数据输入)操作
case({read,write})
2'b00: //没有读写指令
counter=counter;
2'b01: //写指令,数据输入FIFO
begin
ram[write_ptr]=fifo_in; //将输入数据写入存储单元
counter=counter+1; //每写入一个数就让计数器加1
write_ptr=(write_ptr==7)?0:write_ptr+1;
/*写指针加1,若指针指向最后一个存储单元(write_ptr==7),则把指针指向第一个存储单元*/
end
2'b10: //读指令,数据从FIFO输出
begin
fifo_out=ram[read_ptr]; //将存储单元的数据输出
counter=counter-1; //每读出一个数就让计数器减1
read_ptr=(read_ptr==7)?0:read_ptr+1;
/*读指针加1,若指针指向最后一个存储单元(read _ptr ==7),则把指针指向第一个存储单元*/
end
2'b11: //读写指令,同时做数据输入和输出
begin
if(counter==0) //存储单元是空的,所以当前输入数据可以直接输出
fifo_out=fifo_in;
else
begin
ram[write_ptr]=fifo_in;
fifo_out=ram[read_ptr];
write_ptr=(write_ptr==7)?0:write_ptr+1;
read_ptr=(read_ptr==7)?0:read_ptr+1;
end
end
endcase
assign fifo_empty=(counter==0); //存储单元都是空的时候将标志位fifo_empty置1
assign fifo_full=(counter==7); //存储单元都满了的情况下将标志位fifo_full置1
assign fifo_half=(counter==4); //存储单元占用了一半的时候将标志位fifo_half置1
endmodule