FIFO存儲器代碼
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
最後更新:2017-04-03 12:55:39