Verilog/기본모듈 및 이론

Day 8 - UART(ASM)

onthejobtrain 2024. 6. 19. 23:45

 

오버 샘플링을 하여서 데이터 인식의 정확성을 올린다.

보드레이트에 맞춰서 데이터를 읽는것이 아니라 보드레이트 주기보다 더 자주 데이터를 읽어들인다.

예를 들어 하나의 보드레이트 주기보다 16배 정도 더 많이 값을 읽어들여서 그중 가운데 즉  8번째 읽어 들인 값을 데이터로 생각하고 저장한다.

 

오버샘플링은 보통 16번 또는 8번이 가장 많다. 그중 16번이 가장 자주 쓰이는 방법이다.

 

각 상태를 나타내는 ASM(Algorithmic State Machine)

 

보기 좋게 정리하면 아래와 같다.

과제

 

led를 켜는 FSM 코드

더보기

`timescale 1ns / 1ps


module uartled(
    input clk,
    input reset,
    input [7:0] data,
    output [2:0]led
    );

    reg [2:0] led_reg , led_next;
    reg [1:0] state,state_next;
    
    assign led = led_reg;

    always @(posedge clk, posedge reset) begin
        if(reset) begin
            led_reg <= 3'b000;   
            state <= 0;      
        end
        else begin
            led_reg <= led_next;
            state <= state_next;
        end
    end


    always @(*) begin
        state_next = state;
        led_next = led_reg;
        case (state)
            0: begin
               led_next = 3'b000;
               if(data == 8'h31)begin
                state_next = 1;
               end
               else if(data == 8'h32)begin
                state_next = 2;
               end
               else if(data == 8'h33)begin
                state_next = 3;
               end
               else begin
                state_next = state;
               end 
            end
            1: begin
               led_next = 3'b001;
                if(data == 8'h30)begin
                state_next = 0;
               end
               else if(data == 8'h32)begin
                state_next = 2;
               end
               else if(data == 8'h33)begin
                state_next = 3;
               end
               else begin
                state_next = state;
               end 
            end
            2: begin
               led_next = 3'b011;
                if(data == 8'h31)begin
                state_next = 1;
               end
               else if(data == 8'h30)begin
                state_next = 0;
               end
               else if(data == 8'h33)begin
                state_next = 3;
               end
               else begin
                state_next = state;
               end 
            end
            3: begin
               led_next = 3'b111;
                if(data == 8'h31)begin
                state_next = 1;
               end
               else if(data == 8'h32)begin
                state_next = 2;
               end
               else if(data == 8'h30)begin
                state_next = 0;
               end
               else begin
                state_next = state;
               end 
            end
        endcase
    end

endmodule

만들어진 UART_TxRx와 led를 합친 top모듈

'Verilog > 기본모듈 및 이론' 카테고리의 다른 글

Day 10 - System Verilog(2)  (0) 2024.06.20
Day 9 - Systemveril  (0) 2024.06.19
Day 7 - UART_Rx  (0) 2024.06.19
Day 6 - FSM, UART_Tx  (0) 2024.06.17
Day 5 - 책 이론 + FSM  (0) 2024.06.17