使用PMOD键盘,扫描并且在七段数码管显示,综合正确,但是下载后结果不对,可能与几个warnings 有关系,但是我不懂如何消除 。求大神指导
module keyscan(clk,
rst_n,
keyscan,
keyin,
real_number);/////////////////////////////////////////////////////////////////////////////////
input clk,rst_n;
input[3:0] keyin;
output[3:0] keyscan;
output reg[4:0] real_number;
reg[3:0] state;
reg[3:0] four_state;
reg anykeypress;
reg[4:0] numberout,number_reg,number_reg1;//
reg[3:0] scancode;
reg[3:0] scan_state;
assign keyscan = scancode;
always@(posedge clk or posedge rst_n) // part 1 : 状态机,确定是哪一行数据
if(rst_n)
begin
scancode <= 4'b0000;
scan_state <= 4'b0000;
end
else
if(anykeypress) // 有健按下
case(scan_state)
4'b0000 : begin scancode <=4'b1110 ; scan_state <= 4'b0001 ; end // 状态机 跳变
4'b0001 : begin scancode <= {scancode[0],scancode[3:1]} ; end // 状态依靠移位实现
endcase
else /// ini
tial state
begin
scancode<= 4'b0000;
scan_state <= 4'b0000;
end
always@(posedge clk ) // part 2 : 检测按键是否按下
if(!(&keyin)) //
begin
anykeypress <=1;
four_state<= 4'b0000; //
end
else /// fourstate 就是用来延时一下
if(anykeypress)
case(four_state)
4'b0000 : begin anykeypress <= 1 ;four_state <= 4'b0001; end //
4'b0001 : begin anykeypress <= 1 ;four_state <= 4'b0010; end
4'b0010 : begin anykeypress <= 1 ;four_state <= 4'b0100; end
4'b0100 : begin anykeypress <= 1 ;four_state <= 4'b1000; end
4'b1000 : begin anykeypress <= 0 ; end /// ?
default : anykeypress <= 0;
endcase
else
four_state <= 4'b0000;
always@(posedge clk) // 利用扫描码和输出值确定按下的键盘值
casex({scancode,keyin}) //x 代表无关项
8'b0111_1110 : numberout <= 5'd0;
8'b1011_1110 : numberout <= 5'd1;
8'b1101_1110 : numberout <= 5'd2;
8'b1110_1110 : numberout <= 5'd3;
8'b0111_1101 : numberout <= 5'd4;
8'b1011_1101 : numberout <= 5'd5;
8'b1101_1101 : numberout <= 5'd6;
8'b1110_1101 : numberout <= 5'd7;
8'b0111_1011 : numberout <= 5'd8;
8'b1011_1011 : numberout <= 5'd9;
8'b1101_1011 : numberout <= 5'd10;
8'b1110_1011 : numberout <= 5'd11;
8'b0111_0111 : numberout <= 5'd12;
8'b1011_0111 : numberout <= 5'd13;
8'b1101_0111 : numberout <= 5'd14;
8'b1110_0111 : numberout <= 5'd15;
default:numberout <= 8; /// mistakes ...
endcase
always@(posedge clk or posedge rst_n) // part4 : 寄存数值
if(rst_n)
number_reg <= 0;
else
number_reg <= numberout;
always@(posedge clk or posedge rst_n) /// part5 :消除抖动
if(rst_n)
state<=4'b000;
else
case(state) // 按键消除抖动 ,不记录按键时间低于15的按键值
4'd0:begin
number_reg1 <= number_reg;
state <= 4'd1 ;
end
4'd1: begin
if(number_reg == number_reg1)
state <= 4'd2;
else
state <= 4'd0;
end
4'd2 : begin
if(number_reg == number_reg1)
state <= 4'd3;
else
state <= 4'd0;
end
4'd3 : begin
if(number_reg == number_reg1)
state <= 4'd4;
else
state <= 4'd0;
end
4'd4 : begin
if(number_reg == number_reg1)
state <= 4'd5;
else
state <= 4'd0;
end
4'd5 : begin
if(number_reg == number_reg1)
state <= 4'd6;
else
state <= 4'd0;
end
4'd6 : begin
if(number_reg == number_reg1)
state <= 4'd7;
else
state <= 4'd0;
end
4'd7 : begin
if(number_reg == number_reg1)
state <= 4'd8;
else
state <= 4'd0;
end
4'd8 : begin
if(number_reg == number_reg1)
state <= 4'd9;
else
state <= 4'd0;
end
4'd9 : begin
if(number_reg == number_reg1)
state <= 4'd10;
else
state <= 4'd0;
end
4'd10 : begin
if(number_reg == number_reg1)
state <= 4'd11;
else
state <= 4'd0;
end
4'd11 : begin
if(number_reg == number_reg1)
state <= 4'd12;
else
state <= 4'd0;
end
4'd12 : begin
if(number_reg == number_reg1)
state <= 4'd13;
else
state <= 4'd0;
end
4'd13 : begin
if(number_reg == number_reg1)
state <= 4'd14;
else
state <= 4'd0;
end
4'd14 : begin
if(number_reg == number_reg1)
state <= 4'd15;
else
state <= 4'd0;
end
4'd15:begin
if(number_reg == number_reg1)
begin
state <= 4'd0;
real_number <= number_reg;// 数据传输
end
else
state <= 4'b0000;
end
default: state <= 4'b0000;
endcase
endmodule
warning:
WARNING:Xst:1710 - FF/Latch <numberout_4> (without init value) has a constant value of 0 in block <u2>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <number_reg_4> (without init value) has a constant value of 0 in block <u2>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <number_reg1_4> (without init value) has a constant value of 0 in block <u2>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <real_number_4> (without init value) has a constant value of 0 in block <u2>. This FF/Latch will be trimmed during the optimization process.
WARNING:Xst:2404 - FFs/Latches <numberout<4:4>> (without init value)
have a constant value of 0 in block <keyscan>. //// 为啥会是恒定0? 搞死人了
WARNING:Xst:2404 - FFs/Latches <number_reg<4:4>> (without init value) have a constant value of 0 in block <keyscan>.
WARNING:Xst:2404 - FFs/Latches <number_reg1<4:4>> (without init value) have a constant value of 0 in block <keyscan>.
WARNING:Xst:2404 - FFs/Latches <real_number<4:4>> (without init value) have a constant value of 0 in block <keyscan>.
一周热门 更多>