Verilog按键控制数码管代码求助

2019-07-15 23:23发布

本帖最后由 徐林如风 于 2015-10-21 00:39 编辑
  1. module key_led(key_add, key_sub, Rst_n, out_sel, out_bit);

  2.         input key_add;
  3.         input key_sub;
  4.         input Rst_n;
  5.         output [5:0]out_sel;
  6.         output [7:0]out_bit;
  7.         
  8.         reg [5:0]out_sel;     //数码管段控制
  9.         reg [7:0]out_bit;     //数码管位控制
  10.         reg [3:0]counter;
  11.         
  12.         always@(negedge key_add or negedge key_sub or negedge Rst_n)
  13.                 begin
  14.                         if (Rst_n == 0)
  15.                                 counter <= 4'd0;
  16.                         else if (key_add == 0)
  17.                                 counter <= counter + 1'b1;
  18.                         else if (key_sub == 0)
  19.                                 counter <= counter - 1'b1;
  20.                         else
  21.                                 counter <= counter;
  22.                 end
  23.                         
  24.         always
  25.                 begin
  26.                         out_sel = 6'b011111;
  27.                 end
  28.                
  29.         always@(counter)
  30.                 begin
  31.                         case (counter)
  32.                                 4'd0: out_bit = 8'b1100_0000;
  33.                                 4'd1: out_bit = 8'b1111_1001;
  34.                                 4'd2: out_bit = 8'b1010_0100;
  35.                                 4'd3: out_bit = 8'b1011_0000;
  36.                                 4'd4: out_bit = 8'b1001_1001;
  37.                                 4'd5: out_bit = 8'b1001_0010;
  38.                                 4'd6: out_bit = 8'b1000_0010;
  39.                                  4'd7: out_bit = 8'b1111_1000;
  40.                                 4'd8: out_bit = 8'b1000_0000;
  41.                                 4'd9: out_bit = 8'b1001_1111;
  42.                                 default: out_bit = 8'b1111_1111;
  43.                         endcase
  44.                 end
  45.                
  46. endmodule
  47.                  
复制代码



一个很简单的功能,就是设定counter为计数器,key_add电平变化时counter加一,key_sub电平变化时counter减一,然后把counter的数值送到数码管中显示出来。在运行的时候总是出现一些很诡异的问题,不知是何原因,还请各位大神帮忙看看,谢谢了!



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
specil_y
1楼-- · 2019-07-16 03:50
以下问题提供你参考,
1、从第一个always来看,你的counter是通过下降沿出发,不是通过电平变化;
2、你的数码管控制应该是分时控制的,需要动态刷新显示你的各个数码管;
徐林如风
2楼-- · 2019-07-16 08:18
specil_y 发表于 2015-10-21 09:03
以下问题提供你参考,
1、从第一个always来看,你的counter是通过下降沿出发,不是通过电平变化;
2、你的数码管控制应该是分时控制的,需要动态刷新显示你的各个数码管;

谢谢你的答复,关于你提出的两点意见,我之前也有过尝试
1、我把第二个always块里面的条件有设成过和第一个always块一样,但是问题还是存在;
2、我目前还没做到动态显示那个步骤,仅仅是在单一的一个数码管中显示数据,所以就没用到动态刷新了;

另外相关出现的一些诡异的问题包括
我在按下减一的按钮后,明明那个按键对应的电平变化只出现了一次,但是在显示的时候数据却是一直在降低,不知是何原因,还请再指点一下,谢谢!
luckyb1
3楼-- · 2019-07-16 12:31
我记得明德扬点拨FPGA基础视频有Verilog的讲解,可以参考。
specil_y
4楼-- · 2019-07-16 14:10
 精彩回答 2  元偷偷看……
徐林如风
5楼-- · 2019-07-16 16:18
specil_y 发表于 2015-10-21 10:36
如果是按键按下一次确数据一直变化,就是你的按键抖动太严重,或者查看下你的按键电路上下拉是否正确。

谢谢你的意见!我有试过消抖的方法了,但是问题依然存在,下面是我实现的代码,麻烦你看看是否有什么不对的地方,谢谢!我的想法就是在检测到电平变化以后延时一段时间,如果仍然是低电平的话,就认为这是一次正确的按键按下动作。
  1.         reg [19:0]buffer;
  2.         always@(negedge key_add or negedge key_sub or negedge Rst_n)
  3.                 begin
  4.                         if (Rst_n == 0)
  5.                                 counter = 4'd0;
  6.                         else if (key_add == 0)
  7.                                 begin
  8.                                         for ( buffer = 0; buffer < 20'hfffff; buffer = buffer + 1 );
  9.                                         if (key_add == 0)        begin counter = counter + 1'b1; buffer = 20'h0; end
  10.                                         else counter = counter;
  11.                                 end
  12.                         else if (key_sub == 0)
  13.                                 begin
  14.                                         for ( buffer = 0; buffer < 20'hfffff; buffer = buffer + 1 );
  15.                                         if (key_sub == 0)        begin counter = counter - 1'b1; buffer = 20'h0; end
  16.                                         else counter = counter;
  17.                                 end
  18.                         else
  19.                                 counter = counter;
  20.                 end
复制代码
hao4111
6楼-- · 2019-07-16 22:16
 精彩回答 2  元偷偷看……

一周热门 更多>