LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
PORT( clk,reset,setmin:STD_LOGIC;
enmin:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC; ——enmin_1为59秒时的进位信号
BEGIN ——enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setmin and clk); ——setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1 or enmin_2); ——enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THEN count<="0000000"; ——若reset为0,则异步清零
ELSIF(clk 'event and clk='1')then ——否则,若clk上升沿到
IF(count(3 downto 0)="1001")then ——若个位计时恰好到“1001”即9
IF(count<16#60#)then ——又若count小于16#60#,即60H
IF(count="1011001")then ——又若已到59D
enmin_1<='1';count<="0000000";——则置进位为1及count复0
ELSE ——未到59D
count<=count+7; ——则加7,而+7=+1+6,即作“加6校正”
END IF;
ELSE ——若count不小于16#60#(即count等于或大于16#60#)
count<="0000000"; ——count复0
END IF; ——END IF(count<16#60#)
ELSIF(count<16#60#)then ——若个位计数未到“1001”则转此句再判
count<=count+1; ——若count<16#60#则count加1
enmin_1<='0'after 100 ns; ——没有发生进位
ELSE ——否则,若count不小于16#60#
count<="0000000"; ——则count复0
END IF; ——END IF(count(3 DOWNTO 0)=“1001”)
END IF; ——END IF(reset=‘0’)
END PROCESS;
END fun;
|