module FIFO_sync( clk, rst, w_en, r_en, data_in, data_out, count, full, empty ); parameter FIFO_data_size=16, FIFO_addr_size=8; input clk,rst; input w_en,r_en; input[FIFO_data_size-1:0] data_in; output[FIFO_data_size-1:0] data_out; output full,empty; output[FIFO_addr_size:0]count; reg [FIFO_data_size-1:0] data_out; reg [FIFO_addr_size:0]count; reg [FIFO_addr_size-1:0]w_addr,r_addr; reg [FIFO_data_size-1:0]mem[{FIFO_addr_size{1'b1}}:0]; integer i; //memory的初始化以及写操作 always@(posedge clk or negedge rst) begin if(!rst) begin w_addr<=0; for(i=0;i<={FIFO_addr_size{1'b1}};i=i+1) mem[i]<={FIFO_data_size{1'b0}}; end else if(w_en&(~full)) begin mem[w_addr]<=data_in; w_addr<=w_addr+1; end end //读操作 always@(posedge clk or negedge rst) begin if(!rst) begin data_out<={(FIFO_data_size-1){1'b0}}; r_addr<=0; end else if(r_en&(~empty)) begin data_out<=mem[r_addr]; r_addr<=r_addr+1; end end //count产生空满标志符 always@(posedge clk or negedge rst) begin if(!rst) count<=0; else if(((w_en)&(~full))&(~((r_en)&(~empty)))) count<=count+1; else if(((r_en)&(~empty))&(~((w_en)&(~full)))) count<=count-1; end assign empty=(count==0); assign full=(count=={FIFO_addr_size{1'b1}}+1); endmodule