module uart_rx ( input wire clk, input wire rx, // signal reçues output reg [7:0] data, // Données decoder output reg valid = 0, // Indicateur de données valides output reg ready = 1 // Indicateur de réception prête ); parameter CLK_FREQ = 27_000_000; parameter BAUD_RATE = 115_200; localparam BIT_PERIOD = CLK_FREQ / BAUD_RATE; localparam IDLE = 2'b00; localparam START = 2'b01; localparam DATA = 2'b10; localparam STOP = 2'b11; reg [1:0] state = IDLE; reg [3:0] bit_index; reg [15:0] clk_count; reg [7:0] rx_data = 0; always @(posedge clk) begin case (state) IDLE: begin ready <= 1; if (!rx) begin // start bit (0) state <= START; clk_count <= 0; bit_index <= 0; valid <= 0; ready <= 0; end end START: begin if (clk_count < (BIT_PERIOD / 2) - 1) begin // Attendre juste 0.5 bit clk_count <= clk_count + 1; end else begin clk_count <= 0; state <= DATA; end end DATA: begin if (clk_count < BIT_PERIOD - 1) begin clk_count <= clk_count + 1; end else begin clk_count <= 0; rx_data[bit_index] <= rx; // Recevoir les données (8 bits) bit_index <= bit_index + 1; if (bit_index == 7) begin state <= STOP; // Passer à l'état d'arrêt end end end STOP: begin if (clk_count < BIT_PERIOD - 1) begin clk_count <= clk_count + 1; end else begin state <= IDLE; data <= rx_data; valid <= 1; ready <= 1; end end endcase end endmodule