본문 바로가기

Verilog/HDLbits

[HDLBits] Fsm ps2data

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