| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  |     input read_fifo,     // Indique que la FIFO doit être lue | 
					
						
							| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  |             if (!fifo_empty && read_fifo) begin | 
					
						
							| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  |                 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 |