0

学fpga(按键输入)

 2 years ago
source link: https://blog.csdn.net/feixiaoxing/article/details/124068798
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

学fpga(按键输入)

费晓行 已于 2022-04-09 22:38:53 修改 435

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        按键输入,就是说电路板上有一个按键,希望内部系统对它有一个响应。可以试想一下,如果是纯软件来做,应该怎么开发?因为,大家都知道,按键本身是一个机械装置,按下去的时候会有一个抖动。等到再次抬上来的时候也会有一个抖动。所以,这个时候,如果是纯软件,通常会加一个延时来做处理。

        同样的,对fpga来说,也需要加一个延时处理,我们用wavedrom设计一下,json文件应该是这样的,

        转换成图形后,如下所示,

        如图所示,当发现key按下之后,其实key从1变成了0。这个时候key1和key2因为是寄存器,所以只能在时钟上升沿的时候才能检测到。此外,key2也是从key1传递过来的。所以,在key2即将发生翻转之前,count发现key2!=key1,就开始计数处理,这是因为需要防止在这过程中再次发生翻转。等到约定到一个数值的时候,比如为1,这个时候就可以说真的是发生了按键输入的操作,flag发生了置位。当然置位的时间不会很久。也就是一个clock之后,flag恢复为0。不过就是这个flag的翻转,决定了系统被通知到了,外面真的发生了按键输入的事件。所以,从key-》key1-》key2-》count-》flag,这一路过程中其实需要发生很多的变化。 

        有了上面的分析之后,我们就可以写verilog代码了,比如key1和key2,就比较简单,

        在所有的reg里面,count稍显复杂,关键部分就是处理好key1和key2的判断,

        有了count的计算,当然flag的处理就很简单了,

        看到这里,不知道大家有没有注意到,这里按键不管是按下,还是弹起来,都会触发count重新计数。如果这个时候,仅仅希望按下的时候开始计数怎么办呢?其实只需要给count添加一个判断条件就好了,

        所以,哪怕是很简单的按键输入功能,在fpga上面都需要考虑得复杂一些。当然,只要我们设计好时序图,照着图形开发,按部就班地去做,也是可以完全达到效果的。就算开发中出现错误,只要把仿真图形或者signal tap拿到的图形,和之前的图形对比一下,其实就知道错误发生在什么地方了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK