//----------------------------------------------------------------------------
// Copyright (C) 2015 Authors
//
// This source file may be used and distributed without restriction provided
// that this copyright statement is not removed from the file and that any
// derivative work contains the original copyright notice and the associated
// disclaimer.
//
// This source file is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This source is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
// License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this source; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//
//----------------------------------------------------------------------------
//
// *File Name: ogfx_backend_lut_fifo.v
//
// *Module Description:
//                      Simple FIFO module
//
// *Author(s):
//              - Olivier Girard,    olgirard@gmail.com
//
//----------------------------------------------------------------------------
// $Rev$
// $LastChangedBy$
// $LastChangedDate$
//----------------------------------------------------------------------------
`ifdef OGFX_NO_INCLUDE
`else
`include "openGFX430_defines.v"
`endif

module  ogfx_reg_fifo (

// OUTPUTs
    fifo_cnt_o,                          // Fifo counter
    fifo_empty_cnt_o,                    // Fifo empty words counter
    fifo_data_o,                         // Read data output
    fifo_done_evt_o,                     // Fifo has been emptied
    fifo_empty_o,                        // Fifo is currentely empty
    fifo_full_o,                         // Fifo is currentely full
    fifo_ovfl_evt_o,                     // Fifo overflow event

// INPUTs
    mclk,                                // Main system clock
    puc_rst,                             // Main system reset

    fifo_data_i,                         // Read data input
    fifo_enable_i,                       // Enable fifo (flushed when disabled)
    fifo_pop_i,                          // Pop data from the fifo
    fifo_push_i                          // Push new data to the fifo
);

// OUTPUTs
//=========
output         [3:0] fifo_cnt_o;         // Fifo counter
output         [3:0] fifo_empty_cnt_o;   // Fifo empty word counter
output        [15:0] fifo_data_o;        // Read data output
output               fifo_done_evt_o;    // Fifo has been emptied
output               fifo_empty_o;       // Fifo is currentely empty
output               fifo_full_o;        // Fifo is currentely full
output               fifo_ovfl_evt_o;    // Fifo overflow event

// INPUTs
//=========
input                mclk;               // Main system clock
input                puc_rst;            // Main system reset

input         [15:0] fifo_data_i;        // Read data input
input                fifo_enable_i;      // Enable fifo (flushed when disabled)
input                fifo_pop_i;         // Pop data from the fifo
input                fifo_push_i;        // Push new data to the fifo


//=============================================================================
// 1)  WIRE, REGISTERS AND PARAMETER DECLARATION
//=============================================================================

// Some parameter(s)
parameter    FIFO_EMPTY        =  4'h0,
             FIFO_FULL         =  4'hf;

// Others
reg    [3:0] fifo_cnt_o;
wire   [3:0] fifo_cnt_nxt;


//============================================================================
// 5) FIFO COUNTER
//============================================================================

// Control signals
assign    fifo_full_o        =  (fifo_cnt_o == FIFO_FULL);
assign    fifo_empty_o       =  (fifo_cnt_o == FIFO_EMPTY);
assign    fifo_empty_cnt_o   =  (FIFO_FULL-fifo_cnt_o);
wire      fifo_push_int      =  fifo_push_i & !fifo_full_o;
wire      fifo_pop_int       =  fifo_pop_i  & !fifo_empty_o;

// Events
assign    fifo_done_evt_o = ~fifo_empty_o & (fifo_cnt_nxt == FIFO_EMPTY);
assign    fifo_ovfl_evt_o =  fifo_push_i  &  fifo_full_o;


// Fifo counter
assign fifo_cnt_nxt = ~fifo_enable_i                 ?  FIFO_EMPTY        : // Initialize
                      (fifo_push_int & fifo_pop_int) ?  fifo_cnt_o        : // Keep value (pop & push at the same time)
                       fifo_push_int                 ?  fifo_cnt_o + 3'h1 : // Push
                       fifo_pop_int                  ?  fifo_cnt_o - 3'h1 : // Pop
                                                        fifo_cnt_o;         // Hold

always @(posedge mclk or posedge puc_rst)
  if (puc_rst) fifo_cnt_o <= FIFO_EMPTY;
  else         fifo_cnt_o <= fifo_cnt_nxt;


//============================================================================
// 6) FIFO MEMORY & RD/WR POINTERS
//============================================================================

// Write pointer
reg [3:0] wr_ptr;
always @(posedge mclk or posedge puc_rst)
  if (puc_rst)                    wr_ptr  <=  4'h0;
  else if (~fifo_enable_i)        wr_ptr  <=  4'h0;
  else if (fifo_push_int)
    begin
       if (wr_ptr==(FIFO_FULL-1)) wr_ptr  <=  4'h0;
       else                       wr_ptr  <=  wr_ptr + 4'h1;
    end

// Memory
reg [15:0] fifo_mem [0:15];
always @(posedge mclk or posedge puc_rst)
  if (puc_rst)
    begin
       fifo_mem[0]      <=  16'h0000;
       fifo_mem[1]      <=  16'h0000;
       fifo_mem[2]      <=  16'h0000;
       fifo_mem[3]      <=  16'h0000;
       fifo_mem[4]      <=  16'h0000;
       fifo_mem[5]      <=  16'h0000;
       fifo_mem[6]      <=  16'h0000;
       fifo_mem[7]      <=  16'h0000;
       fifo_mem[8]      <=  16'h0000;
       fifo_mem[9]      <=  16'h0000;
       fifo_mem[10]     <=  16'h0000;
       fifo_mem[11]     <=  16'h0000;
       fifo_mem[12]     <=  16'h0000;
       fifo_mem[13]     <=  16'h0000;
       fifo_mem[14]     <=  16'h0000;
       fifo_mem[15]     <=  16'h0000;
    end
  else if (fifo_push_int)
    begin
       fifo_mem[wr_ptr] <=  fifo_data_i;
    end

// Read pointer
reg [3:0] rd_ptr;
always @(posedge mclk or posedge puc_rst)
  if (puc_rst)                    rd_ptr  <=  4'h0;
  else if (~fifo_enable_i)        rd_ptr  <=  4'h0;
  else if (fifo_pop_int)
    begin
       if (rd_ptr==(FIFO_FULL-1)) rd_ptr  <=  4'h0;
       else                       rd_ptr  <=  rd_ptr + 4'h1;
    end

assign fifo_data_o = fifo_mem[rd_ptr];


endmodule // ogfx_reg_fifo

`ifdef OGFX_NO_INCLUDE
`else
`include "openGFX430_undefines.v"
`endif
