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 |