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