这是一个简单的按键控制数码管,我却找了三天的问题

2020-02-02 10:45发布


  1. `timescale 1ns / 1ps
  2. //按键调试数码管显示,key1 归零,key2 +1。数值为0~9
  3. module a(
  4.         input clk,
  5.         input [1:0] key,
  6.         output [7:0] dig,
  7.         output [0:5] sel
  8. );

  9. //寄存器定义
  10. reg [19:0] delay; //延时20ms,判断按键
  11. reg [1:0] key_scan;//扫描20mS后按键
  12. reg [1:0] key_scan_r;//扫描按键
  13. reg [7:0] numb;//需要显示的初始值
  14. reg [3:0] ha;  //选择数字
  15. initial begin ha = 4'd5;end
  16. initial begin
  17.         numb <= 8'b0;
  18.         key_scan <= 2'b11;
  19.         key_scan_r <= 2'b11;        //初值都为1,计算后结果与key_true初值相同,在开始时不会触发numb变化,才会显示初值5
  20.         delay <= 20'd0;
  21.         end

  22. //*************扫描按键**************
  23. //说明:分两个寄存器采样,一个使用时钟频率,一个使用时钟频率分频后的频率,既可看成一个为检测初始信号,另一个延时20mS做确认
  24. always @(posedge clk) //扫描20mS后的按键
  25.         begin
  26.                 if (delay == 20'd999_999)//999_999
  27.                         begin
  28.                                 delay <= 20'b0;
  29.                                 key_scan <= key;  //若计满20ms采样按键输入
  30.                         end
  31.                 else delay <= delay + 20'b1; //计数加一
  32.         end

  33. always @(posedge clk) //扫描按键
  34.         key_scan_r <= key;

  35. wire [1:0] key_true = (~key_scan[1:0]) & (key_scan_r[1:0]);//确认按键

  36. //*****被选择数字存入寄存器*******
  37. always @(ha)
  38.         case (ha)
  39.                 4'd0: numb <= 8'hc0;
  40.                 4'd1: numb <= 8'hf9;
  41.                 4'd2: numb <= 8'ha4;
  42.                 4'd3: numb <= 8'hb0;
  43.                 4'd4: numb <= 8'h99;
  44.                 4'd5: numb <= 8'h92;
  45.                 4'd6: numb <= 8'h82;
  46.                 4'd7: numb <= 8'hf8;
  47.                 4'd8: numb <= 8'h80;
  48.                 4'd9: numb <= 8'h90;
  49.                 default: numb <= 8'hc0;
  50.         endcase
  51.        
  52. //***********按键选择数字*****************
  53. always @(posedge clk)
  54.         begin
  55.                 if(key_true[0]) ha <= 4'b0000;
  56.                 if(key_true[1])
  57.                 begin
  58.                         if(ha < 4'd9)
  59.                                 ha <= ha + 4'd1;
  60.                         else ha <= 4'd9;
  61.                 end
  62.         end

  63. //*****取出当前显示数值(BCD译码)*********


  64. assign dig = numb;
  65. assign sel = 6'b1101_11;
  66. endmodule
复制代码
这是我的程序,下边的“BCD译码”还未写可以忽略,这个程序出现的问题是,逻辑看起来并没有任何问题,但烧进去后,按键并未使它正确+1。程序中设定是按到9就不再加了,但我按一次就会直接跳到9。我在二楼贴出别人的程序别人可以正常使用的程序并提出我的一些其他疑问。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。