if flag='1' then
if count=3 then
count<="0000";
else
count<=count+1;
end if;
else
count<=count+1;
if count=9 then
count<="0000";
end if;
end if; end if;
end process k1;
END addram3_architecture;
程序中当有按键信号输入时,先确定flag的状态,当其为高电平时,即小时高位为2,小时低位只能在0到3之间变动,count=3,count清零;当flag为低电平时,即小时高位为1,小时低位可以在0到9之间变动count=9时count清零。小时低位按键控制模块的仿真波形如图10所示。
图10 小时低位按键控制模块波形仿真
3.计数模块
(1) 秒低位计数模块
该模块框图如图11所示。模块主要完成计数向秒的高位进位,产生脉冲信号。clk1s为标准1Hz脉冲信号,当有时钟信号上升沿到来时count开始计数,当count=9,count清零,秒计数满10向分进位,os输出1。
图11 秒低位计数模块逻辑框图
秒低位计数子程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY sl IS
PORT (clk_1s : IN STD_LOGIC;
os : OUT STD_LOGIC;
addr_1s : OUT STD_LOGIC_vector(3 downto 0));
END sl;
ARCHITECTURE sl_architecture OF sl IS
BEGIN
k1:process(clk_1s)
variable count:integer range 0 to 10:=0;
begin
if rising_edge(clk_1s) then
if count=9 then
os<='1';
count:=0;
else
os<='0';
count:=count+1;
end if;
end if;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end process k1;
end sl_architecture ;
该模块的仿真波形如图12所示。
图12 秒低位计数模块波形仿真
对于秒的高位高位计数程序只需将count=9改成count=6即可。
(2)分低位计数器
分模块主要完成分低位向高位的进位,产生脉冲信号。该模块框图如图13所示。图中iset为控制开关信号,当iset为低电平时,分低位由外部信号iset-addr[30]输入。当iset为高电平时随着标准时钟信号的到来开始计数,count=9时计数器清零,既分低位清零向高位进位。
、
图13 分低位逻辑框图
分低位计数子程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY ml IS
PORT (clk_1s : IN STD_LOGIC;
iset : IN STD_LOGIC;
iset_addr : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
addr_1s : OUT STD_LOGIC_vector(3 downto 0);
os : OUT STD_LOGIC);
END ml;
ARCHITECTURE ml_architecture OF ml IS
BEGIN
k1:process(clk_1s,iset)
variable count:integer range 0 to 10:=0;
begin
if iset='0' then
count:=CONV_INTEGER(iset_addr);
addr_1s<=iset_addr;
elsif rising_edge(clk_1s) then
if count=9 then
os<='1';
count:=0;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
else
os<='0';
count:=count+1;
addr_1s<=CONV_STD_LOGIC_VECTOR(count,4);
end if;
end if;
end process k1;
END ml_architecture;
对于分高位计数模块的程序,只需将上面程序中的计数器count=9改成count=6即可。
(3) 小时低位计数模块
小时低位模块主要完成小时低位向高位的进位,产生脉冲信号,同时根据flag信号的不同判断出小时高位时1还是2,从而来确定小时低位变化范围是0到3或0到9,该模块框图如图14所示。iset为调整控制信号,当iset为高电平时,小时低位数据由外部按键输入,当iset为低电平时开始计数,flag为高电平时,小时高位为1,低位计数到9时向高位进位,当flag为低电平时,低位计数到3向高位进位。 VHDL基于FPGA的数字时钟设计+电路图(5):http://www.youerw.com/zidonghua/lunwen_1332.html