毕业论文

打赏
当前位置: 毕业论文 > 自动化 >

VHDL基于FPGA的数字时钟设计+电路图(4)

时间:2016-12-20 12:35来源:毕业论文
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) varia


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 VHDL基于FPGA的数字时钟设计+电路图(4):http://www.youerw.com/zidonghua/lunwen_1332.html
------分隔线----------------------------
推荐内容