module top_uart_loopback ( input wire clk, // 27 MHz input wire rx, output wire tx, output reg [5:0] leds ); wire rx_received; wire [7:0] rx_data; reg [7:0] tx_data; reg tx_enable; wire tx_ready; initial begin leds = 6'b111111; end // === UART RX === rxuartlite uart_rx_inst ( .i_clk(clk), .i_reset(1'b0), .i_uart_rx(rx), .o_wr(rx_received), .o_data(rx_data) ); // === UART TX === uart_tx uart_tx_inst ( .clk(clk), .rst_p(1'b0), .data(data_const), .tx_enable(tx_enable), .tx_ready(tx_ready), .tx(tx) ); // === FSM avec délai === localparam IDLE = 0, WAIT = 1, SEND = 2; reg [1:0] state = IDLE; reg [8:0] delay_counter = 0; always @(posedge clk) begin leds[5] <= rx; leds[4] <= tx; case (state) IDLE: begin tx_enable <= 0; delay_counter <= 0; if (rx_received && tx_ready) begin tx_data <= rx_data; state <= WAIT; leds[0] <= 0; leds[1] <= 1; end end WAIT: begin if (tx_ready) begin tx_enable <= 1; state <= SEND; end else begin tx_enable <= 0; end end SEND: begin if (!tx_ready) begin // Attendre que la transmission commence tx_enable <= 0; end else if (tx_ready && tx_enable == 0) begin state <= IDLE; // Transmission terminée, retour à l’attente end leds[0] <= 0; leds[1] <= 0; end endcase end endmodule