世俱杯 2025

登录 免费注册 世俱杯 2025 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

问个硬件消抖的问题

作者:civita 栏目:EDA技术
问个硬件消抖的问题
想用硬件描述语言作一个消抖电路
基本思想是在按下键时保持该电平并计时10ms消抖
时钟输入1MHZ
但是反复思考都不能成功描述该功能
希望高手们给点意见

2楼: >>参与讨论
xhjiang
我前不久刚写过这个程序
我用了两个D触发器进行采样,采样时钟信号的频率干好为10MS(经分频得到),把两个D触发器的输出信号相与就得到去抖信号。但是你要进行按键译码的话要用到扫描信号,所以按键扫描信号要用采样时钟信号锁存后,才可以得到正确的按键译码信号。具体的问题你还是要仔细的分析你的时序,我当时用了一天的时间才把它调试好的,就是它的去抖问题时序没有匹配好译码不正确。

3楼: >>参与讨论
oaipoaip
参考一下,没编译过不一定没错误
entity debounce is
    PORT(
        clk:in std_logic;
        enable:in std_logic;
        data:in std_logic;
        q:buffer std_logic
    );
end debounce;

architecture behave of debounce is
signal count:integer range 99 downto 0;
begin
    PROCESS(clk)
    begin
        if rising_edge(clk) then
            if enable='1' and q/=data then
                if count=99 then
                    q<=data;
                else
                    count<=count+1;
                end if;
            else
                count<=0;
            end if;
        end if;
    end PROCESS;
end behave;


4楼: >>参与讨论
civita
问题已解决,虽然描述长了点,不过将就了
昨天用了一晚得时间,同时感谢以上提示我的朋友,发上源程序以供交流
同时,楼上的vhd程序描述的功能我不明白。enable是什么信号,从哪里来?
MODULE buton_delay(k,clk,k1);
parameter size=17,m=17'h1b000,zero=17'h00000;
reg[size:1] ctre;
input k,clk;
OUTPUT k1;
reg stb,ks,clk1;
reg[2:1] creg;
always@(posedge clk)
begin
    clk1=!(clk1);
end
always@(posedge clk1)
begin
    if(k&(!creg[2])&(!creg[1]))
        begin
        creg=2'b01;
        ks=1'b1;
        end
    else if((!creg[2])&(creg[1])&(!stb))
        begin
        creg=2'b11;
        ks=1'b1;
        end
    else if((creg[2])&(creg[1])&(!k))
        begin
        creg=2'b10;
        ks=1'b0;
        end
    else if((creg[2])&(!creg[1])&(!stb))
        begin
        creg=2'b00;
        ks=1'b0;
        end
    else if(stb) ks=ks;
    else ks=k;
end
always@(posedge clk)
begin
    if(creg==2'b01)
    begin
        if(ctre==zero)
            begin
                ctre=ctre+1'b1;
                stb=1'b1;
            end
        else
            case(ctre)
                m:stb=1'b0;
                default:ctre=ctre+1'b1;
            endcase                
    end
    else if(creg==2'b10)
    begin
        if(ctre==m)
            begin
                ctre=ctre-1'b1;
                stb=1'b1;
            end
        else
            case(ctre)
                zero:stb=1'b0;
                default:ctre=ctre-1'b1;
            endcase
    end
    else stb=1'b0;
end
assign k1=ks;
endMODULE

* - 本贴最后修改时间:2005-12-9 0:08:11 修改者:civita

5楼: >>参与讨论
civita
还有,我的时钟是11.0592M
还有,我的时钟是11.0592M

6楼: >>参与讨论
oaipoaip
enable是使能信号
enable是外部输入的,如果不需要enable直接去掉就可以了,模块工作的时候是通过判断100个时钟周期(10ms)内输入和输出的差异来消除抖动的,只有在输入输出信号的差异保持10ms才认为输入信号发生变化,10ms以内认为是抖动。

7楼: >>参与讨论
civita
了解了,果然如此
楼上的是强人哈

8楼: >>参与讨论
hnzsj
真牛
真牛

参与讨论
昵称:
讨论内容:
 
 
相关帖子
请问quartus2的5.0和5.1版本有什么区别啊?
cpld或fpga的晶振一定要接入全局时钟引脚吗?和接在普通IO的区别
XC95144XLTQ100,我们编译后空载运行,耗电:150--200MA正常?
装modelsim时,我也遇到了奇怪的问题,请大虾们指点一下。
麻烦高手帮我分析一下Microblaze的一段小程序!


Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号