module uart_top(
    input  wire       clk,
    input  wire       rst,
    
    input  wire       uart_rx,
    output wire       uart_tx,
    
    // Interfaces RX 
    output wire [7:0] rx_data,
    output wire       rx_data_valid,
    input  wire       rx_data_ready,
    input  wire       read_fifo,

    // Interfaces TX 
    input  wire [7:0] tx_data,
    input  wire       tx_data_valid,
    output wire       tx_data_ready
);

    parameter CLK_FRE  = 27_000_000; // Hz
    parameter BAUD_RATE = 115200;     // Baudrate

    // === Signaux internes ===
    wire [7:0] uart_rx_data;
    wire       uart_rx_data_valid;
    wire       uart_rx_data_ready;

    wire [7:0] uart_tx_data;
    wire       uart_tx_data_valid;
    wire       uart_tx_data_ready;

    wire       tx_fifo_empty;
    wire       tx_fifo_full;
    wire       rx_fifo_empty;
    wire       rx_fifo_full;

    // === FIFO RX ===
    rx_fifo #(
        .WIDTH(8),
        .DEPTH(16)
    ) rx_fifo_inst (
        .clk            (clk),
        .rst_p          (rst),
        .rx_data_in     (uart_rx_data),
        .rx_data_valid  (uart_rx_data_valid),
        .rx_data_out    (rx_data),
        .rx_data_ready  (rx_data_ready),
        .fifo_empty     (rx_fifo_empty), 
        .fifo_full      (rx_fifo_full),
        .read_fifo      (read_fifo)
    );

    // === FIFO TX ===
    tx_fifo #(
        .WIDTH(8),
        .DEPTH(16)
    ) tx_fifo_inst (
        .clk            (clk),
        .rst_p          (rst),
        .tx_data_in     (tx_data),
        .tx_data_valid  (tx_data_valid),
        .tx_data_ready  (tx_data_ready),
        .tx_data_out    (uart_tx_data),
        .uart_tx_ready  (uart_tx_data_ready),
        .fifo_empty     (tx_fifo_empty),
        .fifo_full      (tx_fifo_full)
    );

    // === Instanciation RX UART ===
    uart_rx uart_rx_inst (
        .clk           (clk),
        .rst_p         (rst),
        .rx_data       (uart_rx_data),
        .rx_data_valid (uart_rx_data_valid),
        .rx_data_ready (uart_rx_data_ready),
        .rx_pin        (uart_rx)
    );

    // === Instanciation TX UART ===
    uart_tx uart_tx_inst (
        .clk           (clk),
        .rst_p         (rst),
        .data       (uart_tx_data),
        .tx_data_valid (uart_tx_data_valid),
        .tx_data_ready (uart_tx_data_ready),
        .tx        (uart_tx)
    );

    assign uart_tx_data_valid = (!tx_fifo_empty && uart_tx_data_ready) ? 1'b1 : 1'b0;

endmodule
