SCH

图1 4x4矩阵键盘的SCH(箭头表示输入输出方向)
如图1所示,将ROW[3:0]设为输入,COL[3:0]设为输出。如果没有任何键被按下,则ROW[3:0]一直被上拉为高电平。只有当有键被按下,且COL[3:0]中有低电平输出,ROW[3:0]中才有可能有低电平输入,也可说是被动地输入。
流程图

图2 流程图
HDL
001 |
module matrixKeyboard_drive( |
005 |
output reg [3:0] col, |
006 |
output reg [3:0] keyboard_val |
014 |
always @ (posedge i_clk, negedge i_rst_n) |
020 |
wire key_clk = cnt[19]; |
030 |
parameter NO_KEY_PRESSED = 6'b000_001; |
031 |
parameter SCAN_COL0 = 6'b000_010; |
032 |
parameter SCAN_COL1 = 6'b000_100; |
033 |
parameter SCAN_COL2 = 6'b001_000; |
034 |
parameter SCAN_COL3 = 6'b010_000; |
035 |
parameter KEY_PRESSED = 6'b100_000; |
037 |
reg [5:0] current_state, next_state; |
039 |
always @ (posedge key_clk, negedge i_rst_n) |
041 |
current_state <= NO_KEY_PRESSED; |
043 |
current_state <= next_state; |
050 |
next_state = SCAN_COL0; |
052 |
next_state = NO_KEY_PRESSED; |
055 |
next_state = KEY_PRESSED; |
057 |
next_state = SCAN_COL1; |
060 |
next_state = KEY_PRESSED; |
062 |
next_state = SCAN_COL2; |
065 |
next_state = KEY_PRESSED; |
067 |
next_state = SCAN_COL3; |
070 |
next_state = KEY_PRESSED; |
072 |
next_state = NO_KEY_PRESSED; |
075 |
next_state = KEY_PRESSED; |
077 |
next_state = NO_KEY_PRESSED; |
080 |
reg key_pressed_flag; |
081 |
reg [3:0] col_val, row_val; |
084 |
always @ (posedge key_clk, negedge i_rst_n) |
088 |
key_pressed_flag <= 0; |
095 |
key_pressed_flag <= 0; |
109 |
key_pressed_flag <= 1; |
120 |
always @ (posedge key_clk, negedge i_rst_n) |
122 |
keyboard_val <= 4'h0; |
124 |
if (key_pressed_flag) |
125 |
case ({col_val, row_val}) |
126 |
8'b1110_1110 : keyboard_val <= 4'h0; |
127 |
8'b1110_1101 : keyboard_val <= 4'h4; |
128 |
8'b1110_1011 : keyboard_val <= 4'h8; |
129 |
8'b1110_0111 : keyboard_val <= 4'hC; |
131 |
8'b1101_1110 : keyboard_val <= 4'h1; |
132 |
8'b1101_1101 : keyboard_val <= 4'h5; |
133 |
8'b1101_1011 : keyboard_val <= 4'h9; |
134 |
8'b1101_0111 : keyboard_val <= 4'hD; |
136 |
8'b1011_1110 : keyboard_val <= 4'h2; |
137 |
8'b1011_1101 : keyboard_val <= 4'h6; |
138 |
8'b1011_1011 : keyboard_val <= 4'hA; |
139 |
8'b1011_0111 : keyboard_val <= 4'hE; |
141 |
8'b0111_1110 : keyboard_val <= 4'h3; |
142 |
8'b0111_1101 : keyboard_val <= 4'h7; |
143 |
8'b0111_1011 : keyboard_val <= 4'hB; |
144 |
8'b0111_0111 : keyboard_val <= 4'hF; |