1. 문제 및 설명
A. PS/2 마우스 프로토콜은 메시지를 3바이트 단위로 전송한다.
- 먼저 bit[3] = 1인 바이트가 나올 때까지 모든 바이트를 버린다.
- bit[3] = 1인 바이트를 발견하면, 이를 메시지의 첫 번째 바이트로 간주한다.
- 이후 총 3바이트를 모두 수신하면, 하나의 메시지를 정상적으로 받은 것으로 판단한다.
- out_bytes[23:16]은 첫 번째 바이트, out_bytes[15:8]은 두 번째 바이트, 그 다음은 세 번째 바이트이다.
- done 신호가 활성될 때는 out_bytes 값이 유효해야 한다.
2. 요구사항
A. 입력 바이트 스트림을 받아 메시지 경계를 탐지하는 FSM설계 하시오.
- FSM은 각 메시지의 세 번째 바이트를 성공적으로 수신한 직후 사이클에서 done 신호를 출력해야 한다.
3. 문제 풀이
A. State
- wait_1: in[3] == 1 입력을 기다리는 상태
- byte1: in[3] == 1 입력을 받아서 상태 천이
- byte2: 자동 천이
- byte3: 자동 천이

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 [7:0] in,
input reset, // Synchronous reset
output [23:0] out_bytes,
output done); //
parameter wait_1 = 2'b00, byte1 = 2'b01, byte2 = 2'b10, byte3 = 2'b11;
reg [1:0] state, next_state;
// State transition logic (combinational)
always@(*)
begin
case(state)
wait_1: next_state = in[3]?byte1:wait_1;
byte1: next_state = byte2;
byte2: next_state = byte3;
byte3: next_state = in[3]?byte1:wait_1;
endcase
done = (state==byte3);
end
// State flip-flops (sequential)
always@(posedge clk)
begin
if(reset)
begin
state <= wait_1;
end
else
begin
state <= next_state;
if(next_state == byte1)
out_bytes[23:16] <= in;
else if(next_state == byte2)
out_bytes[15:8] <= in;
else if(next_state == byte3)
out_bytes[7:0] <= in;
else
out_bytes <= 24'b0;
end
end
endmodule
'Verilog > HDLbits' 카테고리의 다른 글
| [HDLBits] Fsm serialdata (0) | 2026.05.05 |
|---|---|
| [HDLBits] Fsm serial (0) | 2026.04.26 |
| [HDLBits] Fsm ps2 (2) | 2026.04.20 |
| [HDLBits] Fsm onehot (1) | 2026.04.13 |
| [HDLBits] Lemmings4 (0) | 2026.04.11 |