📄 keyboard.v
字号:
//16个按键代表1---F,按下按键可以在7段数码管上显示相应数字
module keyboard(
code ,
col ,
valid ,
row ,
sys_clk ,
rst ,
led_7s
);
output [3:0] code ;
output valid ;
output [3:0] col ;
output [11:0] led_7s ;
input [3:0] row ;
input sys_clk,rst ;
reg [3:0] col,code;
reg [5:0] state,next_state;
reg [11:0] led_7s;
parameter S_0 = 6'b000001,
S_1 = 6'b000010,
S_2 = 6'b000100,
S_3 = 6'b001000,
S_4 = 6'b010000,
S_5 = 6'b100000;
reg S_row ;
reg [3:0] count,row_reg,col_reg;
reg clk2,clk4;
reg [24:0] Mega_cnt;
wire clk;
/**************************************/
always @(posedge sys_clk or negedge rst)
begin
if(!rst)
begin
Mega_cnt<=0;
end
else
begin
Mega_cnt<=Mega_cnt+1;
end
end
assign clk = Mega_cnt[4];
/**************************************/
always @ (posedge clk)
clk2 <= ~clk2;
always @ (posedge clk2)
clk4 <= ~clk4;
always @ (posedge clk4 or negedge rst)
if(!rst)
begin
count <= 0;
S_row <= 0;
end
else
begin
if(!(row[0]&row[1]&row[2]&row[3]))
begin
if(count < 'd4)
count <= count +1 ;
else
S_row <= 1;
end
else if(state[5]||state[0])
begin
count <= 0;
S_row <= 0;
end
end
assign valid = ((state == S_1)||(state == S_2)||(state == S_3)||(state == S_4)) && (!(row[3]&row[2]&row[1]&row[0])) ;
always @ (negedge clk)
if(valid)
begin
row_reg <= row ;
col_reg <= col ;
end
else
begin
row_reg <= row_reg ;
col_reg <= col_reg ;
end
always @ (row_reg or col_reg or clk)
case({row_reg,col_reg})
8'b1110_1110: code = 4 ;
8'b1110_1101: code = 3 ;
8'b1110_1011: code = 2 ;
8'b1110_0111: code = 1 ;
8'b1101_1110: code = 8 ;
8'b1101_1101: code = 7 ;
8'b1101_1011: code = 6 ;
8'b1101_0111: code = 5 ;
8'b1011_1110: code = 12 ;
8'b1011_1101: code = 11 ;
8'b1011_1011: code = 10;
8'b1011_0111: code = 9;
8'b0111_1110: code = 0;
8'b0111_1101: code = 15;
8'b0111_1011: code = 14;
8'b0111_0111: code = 13;
endcase
always @ (posedge clk4 or negedge rst)
if(!rst)
state <= S_0 ;
else
state <= next_state ;
always @ ( state or row or S_row)
begin
// next_state = state ;
col =0;
case(state)
S_0 : begin
col = 4'b0000;
if(S_row)
next_state = S_1;
else
next_state = S_0;
end
S_1 : begin
col = 4'b1110;
if(row!='hf)
next_state = S_5;
else
next_state = S_2;
end
S_2 : begin
col = 4'b1101;
if(row!='hf)
next_state = S_5;
else
next_state = S_3;
end
S_3 : begin
col = 4'b1011;
if(row!='hf)
next_state = S_5;
else
next_state = S_4;
end
S_4 : begin
col = 4'b0111;
if(row!='hf)
next_state = S_5;
else
next_state = S_0;
end
S_5 : begin
col = 4'b0000;
if(row == 4'b1111)
next_state = S_0;
else
next_state = S_5;
end
default: next_state = S_0;
endcase
end
always @ (code)
begin
case(code)
4'd0 : led_7s = 12'b1111_1100_1111;
4'd1 : led_7s = 12'b0110_0000_1111;
4'd2 : led_7s = 12'b1101_1010_1111;
4'd3 : led_7s = 12'b1111_0010_1111;
4'd4 : led_7s = 12'b0110_0110_1111;
4'd5 : led_7s = 12'b1011_0110_1111;
4'd6 : led_7s = 12'b1011_1110_1111;
4'd7 : led_7s = 12'b1110_0000_1111;
4'd8 : led_7s = 12'b1111_1110_1111;
4'd9 : led_7s = 12'b1111_0110_1111;
4'd10: led_7s = 12'b1110_1110_1111;
4'd11: led_7s = 12'b0011_1110_1111;
4'd12: led_7s = 12'b1001_1100_1111;
4'd13: led_7s = 12'b0111_1010_1111;
4'd14: led_7s = 12'b1001_1110_1111;
4'd15: led_7s = 12'b1000_1110_1111;
endcase
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -