module uart_tx( input wire clk, input wire start, // Signal de démarrage de la transmission input wire [7:0] data, // Données à transmettre output reg tx, // Sortie de transmission output reg busy // Indicateur de transmission en cours ); parameter CLK_FREQ = 27_000_000; parameter BAUD_RATE = 115_200; localparam BIT_PERIOD = CLK_FREQ / BAUD_RATE; reg [3:0] bit_index; reg [15:0] clk_count; reg [7:0] tx_data = 0; initial begin tx = 1; // État idle (1) busy = 0; // Pas de transmission en cours end always @(posedge clk) begin if (start && !busy) begin busy <= 1; // Démarrer la transmission bit_index <= 0; // Réinitialiser l'index du bit clk_count <= 0; // Réinitialiser le compteur d'horloge tx_data <= data; tx <= 1; // État idle (1) end else if (busy) begin if (clk_count < BIT_PERIOD - 1) begin clk_count <= clk_count + 1; end else begin clk_count <= 0; if (bit_index == 0) begin tx <= 0; // Start bit (0) end else if (bit_index < 9) begin tx <= tx_data[bit_index - 1]; // Transmettre les données (8 bits) end else if (bit_index == 9) begin tx <= 1; // Stop bit (1) end else begin busy <= 0; // Fin de la transmission end bit_index <= bit_index + 1; // Passer au bit suivant end end else begin tx <= 1; // État idle (1) end end endmodule