|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
问个硬件消抖的问题 |
作者:civita 栏目:EDA技术 |
想用硬件描述语言作一个消抖电路 基本思想是在按下键时保持该电平并计时10ms消抖 时钟输入1MHZ 但是反复思考都不能成功描述该功能 希望高手们给点意见 |
2楼: | >>参与讨论 |
作者: xhjiang 于 2005/12/7 22:14:00 发布:
我前不久刚写过这个程序 我用了两个D触发器进行采样,采样时钟信号的频率干好为10MS(经分频得到),把两个D触发器的输出信号相与就得到去抖信号。但是你要进行按键译码的话要用到扫描信号,所以按键扫描信号要用采样时钟信号锁存后,才可以得到正确的按键译码信号。具体的问题你还是要仔细的分析你的时序,我当时用了一天的时间才把它调试好的,就是它的去抖问题时序没有匹配好译码不正确。 |
3楼: | >>参与讨论 |
作者: oaipoaip 于 2005/12/8 8:54:00 发布:
参考一下,没编译过不一定没错误 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 于 2005/12/8 23:55:00 发布:
问题已解决,虽然描述长了点,不过将就了 昨天用了一晚得时间,同时感谢以上提示我的朋友,发上源程序以供交流 同时,楼上的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 于 2005/12/8 23:58:00 发布:
还有,我的时钟是11.0592M 还有,我的时钟是11.0592M |
6楼: | >>参与讨论 |
作者: oaipoaip 于 2005/12/9 9:00:00 发布:
enable是使能信号 enable是外部输入的,如果不需要enable直接去掉就可以了,模块工作的时候是通过判断100个时钟周期(10ms)内输入和输出的差异来消除抖动的,只有在输入输出信号的差异保持10ms才认为输入信号发生变化,10ms以内认为是抖动。 |
7楼: | >>参与讨论 |
作者: civita 于 2005/12/9 19:30:00 发布:
了解了,果然如此 楼上的是强人哈 |
8楼: | >>参与讨论 |
作者: hnzsj 于 2005/12/19 22:26:00 发布:
真牛 真牛 |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |