Sr. No. 
 |    
Name of the Pin 
 |    
Direction 
 |    
Width 
 |    
Description 
 |   
1 
 |    
Rst_a 
 |    
Input 
 |    
1 
 |    
Reset Input 
 |   
2 
 |    
Clk 
 |    
Input 
 |    
1 
 |    
Clock Input 
 |   
3 
 |    
wr_en 
 |    
Input 
 |    
1 
 |    
when high   write into fifo 
 |   
4 
 |    
rd_en 
 |    
input 
 |    
1 
 |    
when high read   from memory 
 |   
5 
 |    
Data_in 
 |    
Input 
 |    
4 
 |    
Data Input 
 |   
6 
 |    
Data_out 
 |    
Output 
 |    
4 
 |    
Data output 
 |   
7 
 |    
Full 
 |    
Output 
 |    
1 
 |    
Fifo status 
1 if fifo is   full 
 |   
8 
 |    
Empty 
 |    
Output 
 |    
1 
 |    
Fifo status 
1 if fifo is   empty 
 |   
module sync_fifo(data_out,full,empty,data_in,clk,rst_a,wr_en,rd_en); //---------------parametre declaration parameter data_width = 4; parameter address_width = 4; parameter ram_depth =16; //--------------input output port declaration output [data_width-1:0] data_out; output full; output empty; input [data_width-1:0] data_in; input clk; input rst_a; input wr_en; input rd_en; //--------------internal register declaration reg [address_width-1:0] wr_pointer; reg [address_width-1:0] rd_pointer; reg [address_width :0] status_count; reg [data_width-1:0] data_out ; wire [data_width-1:0] data_ram ; //--------------wr_pointer pointing to write address always @ (posedge clk,posedge rst_a) begin if(rst_a) wr_pointer = 0; else if(wr_en) wr_pointer = wr_pointer+1; end //-------------rd_pointer points to read address always @ (posedge clk,posedge rst_a) begin if(rst_a) rd_pointer = 0; else if(rd_en) rd_pointer = rd_pointer+1; end //-------------read from FIFO always @ (posedge clk,posedge rst_a) begin if(rst_a) data_out=0; else if(rd_en) data_out=data_ram; end //--------------Status pointer for full and empty checking always @ (posedge clk,posedge rst_a) begin if(rst_a) status_count = 0; else if(wr_en && !rd_en && (status_count != ram_depth)) status_count = status_count + 1; else if(rd_en && !wr_en && (status_count != 0)) status_count = status_count - 1; end // always @ (posedge clk,posedge rst_a) assign full = (status_count == (ram_depth)); assign empty = (status_count == 0); memory_16x4 #(data_width,address_width,ram_depth) u1
(.address_1(wr_pointer),.address_2(rd_pointer),.data_1(data_in),.data_2(data_ram),.wr_en1(wr_en),.rd_en2(rd_en),.clk(clk)); endmodule // sync_fifo