微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > VHDL脉冲边沿检测问题求助!急急急

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被移位了多少次
了。想请问一下各位这种情况应该怎么解决?

可以做一个分频模块,加大系统时钟周期,这样读取的数据应该是稳定的!



    是,这种方法是最容易想到的,但是每次按键有效的时间都不是固定的,没法保证在按键有效的时间内系统时钟就只出现了一个上升沿啊!

检测到一次变化 做一个延时?



    能不能说的详细一点?

做一个边沿检测电路就可以了。可以参考:
http://fpgaw.com/home/space.php?uid=2634
里面有一个边沿检测的Verilog的代码,可以实现你想要的功能。

4楼的意思是在系统时钟一定的条件下,利用检测电路,检测到一个上升沿时,延时一个周期再获取下一个上升沿1

在检测到上升沿之后,对高电平维持的时间进行计数,低电平会将该计数值复位,当计数值达到某个预定值的时候,也就是高电平维持时间超过一段时间之后(比如1ms)才认为是一次有效的按键操作,不知道说清楚没有。

感谢大家了,问题已经解决了,把原来的信号延时一个时钟周期,然后用延时后信号的非去与原来的信号,就得到一个持续一个时钟的脉冲,然后检测这个脉冲就搞定了。非常感谢大家的热心帮助。

关注ing~

非常感谢!

考虑D触发器实现,D触发器具有天然的延后一个CLOCK的功能

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top