菜单
  

    USE ieee.std_logic_1164.all;
    ENTITY colv IS
    PORT(clk : IN STD_LOGIC;
    inkey : IN STD_LOGIC;
    okey : OUT STD_LOGIC);
    END colv;
    ARCHITECTURE colv_architecture OF colv IS                 
    BEGIN
    k1: process(clk,inkey)
    variable count:integer range 0 to 30:=0;
    begin
    if inkey='1' then
    count:=0;
    okey<='1';
    elsif rising_edge(clk) then
    if count=30 then
    okey<='0'; count:=30;
    else count:=count+1;
    okey<='1';
    end if;  end if;
    end process k1;
     END colv_architecture;
    这段程序是实现按键去抖动,原理是当有按键按下的时候,输入端inkey会变成低电平,此时如果count不为30时,内部计数器清零并开始计数,从0累计到30,当计数到30时,okey输出底电平,同时给计数器赋值为30。由于计数脉冲信号为2ms,故从有按键按下到确定有输入信号产生大概需要60ms[9]。而按键产生抖动时间大约为2ms到10ms,所以只要计数完成,抖动就已经过去,不再会发生重键现象了,这样就实现去抖动。该模块的仿真波形如图7所示。
     
    图7 按键消抖模块波形仿真
    2.按键控制模块
        按键控制模块的框图如图8所示。
                    
                    (a) 小时低位控制模块                   (b) 小时低位控制模块
    图8 按键控制模块
    图8(a)是控制分的高位,低位以及小时的高位的电路模块,图8(b)是控制小时的低位的电路模块。inkey是经过去抖模块后输出的有键按下的信号,这个信号引发按键控制模块内部信号的变化。oaddr[30]作为输出信号,用于控制时间的调整[10]。当小时高位为1时,其地位变化范围为0到9,当为2时变化范围为0到3。图8(b)中的flag是用来判断小时高位是1还是2的信号,若为1,则flag信号为低电平;若为2,则flag信号为高电平。
    (1) 分低位按键控制子程序:
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    USE ieee.std_logic_unsigned.all;
    ENTITY addram IS
    PORT  (inkey : IN STD_LOGIC;
    oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
    END addram;
    ARCHITECTURE addram_architecture OF addram IS
    signal count:std_logic_vector(3 downto 0);
    BEGIN  
    oaddr<=count;
    k1: process(inkey)
    begin
    if  rising_edge(inkey) then
    count<=count+1;
    if count=9 then
    count<="0000";
    end if;
    end if;
    end process k1;
    END addram_architecture;
    每当按键一次,即每当inkey的上升沿到来时,count加一,当count值等于9的时候,作为分的低位,将0赋值于count开始下一轮计数,在此过程中,随时将十进制数count的值的BCD码作为oaddr输出的信号。同样对于分的高位,仅将程序中的count=9改成count=5即可;对于小时的高位,仅将程序中的count=9改成count=2即可。
    该模块的仿真波形如图9所示。
     图9 分低位按键控制模块波形仿真
    (2) 小时低位按键控制程序:
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    USE ieee.std_logic_unsigned.all;
    ENTITY addram3 IS
    PORT   (inkey : IN STD_LOGIC;
    flag : IN STD_LOGIC;
    oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
    END addram3;
    ARCHITECTURE addram3_architecture OF addram3 IS
    signal count:std_logic_vector(3 downto 0);
    BEGIN
    oaddr<=count;
    k1:process(inkey,flag)
    begin
    if  rising_edge(inkey) then
  1. 上一篇:AT89C55单片机的数字音乐盒设计+仿真图+电路原理图+源码
  2. 下一篇:51单片机的角度测量系统设计+仿真图+源码
  1. 基于中频信号的家用治疗...

  2. 基于嵌入式技术的智能家...

  3. 基于FPGA竞赛系统设计+程序

  4. Matlab基于前馈控制的加热炉温度控制系统设计

  5. MEMS基于SHARC型DSP的组合导航算法实现

  6. 基于LabVIEW的车牌图像识别技术研究

  7. 基于LabVIEW和MATLAB混合编程...

  8. java+mysql车辆管理系统的设计+源代码

  9. 电站锅炉暖风器设计任务书

  10. 中考体育项目与体育教学合理结合的研究

  11. 酸性水汽提装置总汽提塔设计+CAD图纸

  12. 杂拟谷盗体内共生菌沃尔...

  13. 大众媒体对公共政策制定的影响

  14. 当代大学生慈善意识研究+文献综述

  15. 十二层带中心支撑钢结构...

  16. 乳业同业并购式全产业链...

  17. 河岸冲刷和泥沙淤积的监测国内外研究现状

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回