본문 바로가기

Verilog/HDLbits

[HDLBits] Fsm serialdp

1. 문제 및 설명

https://idkihg.tistory.com/162

 

[HDLBits] Fsm serialdata

1. 문제 및 설명https://idkihg.tistory.com/160 [HDLBits] Fsm serial1. 문제 및 설명 A. 많은 직렬 통신 프로토콜에서는 데이터 바이트의 경계를 구분하기 위해 시작 비트(start bit)와 정지 비트(stop bit)를 함께 전

idkihg.tistory.com

  위의 설계한 직렬 수신기에 패리티 검사 기능을 추가해라. 패리티 검사는 홀수 패리티를 사용한다. 

 

2. 요구사항

    A. FSM 기능

  • 시작 비트 검출
  • 데이터 8비트 수신
  • 패리티 검사
  • Stop bit 확인
  • 오류 복구

    B. done 조건

  • 데이터 수신 완료
  • Odd parity 통과
  • Stop bit 정상

 

3.    문제 풀이

     A.     State

  • idle: in == 1, 입력을 기다리는 상태
  • start: in == 0, 입력을 받아서 상태 천이
  • data: 자동 천이
  • Error: cnt == 9 & in == 0, data를 다 입력 받고 나서, in == 1 받지 못한 경우
    • 1 byte 데이터 및 Parity Bit 수신 후 done 조건 불만족
  • stop: cnt == 89& in == 1 , data를 다 입력 받고 나서, in == 1 받은 경우  
    • 1 byte 데이터 및 Parity Bit 수신 후 done 조건 만족

 

 

4. 모듈 정의

module top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output [7:0] out_byte,
    output done
);

 

 

5. 답

odule top_module(
    input clk,
    input in,
    input reset,    // Synchronous reset
    output [7:0] out_byte,
    output done
); //
    
    parity i0 (clk, parity_reset, in, odd);

    parameter idle = 3'b000, start = 3'b001, data = 3'b010, stop = 3'b011, Err = 3'b100;
    
    reg [2:0] state, next_state;
    reg [3:0] cnt;
    reg [8:0] out;
    
    wire odd;
    wire parity_reset;
    
    assign out_byte = {8{done}}&out[7:0];
    assign parity_reset = reset|(next_state==start);
    
    always@(*)
        begin
            case(state)
                idle: next_state = !in?start:idle;
                start: next_state = data;
                data: next_state = (cnt==9)?(in?stop:Err):data;
                Err: next_state = in?idle:Err;
                stop: next_state = !in?start:idle;
                default next_state = state;               
            endcase

        end
    
    always@(posedge clk)
        begin
            if(reset)
                begin
                	state <= idle;
                    done <= 1'b0;
                    cnt <= 4'd0;
                    out<= 8'd0;
                end
            else
                begin
                	state <= next_state;
                    if(next_state == data)
                        begin
                        	cnt <= cnt + 4'd1;
                            out <= {in, out[8:1]};
                        end
                    else
                        begin
                        	cnt <= 4'd0;
                        end
                    
                    if(next_state == stop & odd)
                        done = 1'b1;
                    else
                        done = 1'b0;
                end
        end

endmodule
 



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

[HDLBits] Exams/ece241 2013 q8  (0) 2026.05.10
HDLbits[HDLBits] Fsm hdlc  (0) 2026.05.10
[HDLBits] Fsm serialdata  (0) 2026.05.05
[HDLBits] Fsm serial  (0) 2026.04.26
[HDLBits] Fsm ps2data  (0) 2026.04.20