See also: PS/2 packet parser.
Now that you have a state machine that will identify three-byte messages in a PS/2 byte stream, add a datapath that will also output the 24-bit (3 byte) message whenever a packet is received (out_bytes[23:16] is the first byte, out_bytes[15:8] is the second byte, etc.).
out_bytes needs to be valid whenever the done signal is asserted. You may output anything at other times (i.e., don't-care).
For example:
cpp
module top_module(
input clk,
input [7:0] in,
input reset, // Synchronous reset
output [23:0] out_bytes,
output done); //
parameter BYTE1 = 2'b00,
BYTE2 = 2'b01,
BYTE3 = 2'b11,
DONE = 2'b10;
reg [1:0] state;
reg [1:0] next_state;
reg [7:0] in_1, in_2;
always@(*)
case(state)
BYTE1:
if(in[3])
next_state <= BYTE2;
else
next_state <= BYTE1;
BYTE2:
next_state <= BYTE3;
BYTE3:
next_state <= DONE;
DONE:
if(in[3])
next_state <= BYTE2;
else
next_state <= BYTE1;
default:
next_state <= BYTE1;
endcase
always@(posedge clk)
if(reset)
state <= BYTE1;
else
state <= next_state;
always@(posedge clk)
if(reset) begin
in_1 <= 8'b0;
in_2 <= 8'b0;
out_bytes <= 24'b0;
end
else begin
in_1 <= in;
in_2 <= in_1;
out_bytes <= {in_2,in_1,in};
end
assign done = state == DONE;
endmodule