2019/01/08,第一个判断是否有按键按下的操作好像有问题,有空在修改!
红色为修改部分:
问题描述:
当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED熄灭,按键控制LED亮灭
下面是LED灯的原理图:
可见,LED是低电平亮,高电平灭。
事实上,控制LED等的亮灭很简单,不是问题,对应的代码段如下:
reg d1;
reg d2;
reg d3;
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
d1 <= 1'b0;
d2 <= 1'b0;
d3 <= 1'b0;
end
else begin //某个按键值变化时,LED将做亮灭翻转
if ( led_ctrl[0] ) d1 <= ~d1;
if ( led_ctrl[1] ) d2 <= ~d2;
if ( led_ctrl[2] ) d3 <= ~d3;
end
assign led_d3 = d1 ? 1'b1 : 1'b0; //LED翻转输出
assign led_d2 = d2 ? 1'b1 : 1'b0;
assign led_d1 = d3 ? 1'b1 : 1'b0;
我来做出解释:
首先,系统复位时候,先把寄存器变量d1、d2、d3清零,由下面这三天语句可知,这三个寄存器变量清零后,对应的led灯就是低电平,也就是亮。
assign led_d3 = d1 ? 1'b1 : 1'b0; //LED翻转输出
assign led_d2 = d2 ? 1'b1 : 1'b0;
assign led_d1 = d3 ? 1'b1 : 1'b0;
然后如果某个按键按下,对应的led_ctrl[?]就会变成高电平,此时对应的d?就会翻转电平值,也就是说原来led?是低电平,按键按下后,d?就会翻转为高电平,此时,对应的led灯自然也会由亮变灭了。继续按下按键,led的亮灭又会翻转。
(这些分析都是本人通过代码以及实验结果证明的,确实如此。)
不得不说,如果仅仅是上面的分析那么简单,就省事了,同时这个实验也没啥意思了。
事实的情况我根据理解做如下的描述:
按键按下时候,按键值有一段时间的低电平,我们必须在低电平这段时间内的某一个瞬间采样按键值来控制led灯的亮灭。
可能不能采样对是一个值得研究的问题。
先给出按键的大概电路图;
对这个电路图的一些解释:
独立按键一般有2组管脚,这2组管脚在按键未被按下时是断开的,在按键被按下时则是导通的。
基于此原理,我们一般会把按键的一个管脚接地,另一个管脚上拉到VCC,并且也连接到GPIO。这样,在按键未被按下时,GPIO的连接状态为上拉到VCC,则键值为1;按键被按下时,GPIO虽然还是上拉到VCC,但同时被导通的另一个管脚拉到地了,所以它的键值实际上是0</