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 |