Search This Blog

Tuesday 5 November 2013

Verilog Code for Synchronous FIFO

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

No comments:

Post a Comment