本帖最后由 徐林如风 于 2015-10-21 00:39 编辑
- module key_led(key_add, key_sub, Rst_n, out_sel, out_bit);
- input key_add;
- input key_sub;
- input Rst_n;
- output [5:0]out_sel;
- output [7:0]out_bit;
-
- reg [5:0]out_sel; //数码管段控制
- reg [7:0]out_bit; //数码管位控制
- reg [3:0]counter;
-
- always@(negedge key_add or negedge key_sub or negedge Rst_n)
- begin
- if (Rst_n == 0)
- counter <= 4'd0;
- else if (key_add == 0)
- counter <= counter + 1'b1;
- else if (key_sub == 0)
- counter <= counter - 1'b1;
- else
- counter <= counter;
- end
-
- always
- begin
- out_sel = 6'b011111;
- end
-
- always@(counter)
- begin
- case (counter)
- 4'd0: out_bit = 8'b1100_0000;
- 4'd1: out_bit = 8'b1111_1001;
- 4'd2: out_bit = 8'b1010_0100;
- 4'd3: out_bit = 8'b1011_0000;
- 4'd4: out_bit = 8'b1001_1001;
- 4'd5: out_bit = 8'b1001_0010;
- 4'd6: out_bit = 8'b1000_0010;
- 4'd7: out_bit = 8'b1111_1000;
- 4'd8: out_bit = 8'b1000_0000;
- 4'd9: out_bit = 8'b1001_1111;
- default: out_bit = 8'b1111_1111;
- endcase
- end
-
- endmodule
-
复制代码
一个很简单的功能,就是设定counter为计数器,key_add电平变化时counter加一,key_sub电平变化时counter减一,然后把counter的数值送到数码管中显示出来。在运行的时候总是出现一些很诡异的问题,不知是何原因,还请各位大神帮忙看看,谢谢了!
1、从第一个always来看,你的counter是通过下降沿出发,不是通过电平变化;
2、你的数码管控制应该是分时控制的,需要动态刷新显示你的各个数码管;
谢谢你的答复,关于你提出的两点意见,我之前也有过尝试
1、我把第二个always块里面的条件有设成过和第一个always块一样,但是问题还是存在;
2、我目前还没做到动态显示那个步骤,仅仅是在单一的一个数码管中显示数据,所以就没用到动态刷新了;
另外相关出现的一些诡异的问题包括
我在按下减一的按钮后,明明那个按键对应的电平变化只出现了一次,但是在显示的时候数据却是一直在降低,不知是何原因,还请再指点一下,谢谢!
谢谢你的意见!我有试过消抖的方法了,但是问题依然存在,下面是我实现的代码,麻烦你看看是否有什么不对的地方,谢谢!我的想法就是在检测到电平变化以后延时一段时间,如果仍然是低电平的话,就认为这是一次正确的按键按下动作。
- reg [19:0]buffer;
- always@(negedge key_add or negedge key_sub or negedge Rst_n)
- begin
- if (Rst_n == 0)
- counter = 4'd0;
- else if (key_add == 0)
- begin
- for ( buffer = 0; buffer < 20'hfffff; buffer = buffer + 1 );
- if (key_add == 0) begin counter = counter + 1'b1; buffer = 20'h0; end
- else counter = counter;
- end
- else if (key_sub == 0)
- begin
- for ( buffer = 0; buffer < 20'hfffff; buffer = buffer + 1 );
- if (key_sub == 0) begin counter = counter - 1'b1; buffer = 20'h0; end
- else counter = counter;
- end
- else
- counter = counter;
- end
复制代码一周热门 更多>