본문 바로가기

Verilog/HDLbits

[HDLBits] Fsm serial

1. 문제 및 설명

    A. 많은 직렬 통신 프로토콜에서는 데이터 바이트의 경계를 구분하기 위해 시작 비트(start bit)와 정지 비트(stop bit)를 함께 전송한다.

    B. 일반적인 프레임 구조는 다음과 같다.

  • 시작 비트: 0 (1비트)
  • 데이터 비트: 8비트
  • 정지 비트: 1 (1비트)

    C. 유휴 상태(idle)에서는 라인이 항상 논리값 1을 유지한다.

    D. 수신 동작은 다음과 같은 순서를 따른다.

  • 라인이 1 → 0으로 변하는 순간을 시작 비트로 인식한다.
  • 이후 8개의 데이터 비트를 순차적으로 수신한다.
  • 마지막으로 정지 비트(1)를 확인한다.

    E. 정지 비트가 올바르지 않은 경우의 처리:

  • 예상 위치에서 정지 비트가 1이 아니면 오류로 간주한다.
  • 이 경우, 올바른 정지 비트(1)가 다시 나타날 때까지 대기한다.
  • 이후 다음 바이트 수신을 다시 시작한다.

 

2. 요구사항

    A. 입력 비트 스트림을 받아 바이트 단위 수신을 판별하는 FSM을 설계하시오.

    B. FSM은 다음 기능을 포함해야 한다.

  • 시작 비트 검출
  • 8비트 데이터 수신 카운트
  • 정지 비트 검증
  • 오류 발생 시 재동기화(정지 비트 대기)

    C. FSM은 하나의 바이트가 정상적으로 수신(정지 비트까지 확인 완료)된 직후 사이클에서 완료 신호(예: done)를 출력해야 한다.

 

 

3.    문제 풀이

     A.     State

  • idle: in == 1, 입력을 기다리는 상태
  • start: in == 0, 입력을 받아서 상태 천이
  • data: 자동 천이
  • Error: cnt == 8 & in == 0, data를 다 입력 받고 나서, in == 1 받지 못한 경우
  • stop: cnt == 8 & in == 1 , data를 다 입력 받고 나서, in == 1 받은 경우  

     B.     reg

  • cnt: next_state가 data일 때 cnt 상승

 

4. waveform

 

 

5. 모듈 정의

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
);

 

 

5. 답

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output done
); 
    parameter idle = 3'b000, data = 3'b001, stop = 3'b010, start = 3'b011, Error = 3'b100;
    
    reg [2:0] state, next_state;
    reg [3:0] cnt;
    
    assign done = (state == stop);
    
    always@(*)
        begin
            case(state)
                idle: next_state = !in?start:idle;
                start: next_state = data;
                data: next_state = (cnt==8)?(in?stop:Error):data;
                Error: next_state = in?idle:Error;
                stop: next_state = !in?start:idle;
                default next_state = state;               
            endcase
        end
    
    always@(posedge clk)
        begin
            if(reset)
                begin
                	state <= idle;
                    cnt <= 4'd0;
                end
            else
                begin
                	state <= next_state;
                    if(next_state == data)
                        cnt <= cnt + 4'd1;
                    else
                        cnt <= 4'd0;
                    
                end
        end        
                      
                
endmodule
 

 

'Verilog > HDLbits' 카테고리의 다른 글

[HDLBits] Fsm serialdp  (0) 2026.05.06
[HDLBits] Fsm serialdata  (0) 2026.05.05
[HDLBits] Fsm ps2data  (0) 2026.04.20
[HDLBits] Fsm ps2  (2) 2026.04.20
[HDLBits] Fsm onehot  (1) 2026.04.13