VHDL脉冲边沿检测问题求助!急急急
时间:10-02
整理:3721RD
点击:
我做的一个按键控制的小程序,想实现按下up键发光二极管左移一位,down键发
光二极管右移一位。刚开始进程代码如下
process(up,down)
begin
if rising_edge(up) then
mode0 <= mode0(14 downto 0) & mode0(15) ;
end if;
if rising_edge(down) then
mode0 <= mode0(0) & mode0(15 downto 1) ;
end if ;
end if ;
end process;
经过综合,发现提示mode0不能被综合,后来用了一个快速始终来检测,代码变
成了下面的形式
process(up,down)
begin
if (rising_edge(sysclk)) then
if (up = '1') then
mode0 <= mode0(14 downto 0) & mode0(15) ;
end if;
if (down = '1') then
mode0 <= mode0(0) & mode0(15 downto 1) ;
end if ;
end if ;
end process;
这样虽然能够综合通过,但是由于sysclk非常快,按键的过程up或者down高电平
持续时间远远大于sysclk的周期,这样按一次键,不知道mode0被移位了多少次
了。想请问一下各位这种情况应该怎么解决?
光二极管右移一位。刚开始进程代码如下
process(up,down)
begin
if rising_edge(up) then
mode0 <= mode0(14 downto 0) & mode0(15) ;
end if;
if rising_edge(down) then
mode0 <= mode0(0) & mode0(15 downto 1) ;
end if ;
end if ;
end process;
经过综合,发现提示mode0不能被综合,后来用了一个快速始终来检测,代码变
成了下面的形式
process(up,down)
begin
if (rising_edge(sysclk)) then
if (up = '1') then
mode0 <= mode0(14 downto 0) & mode0(15) ;
end if;
if (down = '1') then
mode0 <= mode0(0) & mode0(15 downto 1) ;
end if ;
end if ;
end process;
这样虽然能够综合通过,但是由于sysclk非常快,按键的过程up或者down高电平
持续时间远远大于sysclk的周期,这样按一次键,不知道mode0被移位了多少次
了。想请问一下各位这种情况应该怎么解决?
可以做一个分频模块,加大系统时钟周期,这样读取的数据应该是稳定的!
是,这种方法是最容易想到的,但是每次按键有效的时间都不是固定的,没法保证在按键有效的时间内系统时钟就只出现了一个上升沿啊!
检测到一次变化 做一个延时?
能不能说的详细一点?
做一个边沿检测电路就可以了。可以参考:
http://fpgaw.com/home/space.php?uid=2634
里面有一个边沿检测的Verilog的代码,可以实现你想要的功能。
4楼的意思是在系统时钟一定的条件下,利用检测电路,检测到一个上升沿时,延时一个周期再获取下一个上升沿1
在检测到上升沿之后,对高电平维持的时间进行计数,低电平会将该计数值复位,当计数值达到某个预定值的时候,也就是高电平维持时间超过一段时间之后(比如1ms)才认为是一次有效的按键操作,不知道说清楚没有。
感谢大家了,问题已经解决了,把原来的信号延时一个时钟周期,然后用延时后信号的非去与原来的信号,就得到一个持续一个时钟的脉冲,然后检测这个脉冲就搞定了。非常感谢大家的热心帮助。
关注ing~
非常感谢!
考虑D触发器实现,D触发器具有天然的延后一个CLOCK的功能
