Fpag学习记录-lab-01!
这次的作业不难,但是有很多细节的地方。先分别讲讲这次作业,这次有两个作业
作业1
实现上次的流水灯,并且增加一些小功能,每间隔0.25s显示一盏流水灯,在1s内显示4盏流水灯。
增加一个暂停按键:当这个按键按下的时候,counter停止计数,但是后台继续。此时流水灯由一个周期3s变成一个周期2s,后面的2s不显示counter
增加一个复位按键: 当这个按键按下的时候,将counter进行复位清零.流水灯的计数开始
实现按键消抖,自己编写软件消或者调用demo里面的模块函数
难点
- 我一开始忽略的问题:我拿了老师给我资料里面的key_test,直接拿过来跑,但是我没有注意到一个点,非常关键的点:就是:按键消除抖动。我一开始的思路是,当检测到按键按下的时候,counter计数器被屏蔽,我一开始认为这个非常简单,但是当我尝试将demo里面的key_test和我上次的流水灯合并的时候,我发现我的按键并不起作用。
- 询问gpt:经过了多次尝试之后,我按下按键,发现板子毫无反应,肯定是我的某个地方的代码出现了问题。于是我拿着问题去询问gpt,我的提问是“帮我加入一个按键功能的代码,当我按下这个按键的时候,要暂停counter的计数”。Gpt给了我代码,我基本也能看懂,但是我直接拿到编译器跑这段代码时候,虽然编译是没有问题的,但是结果和我之前是完全一样———我的板子毫无反应。于是我发现我的步子迈得太大了,于是我打算先做一些baby steps。先实现一个更简单的功能。我先让Gpt帮忙,帮我把最简单的key_test修改成按一下按键,可以打开所有的LED灯。结果是,我可以在key_test上面用单次的按钮按下实现开灯关灯,但是我的流水灯计数器counter一直无法被我的按键禁用———证明我的按键在流水灯程序按下的时候,并没有被检测到。
- 我的尝试并陷入僵局:为什么会这样子,经历了一个焦头烂额的思考过程之后,我想到了可能是按键消除抖动的原因,我询问了Gpt并让他给我加入了按键消抖,但是我发现效果并没有变化,这时候项目已经进入了僵局了,因为Gpt的代码看起来没有任何问题。
- 查看demo和文档,和在B站视频上找到类似的解决方案:我看了一下demo里面,有一个关于按键消抖的项目文件,我打开看了一下,发现我不太能理解。然后我打开b站视频看了一下野火fpga的教程,看了一下关于fpga的按键消抖动的原理以及代码实现。具体的原理,不在这里过多展开,设计到一些时序以及锁存器的知识。
- 最终的解决方案:于是我使用了demo里面关于按键消除抖动的一个函数”ax_debounce”,简单的说,就是通过输入一个由于机械特性不稳抖动的按键参数,函数可以输出的一个稳定的输出。也就是这个函数,可以将不稳定的按键输入,变成稳定的按键输出。这正是我想要的东西!在知道了这个函数模块可以帮助我消除抖动之后,一切的问题就变得迎刃而解了
- 需要注意的小细节:在获得了稳定的键盘输入之后,我们可以将用一个使能端enbale来启用我们的计数器。要注意是使能端的位置,不能使用(timer == 149_999_999 && enbale),因为这个会让timer在达到3s的时候,无法归零,所以3s计时器不应该使用使能端来判断。
作业2
- 作业二是实现一个1s的数码管,以及上周作业的流水灯
- 每当数码管增加1s,流水灯4个循环一次
- 增加一个暂停功能的按键,当按下的时候数码管停止计数
实现过程
- 有了前两个作业的经验,其实这个作业不难,很快就做好了,大部分都是在copy and paste前面的东西,虽然这个项目的代码是最多的,文件也是最多的,但是大部分都是默认配置一些数码管解码,数码管扫描的东西.我认为不需要太深,究里面的原理
- 具体步骤:增加按键识别,调用消抖函数,增加识别标志位,将上周作业与数码管的demo seg_test合并在一起,完成
总结
要学会使用函数,整体思维是很关键,不要过于深究内部的东西
学会使用GPT,虚心请教
本文由作者按照 CC BY 4.0 进行授权