-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathps2.v
115 lines (95 loc) · 3.91 KB
/
ps2.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
///////////////////////////////////////////////////////////////
// PS2髞ョ逶俶沖謠乗」?豬区ィ。蝮暦シ係縲、縲ヾ縲.蛻�悪謗ァ蛻カ蟆剰寐逧�ク翫∝キヲ縲∽ク九∝承
///////////////////////////////////////////////////////////////
module PS2(
input clk , //50MHz
input rst_n , //Low Active
input ps2_clk , //PS2譌カ髓滉ソ。蜿キ
input ps2_data, //PS2謨ー謐ョ菫。蜿キ
output reg left, //蟾ヲ髞ョ謖我ク狗噪菫。蜿?
output reg right, //蜿ウ髞ョ謖我ク狗噪菫。蜿?
output reg up, //荳企醗謖我ク狗噪菫。蜿?
output reg down //荳矩醗謖我ク狗噪菫。蜿?
);
reg ps2_state;
//-----------------ps2_clk荳矩剄豐ソ謐戊?--------------------
//clk逶ク蠖謎コ惹クュ髣エ驥�キ轤ケ逧�ス懃畑�檎ャャ荳荳ェ荳矩剄豐ソ蛻ー譚・隸エ譏手オキ蟋倶ス榊シ蟋?
reg ps2_clk0, ps2_clk1, ps2_clk2;//郛灘�蟇�ュ伜?
wire ps2_clk_neg; //1陦ィ遉コ譽?豬句芦荳矩剄豐?
always @ (posedge clk or negedge rst_n)
if (!rst_n)
{ps2_clk0, ps2_clk1, ps2_clk2} <= 3'd0;
else
begin
ps2_clk0 <= ps2_clk;
ps2_clk1 <= ps2_clk0;
ps2_clk2 <= ps2_clk1;
end
assign ps2_clk_neg = ~ps2_clk1 & ps2_clk2;
//----------------------謨ー謐ョ謗・謾カ----------------------------
reg [3:0]num; //遘サ菴肴而蛻カ
reg [7:0]data_temp;//蠖灘燕謗・謾カ逧�焚謐?
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
num <= 4'd0;
data_temp <= 8'd0;
end
else if (ps2_clk_neg)
begin
if (num == 0) num <= num + 1'b1;//霍ウ霑�オキ蟋倶ス?
else if (num <= 8) //謨ー謐ョ菴崎オ句?
begin
num <= num + 1'b1;
data_temp[num-1] <= ps2_data;
end
else if (num == 9) num <= num + 1'b1;//霍ウ霑�。鬪御ス?
else num <= 4'd0; //貂?0
end
//--------------------謖蛾醗謖我ク/譚セ蠑譽?豬?-------------------------
reg ps2_loosen;//1陦ィ遉コ謖蛾醗譚セ蠑
reg [7:0]ps2_byte;//ps2荳?荳ェ蟄苓鰍謨ー謐?
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin
ps2_state <= 1'b0;
ps2_loosen<= 1'b0;
end
//豈乗磁謾カ螳御ク?荳ェ謨ー謐ョ蟆ア霑幄。梧潔髞ョ譽?豬?
else if (num == 4'd10)
if (data_temp == 8'hf0) ps2_loosen <= 1'b1;//譁ュ遐∵�ッ�ャ?
else
begin
if (ps2_loosen) //1陦ィ遉コ謖蛾醗譚セ蠑�御ク倶ク?谺。謗・謾カ謨ー謐ョ蜷取ク?0
begin
ps2_state <= 1'b0;
ps2_loosen<= 1'b0;
end
else //loosen蜿?0蜷守噪荳倶ク荳ェ謨ー謐ョ陦ィ遉コ謖蛾醗陲ォ謖我ク
begin
ps2_state <= 1'b1;
ps2_byte <= data_temp; //謚願ッサ蜿門芦逧�?シ襍狗サ冪s2_out
end
end
reg ps2state_reg;
wire flag;
always @ (posedge clk)
ps2state_reg <= ps2_state;
assign flag = (ps2state_reg) & (~ps2_state);
//---------------------譬ケ謐ョ髞ョ逶俶沖謠冗∬セ灘�謖蛾醗譛画譜菫。蜿?--------------------------
always @ (posedge clk or negedge rst_n)
if (!rst_n)
begin left <= 0; right <= 0; up <= 0; down <= 0; end
else if (flag) //豈丞ス捺收蠑謖蛾醗譌カ謇崎ソ幄。瑚セ灘�
case (ps2_byte)
8'h1C: begin left <= 1; end //a
8'h23: begin right <= 1; end //d
8'h1D: begin up <= 1; end //w
8'h1B: begin down <= 1; end //s
default: begin left <= 0; right <= 0; up <= 0; down <= 0; end
endcase
else if (left) left <= 0; //謇?譛画潔髞ョ譛画譜菫。蜿キ霎灘�荳荳ェ閼牙�蜷朱ゥャ荳頑ク�峺
else if (right) right <= 0;
else if (up) up <= 0;
else if (down) down <= 0;
endmodule