OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7165|回复: 2

[ALTERA] 新起点FPGA之top_key_beep仿真问题

[复制链接]

14

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2020-12-19
在线时间
18 小时
发表于 2021-8-21 23:54:02 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 1289251272 于 2021-8-22 00:03 编辑

问:红线间内beep为什么会上下跳动?
描述:程序里面只有如图右边代码所示的地方对beep进行操作,
显然只有key_flag = 1 并且key_value = 0时候,所以beep会进行跳变,这显然不是我们想要的结果

1629561001(1).jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2020-12-19
在线时间
18 小时
 楼主| 发表于 2021-8-22 00:13:36 | 显示全部楼层
问题就出现在了我的.v文件代码里面,我们可以顺藤摸瓜的想:
(1)beep发生了跳变,说明对key_flag=1,key_value=0这个操作一直在进行。
(2)对key_flag=1,key_value=0这个操作发生在key_debounce里面
(3)找到可能让key_flag=1,key_value=0的地方——第36行
(4)说明delay_cnt一直=20’d0。
(5)找到delay_cnt最后一次让他=20’d0的地方——第23-27行。
所以说整个程序就是delay_cnt会递减到0,
如果用else if(delay_cnt == 20'd0)就会一直成立,这显然不是我们想要的结果,
那么就应该按照例程来写else if(delay_cnt == 20'd1)......

.v代码.jpg
回复

使用道具 举报

14

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2020-12-19
在线时间
18 小时
 楼主| 发表于 2021-8-22 00:37:04 | 显示全部楼层
.v代码第36行delay_cnt == 20'd0 的另一个问题:
波形图中:左1红线时刻为复位完后的第一个sys_clk上升沿,
由于程序是复位完后:delay_cnt = 20'd,
所以左1红线时刻执行了代码第36行,
使得key_flag = 1,key_value = 0,
在下一个sys_clk上升沿时,即左2红线时刻,满足
else if(key_flag && (~key_value))
             beep <= ~beep;
导致按键明明没有按下,beep却发生跳转的现象。
此后执行的是.v代码第40行else,使得flag = 0,不再跳转beep。
然后当delay_cnt减到0时,又执行了第36行delay_cnt == 20'd0,
并且一直执行这里,导致beep连续上下跳变
Wave.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 20:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表