基本的点亮LED搞定了,然后按照左移右移写了一下流水灯的程序,问题也不大。昨天和今天测试了一下独立按键,昨天是根据自己的思路在做,一开始没有加消抖,不是很稳定,后来想着加个松手检测,使用了类似单片机机的死循环,也没有弄好,估计是always语句下每个时钟沿都会进一次,while在里面没派上用场。然后想着用上升沿触发按键,估计这上升沿和松手的功能是一样的。想着在always条件中用posedge key_in,没有成功,没有时钟源检测进入不了,在always语句里又不能使用posedge key_in。
今天看了按键篇的文档,对下降沿触发有了一个基本的了解,依葫芦画瓢照写程序,确实解决了昨天的抖动问题,不过下降沿检测的原理没有弄太明白,自己分析代码硬是没搞明白什么事儿:为什么每次判断按键都要检测两次呢?思考再三,终于弄明白了,第一次检测的值存储在下一个时钟沿到来时存储在第二个寄存器中,这样判断两次的值的变化,进而实现下降沿检测的效果。照着做了一下上升沿触发,也就是将
assign key_low = key_rst_r & (~key_rst);修改成了
assign key_low = (~key_rst_r) & key_rst;
实现了单片机的松手检测。
Verilog HDL和C语言还是不一样,C语言是顺序执行的,Verilog是上电后大家一起执行。
按键告一段落,这样的上升沿、下降沿触发方式,还真有点意思!学习了!!