//-------------------------------------------------------------------
//
//  Filename      : proc_axi_top.v
//  Author        : Huang Lei Lei
//  Created       : 2015-09-09
//  Description   : top of proc with axi if
//
//-------------------------------------------------------------------

`include "GFP_defines.v"

module proc_axi_top(
  // global
  axi_clk           ,
  axi_rstn          ,
  proc_clk          ,
  proc_rstn         ,
  // control
  proc_en           ,
  // gm
  gm_saccept        ,
  gm_sdata          ,
  gm_sid            ,
  gm_slast          ,
  gm_sresp          ,
  gm_svalid         ,
  gm_maddr          ,
  gm_mburst         ,
  gm_mcache         ,
  gm_mdata          ,
  gm_mid            ,
  gm_mlen           ,
  gm_mlock          ,
  gm_mprot          ,
  gm_mread          ,
  gm_mready         ,
  gm_msize          ,
  gm_mwrite         ,
  gm_mwstrb         ,
  // fifo error
  proc_fifo_err
  );


//*** PARAMETER DECLARATION ****************************************************

  parameter    AXI_DW         = 64          ,
               AXI_AW         = 32          ,
               AXI_WID        = 1           ;


//*** INPUT/OUTPUT DECLARATION *************************************************

  // global
  input                       axi_clk       ;
  input                       axi_rstn      ;
  input                       proc_clk      ;
  input                       proc_rstn     ;

  // control
  input                       proc_en       ;

  // gm
  input                       gm_saccept    ;
  input   [AXI_DW-1   : 0]    gm_sdata      ;
  input   [3          : 0]    gm_sid        ;
  input                       gm_slast      ;
  input   [2          : 0]    gm_sresp      ;
  input                       gm_svalid     ;
  output  [AXI_AW-1   : 0]    gm_maddr      ;
  output  [1          : 0]    gm_mburst     ;
  output  [3          : 0]    gm_mcache     ;
  output  [AXI_DW-1   : 0]    gm_mdata      ;
  output  [3          : 0]    gm_mid        ;
  output  [3          : 0]    gm_mlen       ;
  output                      gm_mlock      ;
  output  [2          : 0]    gm_mprot      ;
  output                      gm_mread      ;
  output                      gm_mready     ;
  output  [2          : 0]    gm_msize      ;
  output                      gm_mwrite     ;
  output  [AXI_DW/8-1 : 0]    gm_mwstrb     ;

  // fifo error
  output  [1          : 0]    proc_fifo_err ;


//*** WIRE/REG DECLARATION *****************************************************

  reg                         proc_val      ;
  reg     [7          : 0]    proc_dat      ;


//*** MAIN BODY ****************************************************************

//*** PROC IF ************************************

  proc_axi_if #(
    .AXI_DW           ( AXI_DW            ),
    .AXI_AW           ( AXI_AW            ),
    .AXI_WID          ( AXI_WID           )
    ) proc_axi_if0(
    // global
    .axi_clk          ( axi_clk           ),
    .axi_rstn         ( axi_rstn          ),
    .proc_clk         ( proc_clk          ),
    .proc_rstn        ( proc_rstn         ),
    // control
    .proc_en          ( proc_en           ),
    // gm
    .gm_maddr         ( gm_maddr          ),
    .gm_mburst        ( gm_mburst         ),
    .gm_mcache        ( gm_mcache         ),
    .gm_mdata         ( gm_mdata          ),
    .gm_mid           ( gm_mid            ),
    .gm_mlen          ( gm_mlen           ),
    .gm_mlock         ( gm_mlock          ),
    .gm_mprot         ( gm_mprot          ),
    .gm_mread         ( gm_mread          ),
    .gm_mready        ( gm_mready         ),
    .gm_msize         ( gm_msize          ),
    .gm_mwrite        ( gm_mwrite         ),
    .gm_mwstrb        ( gm_mwstrb         ),
    .gm_saccept       ( gm_saccept        ),
    .gm_sdata         ( gm_sdata          ),
    .gm_sid           ( gm_sid            ),
    .gm_slast         ( gm_slast          ),
    .gm_sresp         ( gm_sresp          ),
    .gm_svalid        ( gm_svalid         ),
    // proc
    .proc_val         ( proc_val          ),
    .proc_dat         ( proc_dat          ),
    // fifo error
    .proc_fifo_err    ( proc_fifo_err     )
    );


//*** PROC ***************************************

  reg [31 : 0] cnt ;

  always @(posedge proc_clk or negedge proc_rstn ) begin
    if( !proc_rstn )
      cnt <= 0 ;
    else begin
      cnt <= cnt+1 ;
    end
  end

  always @(posedge proc_clk or negedge proc_rstn ) begin
    if( !proc_rstn ) begin
      proc_val <= 0 ;
      proc_dat <= 0 ;
    end
    else if( proc_en ) begin
      if ( cnt[1:0]==00 ) begin
        proc_val <= 1 ;
        proc_dat <= proc_dat+1 ;
      end
      else begin
        proc_val <= 0 ;
      end
    end
    else begin
      proc_val <= 0 ;
      proc_dat <= 0 ;
    end
  end

endmodule
