📄 ps2_keyboard.v
字号:
// This module is provided by Terasic in DE2 examples: synthesizer
// Copyright (c) Terasic 2005
// 28NOV2007 modified to accept different keys - Charles HY Cheung, Cornell University
module PS2_KEYBOARD(
inout ps2_dat,
input ps2_clk,
input sys_clk,
input reset,
input reset1,
output reg[7:0]scandata,
output reg key1_on,
output reg key2_on,
output reg [7:0]key1_code,
output reg [7:0]key2_code
);
////////////Keyboard Initially/////////
reg [10:0] MCNT;
always @(negedge reset or posedge sys_clk) begin
if (!reset) MCNT=0;
else if(MCNT < 500) MCNT=MCNT+1;
end
///// sequence generator /////
reg [7:0]revcnt;
wire rev_tr=(MCNT<12)?1:0;
always @(posedge rev_tr or posedge ps2_clk)begin
if (rev_tr)
revcnt=0;
else if (revcnt >=10) revcnt=0;
else
revcnt=revcnt+1;
end
//////KeyBoard serial data in /////
reg [9:0]keycode_o;
always @(posedge ps2_clk) begin
case (revcnt[3:0])
1:keycode_o[0]=ps2_dat;
2:keycode_o[1]=ps2_dat;
3:keycode_o[2]=ps2_dat;
4:keycode_o[3]=ps2_dat;
5:keycode_o[4]=ps2_dat;
6:keycode_o[5]=ps2_dat;
7:keycode_o[6]=ps2_dat;
8:keycode_o[7]=ps2_dat;
endcase
end
wire [7:0]rc=keycode_o[7:0];
wire HOST_ACK=(revcnt==10)?~(rc[7]^rc[6]^rc[5]^rc[4]^rc[3]^rc[2]^rc[1]^rc[0]) :1;
////////PS2 InOut/////////
assign ps2_dat =(HOST_ACK)?1'bz:1'b0;
///////KeyBoard Scan-Code trigger//////
reg keyready;
always @(posedge rev_tr or negedge ps2_clk) begin
if (rev_tr)
keyready=0;
else if (revcnt[3:0]==10)
keyready=1;
else
keyready=0;
end
/////////////////////////////////////Key1-Key2 Output///////////////////////////
wire is_key=(
(keycode_o==8'h3b)?1:(
(keycode_o==8'h3c)?1:(
(keycode_o==8'h3d)?1:(
(keycode_o==8'h3e)?1:(
(keycode_o==8'h3f)?1:(
(keycode_o==8'h40)?1:(
(keycode_o==8'h41)?1:(
(keycode_o==8'h42)?1:(
(keycode_o==8'h43)?1:(
(keycode_o==8'h44)?1:(
(keycode_o==8'h57)?1:(
(keycode_o==8'h58)?1:(
(keycode_o==8'h39)?1:( //space
(keycode_o==8'h1c)?1:( //enter
(keycode_o==8'h01)?1:( //esc
(keycode_o==8'h48)?1:( //up
(keycode_o==8'h50)?1:(
(keycode_o==8'h4b)?1:(
(keycode_o==8'h4d)?1:(
(keycode_o==8'h46)?1:0 //scrolllock
)))))))))))))))))))
);
//////////////key1 & key2 Assign///////////
wire keyboard_off=((MCNT==200) || (!reset1))?0:1;
always @(posedge keyready) scandata = keycode_o;
always @(negedge keyboard_off or posedge keyready) begin
if (!keyboard_off) begin
key1_on=0;
key2_on=0;
key1_code=8'hf0;
key2_code=8'hf0;
end else
if (scandata==8'hf0) begin
if (keycode_o==key1_code) begin
key1_code=8'hf0; key1_on=0;
end
else if (keycode_o==key2_code) begin
key2_code=8'hf0; key2_on=0; end
end
else
if (is_key) begin
if ((!key1_on) && (key2_code!=keycode_o)) begin
key1_on=1;key1_code=keycode_o;
end
else if ((!key2_on) && (key1_code!=keycode_o)) begin
key2_on=1;key2_code=keycode_o;
end
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -