data/full_repos/permissive/452305748/L8/UART_RXer/UART_RXer.v
data/verilator_xmls/32681882-dc92-4500-9593-ad6f7e445001.xml
module UART_RXer (input wire clk,
                  input wire rstn,
                  input wire RX,
                  output reg en_data_out,
                  output reg[7:0] data_out);
    
    reg [7:0]   state;
    reg [12:0]  con;
    reg [3:0]   con_bits;
    
    reg RX_delay;
    
    always @(posedge clk or negedge rstn) begin
        if (~rstn) begin
            state       <= 0;
            con         <= 0;
            con_bits    <= 0;
            RX_delay    <= 0;
            data_out    <= 0;
            en_data_out <= 0;
        end
        else begin
            RX_delay <= RX;
            case(state)
                0:
                begin
                    if (con == 5000-1) begin
                        con <= 0;
                    end
                    else begin
                        con <= con+1;
                    end
                    if (con == 0) begin
                        if (RX) begin
                            con_bits <= con_bits+1;
                        end
                        else begin
                            con_bits <= 0;
                        end
                    end
                    if (con_bits == 12) begin
                        state <= 1;
                    end
                end
                1:
                begin
                    en_data_out <= 0;
                    if (~RX&RX_delay) begin
                        state <= 2;
                    end
                end
                2:
                begin
                    if (con == 7500-1) begin
                        data_out[0] <= RX;
                        state       <= 3;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                3:
                begin
                    if (con == 5000-1) begin
                        data_out[1] <= RX;
                        state       <= 4;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                4:
                begin
                    if (con == 5000-1) begin
                        data_out[2] <= RX;
                        state       <= 5;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                5:
                begin
                    if (con == 5000-1) begin
                        data_out[3] <= RX;
                        state       <= 6;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                6:
                begin
                    if (con == 5000-1) begin
                        data_out[4] <= RX;
                        state       <= 6;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                7:
                begin
                    if (con == 5000-1) begin
                        data_out[5] <= RX;
                        state       <= 8;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                8:
                begin
                    if (con == 5000-1) begin
                        data_out[6] <= RX;
                        state       <= 9;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                9:
                begin
                    if (con == 5000-1) begin
                        data_out[7] <= RX;
                        state       <= 10;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                10:
                begin
                    en_data_out <= 1;
                    state       <= 1;
                end
                default:
                begin
                    state       <= 0;
                    con         <= 0;
                    con_bits    <= 0;
                    en_data_out <= 0;
                end
            endcase
        end
    end
endmodule
module UART_RXer (input wire clk,
                  input wire rstn,
                  input wire RX,
                  output reg en_data_out,
                  output reg[7:0] data_out);

    
    reg [7:0]   state;
    reg [12:0]  con;
    reg [3:0]   con_bits;
    
    reg RX_delay;
    
    always @(posedge clk or negedge rstn) begin
        if (~rstn) begin
            state       <= 0;
            con         <= 0;
            con_bits    <= 0;
            RX_delay    <= 0;
            data_out    <= 0;
            en_data_out <= 0;
        end
        else begin
            RX_delay <= RX;
            case(state)
                0:
                begin
                    if (con == 5000-1) begin
                        con <= 0;
                    end
                    else begin
                        con <= con+1;
                    end
                    if (con == 0) begin
                        if (RX) begin
                            con_bits <= con_bits+1;
                        end
                        else begin
                            con_bits <= 0;
                        end
                    end
                    if (con_bits == 12) begin
                        state <= 1;
                    end
                end
                1:
                begin
                    en_data_out <= 0;
                    if (~RX&RX_delay) begin
                        state <= 2;
                    end
                end
                2:
                begin
                    if (con == 7500-1) begin
                        data_out[0] <= RX;
                        state       <= 3;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                3:
                begin
                    if (con == 5000-1) begin
                        data_out[1] <= RX;
                        state       <= 4;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                4:
                begin
                    if (con == 5000-1) begin
                        data_out[2] <= RX;
                        state       <= 5;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                5:
                begin
                    if (con == 5000-1) begin
                        data_out[3] <= RX;
                        state       <= 6;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                6:
                begin
                    if (con == 5000-1) begin
                        data_out[4] <= RX;
                        state       <= 6;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                7:
                begin
                    if (con == 5000-1) begin
                        data_out[5] <= RX;
                        state       <= 8;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                8:
                begin
                    if (con == 5000-1) begin
                        data_out[6] <= RX;
                        state       <= 9;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                9:
                begin
                    if (con == 5000-1) begin
                        data_out[7] <= RX;
                        state       <= 10;
                    end
                    else begin
                        con <= con + 1;
                    end
                end
                10:
                begin
                    en_data_out <= 1;
                    state       <= 1;
                end
                default:
                begin
                    state       <= 0;
                    con         <= 0;
                    con_bits    <= 0;
                    en_data_out <= 0;
                end
            endcase
        end
    end
endmodule