module UartRxTop  #(parameter FIFOSIZE = 16)
(
  input clk,                          // system clock
  input fifo_rd_pop,                  // on pos edge data is read
  input rx_pin,                       // serial data input 
  input clear,
  output reg [7:0]fifo_rd_pop_data,   // data to be read (from fifo_rd)
  output fifo_rd_empty                // fifo_rd empta signal 
  );         


  
  localparam OVERSAMPLING = 32;

  wire uart_clk;
  wire uart_rxclk;

  wire [7:0]fifo_rd_push_data;
  wire [7:0]myfifo_rd_pop_data;
  wire is_rx_data_valid;
  wire fifo_rd_full;
  

  UartClock  #(.OVERSAMPLING(OVERSAMPLING)) UartClock_inst
  (
  	.i_clk(clk) ,
  	.o_clk(uart_clk), 	
  	.o_clk2(uart_rxclk) 	
  );


  UartRx #(.OVERSAMPLING(OVERSAMPLING)) UartRx_inst 
  (
  	.clk(clk) ,                          	// input  clk_sig
  	.uart_rxclk(uart_rxclk) ,	            // input  uart_rxclk_sig
  	.rx_pin(rx_pin) ,	                    // input  rx_pin_sig
  	.o_rx_data_valid(is_rx_data_valid) ,	// output  o_rx_data_valid_sig
  	.rx_data_out(fifo_rd_push_data) 	    // output [7:0] rx_data_out_sig
  );

  Fifo #(.FIFOSIZE(FIFOSIZE)) Fifo_rd
  (
  	.clk(clk) ,	                    // input  clk_sig
  	.data_push(fifo_rd_push_data),	// input [7:0] data_push_sig
  	.push(is_rx_data_valid),	      // input  push_sig
  	.pop(fifo_rd_pop),              // input  pop_sig
    .clear(clear),
  	.fifo_full(fifo_rd_full) ,	    // output  fifo_full_sig
  	.fifo_empty(fifo_rd_empty), 	  // output  fifo_empty_sig
  	.data_pop(myfifo_rd_pop_data) 	// output [7:0] data_pop_sig
  );

  always@(myfifo_rd_pop_data) 
  begin
    fifo_rd_pop_data = myfifo_rd_pop_data;
  end
	
endmodule
