原创 关于按键消抖的理解:【基于特权FPGA教程第9讲】

2011-8-7 09:17 5188 5 6 分类: FPGA/CPLD

    关于按键消抖的理解:【基于特权FPGA教程第9讲】

 先列几个关键的点,理解了这几个点,其余都好理解。

key_rstkey_rst_r的关系如下:

20110609002408001.jpg

 

 


如果看了这张图还不理解的话,那就在传输线上标上一些符号就会明白了。

20110609002409002.jpg

 

 

 

 

 

 

 

 


当时钟信号的上升沿到来时,sw[3:1]的信号被key_rst[2:0]触发器接收,同时key_rst上的信号被key_rst_r触发器接收。这样的话,就能够得到sw[2:0]的两个状态。

②该程序的思路:

  当按键被按下时,会导致key_an不等于0,进而cnt=0;

   那么在cnt=20’hfffff时,low_sw会感受到sw的变化,不如变为”110”

   low_sw_r依旧为”111”,会导致led_ctrl=1,进而可以判断是哪一个键被按下。

③对于我之前一直怀疑的并行问题,不如如果两个always同时执行的话会同时对cnt进行赋值,会不会出现随机的现象。答案是不会,因为所谓的并行特性是指每时每刻各个语句都在被执行(相关器件在工作),但这只是从时间上说。如果从空间上进行理解(参考RTL图),我们会发现各个器件在空间上的连接是有一定次序的。举例如下:

源程序:

reg[19:0] cnt;//counter

 

 always @ (posedge clk or negedge rst_n)

       if(!rst_n) cnt <= 20'd0;

       else if(key_an) cnt <= 20'd0;

       else cnt <= cnt + 1'b1;

      

 reg[2:0] low_sw;

 

 always @ (posedge clk or negedge rst_n)

       if(!rst_n) low_sw <= 3'b111;

       else if(cnt == 20'hfffff)//20ms

         low_sw <= {sw3_n,sw2_n,sw1_n};

该段程序的功能:如果key_an不等于0cnt=0;如果cnt=20’hfffff就更新low_sw

我一开始想了这么一个问题,如果同时出现key_an=0cnt=20’hfffff那么这段程序是有毛刺的。我想了很长的时间,发现从程序的角度越想越感觉每段程序好像都有问题。但长期的经验告诉我,如果你刚开始学习一门新的技术,在知识结构没有完善之前,你那些所谓的思考都是没有任何益处的。最好的方法是先对相关的知识进行学习,比如看有关的书、视频。

       所以我打断了自己的思考,开始看RTL电路,我发现上述程序的RTL电路是这样的:

20110609002409003.jpg

 

 

 

 

 

 

 


【不过当触发器cnt[19:0]输出恰好为20’hfffff时会读到按键后的值,便立即认为键盘被按下,不过这样的概率为1/1000000

               这段程序增加了我对并行的理解。时间上同时运行,但空间上有先后顺序。

声明:

本文及其他我写的文章,皆是鄙人学习总结笔记。文中内容我会尽最大的努力保证正确,如你发现bug,请一定要通知我,我会按您的指导进行Debug

我相信交流是提高技术最好的方法。

文章评论1条评论)

登录后参与讨论

用户1631420 2011-6-13 12:39

受教,很仔细。 最后一句很到位。 就时钟而言,布线后也是有空间先后的,也就是延迟,抖动,只是在一定条件下,满足一些允许的误差范围。
相关推荐阅读
用户379271 2011-11-09 11:16
【S3C2440学习笔记】ADC&触摸屏
1         硬件原理图 触摸屏的电路还是比较复杂的,暂时先不考虑其具体电路,我们先总结出和CPU相连的管脚。   管脚 ...
用户379271 2011-10-31 15:34
怀念以前的EDNchina,怀念以前的气氛。
       今天好不容易将uboot-1.1.6移植到TQ2440上,本来想写篇博客总结一下,却怎么也找不到自己的博客了。登录之后,却满目狼藉。不想说什么了,不久前,就知道合并的事了,本希望它好...
用户379271 2011-10-21 08:23
Uboot在Nand Flash和SDRAM中的地址映射
1         我的困惑 (1)  .lds文件到底起什么作用 (2)  start.o中初始化和文字池的关系(汇编语言问题),以及的那几个变量的作用 注:本文是基于u-boot-1.1.6编写...
用户379271 2011-10-21 08:18
学习Uboot时的思考
其实,我在10月5日的时候就开始看Uboot了,但由于自己当时还不会ARM汇编,所以放下Uboot开始学习ARM汇编。之后又学习《ARM体系结构与编程》中的前五章的知识点,又写了一些小的验证理论的程...
用户379271 2011-10-17 00:41
指令LDR与伪指令LDR
1         指令LDR 应用举例: u       LDR R0, [R1, #4]     ;将内存单元R1+4中的字读取到R0寄存器 其中,R1为基址,#4为偏移地址,R0为目标地址。注...
用户379271 2011-10-13 07:21
ARM指令集学习笔记
目  录 1    ARM汇编指令格式... 3 2        数据处理指令... 4 3        存储器访问指令... 4 4        分支指令... 4 5        软中...
我要评论
1
5
关闭 站长推荐上一条 /2 下一条