为什么按下一个不加一,而是数值是乱的,在线等
时间:10-02
整理:3721RD
点击:
//矩阵键盘扫描 并将键值送出
module matrix_key
(
clk, //48MHZ
reset,
col, //列
row, //行
data_1,//键值,个位
data_10,//十位
data_100,//百位
data_1000 //千位
);
input clk,reset;
input [1:0] col;
output [1:0] row;
output [3:0] data_1,data_10,data_100,data_1000;
reg [1:0] row;
reg [3:0] data_1,data_10,data_100,data_1000;
reg [5:0] count;//delay_20ms
reg [2:0] state; //状态标志
reg key_flag; //按键标志位
reg clk_500khz; //500KHZ时钟信号
reg [1:0] col_reg; //寄存扫描列值
reg [1:0] row_reg; //寄存扫描行值
reg [19:0] cnt;
reg [3:0] num;
//initial begin num= 4'd0;end
always @(posedge clk or negedge reset)
if(!reset)
begin
clk_500khz =50)
begin
//cnt<=cnt+1;
clk_500khz<=~clk_500khz;
count<=0;
end
else
count<=count+1;
end
always @(posedge clk_500khz or negedge reset)
if(!reset)
begin
row<=2'b00;
state<=0;
end
else
// if(cnt==20'hfffff)
begin
case (state)
0:
begin
row[1:0]<=2'b00;
key_flag<=1'b0;
cnt<=0;
if(col[1:0]!=2'b11) //有键按下,扫描第一行
begin
state<=1;
row[1:0]<=2'b10;
end
else
state<=0;
end
1:
begin
if(col[1:0]!=2'b11)//判断是否是第一行
begin
state<=5;
end
else //准备扫描第二行
begin
state<=2;
row[1:0]<=2'b01;
end
end
2:
begin
if(col[1:0]!=4'b11) //判断是否是第二行
begin
state<=5;
end
else
begin
state<=0;//重新扫描
row[1:0]<=2'b00;
end
end
5:
begin
if(col[1:0]!=2'b11)
//if(cnt==15'hffff)
begin
if(cnt==15'hfff)
begin
cnt<=0;
row_reg<=row; //保存扫描列值
col_reg<=col; //保存扫描行值
key_flag<=1'b1; //有键按下
end
else
cnt<=cnt +1;
state<=5;
end
else
begin
state<=0;
end
end
endcase
end
always @(posedge clk_500khz or negedge reset)//(posedge clk_500khz) //or reset or row_reg or col_reg)
if(!reset)
begin
num<=1'b0;
end
else
if(cnt==15'hff)
begin
// if(key_flag==1'b1)
num<=num+1;
case ({row_reg,col_reg})
4'b1010:
// if(cnt==20'hfffff)
begin
if(num < 10)
begin
num <= num +1'b1;
end
else
num <= 1'b0;
end
4'b1001:
// if(cnt==20'hfffff)
begin
if(num==0)
num <=9;
else
num <= num -1;
end
default:;//啥也不做
endcase
end
always @(clk_500khz) //or col_reg or row_reg or reset)
if(!reset)
begin
data_1=15;//复位全灭,显示模块只解析0-9,其他全为灭
data_10=15;
data_100=15;
data_1000=15;
end
else
// if(key_flag==1'b1)
begin
//case ({row_reg,col_reg})
// 4'b1010:
// begin
data_1=num;data_10=0;data_100=0;data_1000=10;
// end//key1
// 4'b1001:
// begin
// data_1=num;data_10=0;data_100=0;data_1000=10;
// end
// 4'b0110:begin data_1=3;data_10=0;data_100=0;data_1000=10;end
// 4'b0101:begin data_1=4;data_10=0;data_100=0;data_1000=10;end//key4
// default:;//啥也不做
// endcase
end
endmodule
module matrix_key
(
clk, //48MHZ
reset,
col, //列
row, //行
data_1,//键值,个位
data_10,//十位
data_100,//百位
data_1000 //千位
);
input clk,reset;
input [1:0] col;
output [1:0] row;
output [3:0] data_1,data_10,data_100,data_1000;
reg [1:0] row;
reg [3:0] data_1,data_10,data_100,data_1000;
reg [5:0] count;//delay_20ms
reg [2:0] state; //状态标志
reg key_flag; //按键标志位
reg clk_500khz; //500KHZ时钟信号
reg [1:0] col_reg; //寄存扫描列值
reg [1:0] row_reg; //寄存扫描行值
reg [19:0] cnt;
reg [3:0] num;
//initial begin num= 4'd0;end
always @(posedge clk or negedge reset)
if(!reset)
begin
clk_500khz =50)
begin
//cnt<=cnt+1;
clk_500khz<=~clk_500khz;
count<=0;
end
else
count<=count+1;
end
always @(posedge clk_500khz or negedge reset)
if(!reset)
begin
row<=2'b00;
state<=0;
end
else
// if(cnt==20'hfffff)
begin
case (state)
0:
begin
row[1:0]<=2'b00;
key_flag<=1'b0;
cnt<=0;
if(col[1:0]!=2'b11) //有键按下,扫描第一行
begin
state<=1;
row[1:0]<=2'b10;
end
else
state<=0;
end
1:
begin
if(col[1:0]!=2'b11)//判断是否是第一行
begin
state<=5;
end
else //准备扫描第二行
begin
state<=2;
row[1:0]<=2'b01;
end
end
2:
begin
if(col[1:0]!=4'b11) //判断是否是第二行
begin
state<=5;
end
else
begin
state<=0;//重新扫描
row[1:0]<=2'b00;
end
end
5:
begin
if(col[1:0]!=2'b11)
//if(cnt==15'hffff)
begin
if(cnt==15'hfff)
begin
cnt<=0;
row_reg<=row; //保存扫描列值
col_reg<=col; //保存扫描行值
key_flag<=1'b1; //有键按下
end
else
cnt<=cnt +1;
state<=5;
end
else
begin
state<=0;
end
end
endcase
end
always @(posedge clk_500khz or negedge reset)//(posedge clk_500khz) //or reset or row_reg or col_reg)
if(!reset)
begin
num<=1'b0;
end
else
if(cnt==15'hff)
begin
// if(key_flag==1'b1)
num<=num+1;
case ({row_reg,col_reg})
4'b1010:
// if(cnt==20'hfffff)
begin
if(num < 10)
begin
num <= num +1'b1;
end
else
num <= 1'b0;
end
4'b1001:
// if(cnt==20'hfffff)
begin
if(num==0)
num <=9;
else
num <= num -1;
end
default:;//啥也不做
endcase
end
always @(clk_500khz) //or col_reg or row_reg or reset)
if(!reset)
begin
data_1=15;//复位全灭,显示模块只解析0-9,其他全为灭
data_10=15;
data_100=15;
data_1000=15;
end
else
// if(key_flag==1'b1)
begin
//case ({row_reg,col_reg})
// 4'b1010:
// begin
data_1=num;data_10=0;data_100=0;data_1000=10;
// end//key1
// 4'b1001:
// begin
// data_1=num;data_10=0;data_100=0;data_1000=10;
// end
// 4'b0110:begin data_1=3;data_10=0;data_100=0;data_1000=10;end
// 4'b0101:begin data_1=4;data_10=0;data_100=0;data_1000=10;end//key4
// default:;//啥也不做
// endcase
end
endmodule
Modelsim 仿真一下