菜单
  

    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. 基于oversim的P2P通信仿真系统设计

  2. 基于力控组态软件的PLC系...

  3. 基于SIMATICS7-200的小型锅炉...

  4. 基于Arduino的自动浇花系统设计+电路图+程序

  5. DC-DC基于超级电容的电梯弱电供电系统设计

  6. 基于图像识别的电子锁设计+PCB电路图+程序

  7. 单片机的信号发生器的设计任务书

  8. 浅析中国古代宗法制度

  9. 上市公司股权结构对经营绩效的影响研究

  10. 高警觉工作人群的元情绪...

  11. C++最短路径算法研究和程序设计

  12. g-C3N4光催化剂的制备和光催化性能研究

  13. 现代简约美式风格在室内家装中的运用

  14. 巴金《激流三部曲》高觉新的悲剧命运

  15. 江苏省某高中学生体质现状的调查研究

  16. 中国传统元素在游戏角色...

  17. NFC协议物理层的软件实现+文献综述

  

About

优尔论文网手机版...

主页:http://www.youerw.com

关闭返回