module rx_fifo #(
    parameter WIDTH = 8, // Taille des données (8 bits)
    parameter DEPTH = 16 // Taille de la FIFO
)(
    input clk,
    input rst_p,
    input [WIDTH-1:0] rx_data_in,
    input rx_data_valid,  // Indique que les données reçues sont valides
    input read_fifo,     // Indique que la FIFO doit être lue
    output reg [WIDTH-1:0] rx_data_out,
    output reg rx_data_ready,  // Indique que les données peuvent être lues
    output reg fifo_empty,     // FIFO vide
    output reg fifo_full       // FIFO pleine
);

    reg [WIDTH-1:0] fifo_mem [DEPTH-1:0];  // Mémoire FIFO
    reg [4:0] wr_ptr = 0;  // Pointeur d'écriture
    reg [4:0] rd_ptr = 0;  // Pointeur de lecture
    reg [4:0] fifo_count = 0; // Compteur d'éléments dans la FIFO

    always @(posedge clk or posedge rst_p) begin
        if (rst_p) begin
            wr_ptr <= 0;
            rd_ptr <= 0;
            fifo_count <= 0;
            rx_data_ready <= 0;
            fifo_empty <= 1;
            fifo_full <= 0;
        end else begin
            // Écriture dans la FIFO
            if (rx_data_valid && !fifo_full) begin
                fifo_mem[wr_ptr] <= rx_data_in;
                wr_ptr <= wr_ptr + 1;
                fifo_count <= fifo_count + 1;
            end

            // Lecture de la FIFO
            if (!fifo_empty && read_fifo) begin
                rx_data_out <= fifo_mem[rd_ptr];
                rd_ptr <= rd_ptr + 1;
                fifo_count <= fifo_count - 1;
            end

            // Mise à jour des indicateurs de vide et de plein
            fifo_empty <= (fifo_count == 0);
            fifo_full <= (fifo_count == DEPTH);
            rx_data_ready <= !fifo_empty;
        end
    end
endmodule
