| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  | module tx_fifo #( | 
					
						
							|  |  |  |     parameter WIDTH = 8,  // Taille des données (8 bits) | 
					
						
							|  |  |  |     parameter DEPTH = 16  // Taille de la FIFO | 
					
						
							|  |  |  | )( | 
					
						
							|  |  |  |     input wire clk, | 
					
						
							|  |  |  |     input wire rst_p, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Entrée utilisateur | 
					
						
							|  |  |  |     input  wire [WIDTH-1:0] tx_data_in, | 
					
						
							|  |  |  |     input  wire             tx_data_valid,  // Donnée disponible à écrire | 
					
						
							|  |  |  |     output wire             tx_data_ready,  // FIFO prête à recevoir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Sortie vers UART | 
					
						
							|  |  |  |     output reg  [WIDTH-1:0] tx_data_out, | 
					
						
							|  |  |  |     input  wire             uart_tx_ready,  // UART demande une donnée | 
					
						
							|  |  |  |     output reg              fifo_empty,      | 
					
						
							|  |  |  |     output reg              fifo_full | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     reg [WIDTH-1:0] fifo_mem [DEPTH-1:0]; | 
					
						
							|  |  |  |     reg [4:0] wr_ptr = 0; | 
					
						
							|  |  |  |     reg [4:0] rd_ptr = 0; | 
					
						
							|  |  |  |     reg [4:0] fifo_count = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     always @(posedge clk or posedge rst_p) begin | 
					
						
							| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  |         tx_data_out <= fifo_mem[rd_ptr]; | 
					
						
							| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  |         if (rst_p) begin | 
					
						
							|  |  |  |             wr_ptr <= 0; | 
					
						
							|  |  |  |             rd_ptr <= 0; | 
					
						
							|  |  |  |             fifo_count <= 0; | 
					
						
							|  |  |  |             fifo_empty <= 1; | 
					
						
							|  |  |  |             fifo_full <= 0; | 
					
						
							|  |  |  |             tx_data_out <= 0; | 
					
						
							|  |  |  |         end else begin | 
					
						
							|  |  |  |             // Écriture dans FIFO | 
					
						
							|  |  |  |             if (tx_data_valid && !fifo_full) begin | 
					
						
							|  |  |  |                 fifo_mem[wr_ptr] <= tx_data_in; | 
					
						
							|  |  |  |                 wr_ptr <= wr_ptr + 1; | 
					
						
							|  |  |  |                 fifo_count <= fifo_count + 1; | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Lecture depuis FIFO | 
					
						
							|  |  |  |             if (uart_tx_ready && !fifo_empty) begin | 
					
						
							| 
									
										
										
										
											2025-05-02 11:03:14 +02:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											2025-04-28 17:13:39 +02:00
										 |  |  |                 rd_ptr <= rd_ptr + 1; | 
					
						
							|  |  |  |                 fifo_count <= fifo_count - 1; | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Mise à jour des flags | 
					
						
							|  |  |  |             fifo_empty <= (fifo_count == 0); | 
					
						
							|  |  |  |             fifo_full  <= (fifo_count == DEPTH); | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // FIFO est prête à recevoir des données si pas pleine | 
					
						
							|  |  |  |     assign tx_data_ready = !fifo_full; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | endmodule |