Board logo

标题: 求助:如何正确使用2个按钮实现增减计数? [打印本页]

作者: dreamnova    时间: 2006-5-30 17:22     标题: 求助:如何正确使用2个按钮实现增减计数?

小弟乃Verilog的初学者,由于缺少经验,在这个问题上碰到了麻烦。


望大家指点一下,最好能给我一小段Verilog的代码。


作者: stone133    时间: 2006-5-30 19:30

if(reset)
my_counter<=0;
else if(add)
my_counter<=my_counter+1;
else if(minus)
my_counter<=my_counte-1;
else
my_counter<=my_counter;
作者: dreamnova    时间: 2006-5-30 23:26

谢谢。
不过这个还是不能达到期望的效果。
如果以时钟沿触发,按一下按钮会连续增或减,而不是按一下增一下,而使一按下去就经过了好几个时钟周期。
若用add或minus沿触发,则无法实现此功能,而且还有警告信息。
作者: waterlily    时间: 2006-5-31 09:23

if(reset)
my_counter<=0;
flag<=0;
else if(add and !flag)
my_counter<=my_counter+1;
flag<='1';
else if(minus and !flag)
my_counter<=my_counte-1;
flag<='1';
else if (!minus or !add)
flag<='0';
else
my_counter<=my_counter;
大概这个意思吧!因为一直用vhdl,这样写verilog如果语法不对再改改
作者: stone133    时间: 2006-5-31 18:04

这个问题的处理是另外一个问题了,就是按键处理,你可以通过加入消抖电路和微分电路来解决这个问题;
消抖电路可以得到一个确定的按键信号,微分电路可以把这个按键信号处理成一个时钟周期宽度的信号;
作者: dreamnova    时间: 2006-6-1 00:16

先谢谢两位版主。
我把waterlily 的那段改了下,结果仿真效果还不错,改成:

reg [2:0] led;
reg flag_add;
reg flag_minus;

always @(posedge osc or posedge rst)
begin
if (rst)
begin
led <= 0;
flag_add <= 0;
flag_minus <= 0;
end
else
begin
flag_add <= add;
flag_minus <= minus;

if (add && !flag_add)
begin
led <= led + 3'b1;
end
else if (minus && !flag_minus)
begin
led <= led - 3'b1;
end
else
led <= led;
end
end

不过 stone133 说的我还是不会弄,我刚学没多久,消抖电路和微分电路还不会,能不能给段代码参考参考?[upload=image/pjpeg]uploadImages/test.JPG[/upload]




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0