본문 바로가기

Verilog/HDLbits

HDLbits[HDLBits] Fsm hdlc

1.    문제 및 설명

     A.     동기식 HDLC 프로토콜은 연속된 비트 스트림에서 특정 패텅을 검출하여 프레임의 시작과 끝을 구분한다.

     B.     주요패턴

  • 0111110
    • Bit Stuffing으로 삽입된 0
    • 제거 대상
    • disc 출력
  • 01111110
    • Flag 패턴
    • 프레임의 시작/종료 의미
    • flag 출력
  • 01111111....
    • 연속도힌 1이 7개 이상
    • 오류 상태
    • err 출력

      C.     Bit Stuffing

  • 데이터 내부에서 flag 패턴이 발생하는 것을 방지하기 위해 송신기는 연속된 5개의 1 뒤에 0을 삽입한다.
  • 수신기는 해당 0을 검출하여 제거해야 한다.

      D.     Reset

  • FSM reset 시 이전 입력이 0이었던 상태처럼 동작해야 한다. 

 

 

 

2.    요구사항

     A.     FSM 설계

  • 입력 비트 스트림을 받아 다음 패턴을 검출하는 FSM을 설계한다.
    • discard pattern
    • flag pattern
    • error pattern

     B.     FSM 기능

  • 연속된 1 개수 추적
  • discard 검출
  • flag 검출
  • error 검출

 

3.    문제 풀이

     A.     State

  • Init
    • 입력을 받는 상태
  • Disc
    • 0111110 검출
    • disc = 1
  • Flag
    • 01111110 검출
    • flag =1
  • Err
    • 01111111...검출
    • err =1

 

4. 모듈 정의

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

 

 

5. 답

module top_module(
    input clk,
    input reset,    // Synchronous reset
    input in,
    output disc,
    output flag,
    output err);
    
    parameter Init = 2'b00, Disc = 2'b01, Flag = 2'b10, Err = 2'b11;
    reg [1:0] state, next_state;
    reg [2:0] cnt;
    
    assign disc = (state==Disc);
    assign flag = (state==Flag);
    assign err = (state==Err);
    
    always@(*)
        begin
            case(state)
                Init: next_state = (cnt<5)?Init:((cnt==5&(!in))?Disc:((cnt==6)?((!in)?Flag:Err):Init));
                Disc: next_state = Init;
                Flag: next_state = Init;
                Err: next_state =in?Err:Init;
            endcase
        end
    
    always@(posedge clk)
        begin
            if(reset)
                begin
                	state <= Init;
                    cnt <= 3'b0;
                end
            else
                begin
                    state <= next_state;
                    
                    if(in)
                        cnt <= cnt + 3'b1;
                    else
                        cnt <= 3'b0;
                end
        end
            
    
    
endmodule
 



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

[HDLBits] Exams/ece241 2014 q5a  (0) 2026.05.10
[HDLBits] Exams/ece241 2013 q8  (0) 2026.05.10
[HDLBits] Fsm serialdp  (0) 2026.05.06
[HDLBits] Fsm serialdata  (0) 2026.05.05
[HDLBits] Fsm serial  (0) 2026.04.26