📄 up3_clock.vhd
字号:
DATA_BUS_VALUE <= X"80";
state <= TOGGLE_E;
next_command <= WRITE_CHAR1;
-- The next two states occur at the end of each command to the LCD
-- Toggle E line - falling edge loads inst/data to LCD controller
WHEN TOGGLE_E =>
LCD_E <= '0';
state <= HOLD;
-- Hold LCD inst/data valid after falling edge of E line
WHEN HOLD =>
state <= next_command;
END CASE;
END IF;
END PROCESS;
--显示分配
process (clk_400hz, time_set_valid, alarm_set_valid)
begin
if reset = '0' then
BCD_HRD1 <= X"0";
BCD_HRD0 <= X"0";
BCD_MIND1 <= X"0";
BCD_MIND0 <= X"0";
BCD_SECD1 <= X"0";
BCD_SECD0 <= X"0";
BCD_TSEC <= X"00";
elsif clk_400hz'event and clk_400hz = '1' then
if time_set_state = '0' and alarm_set_state = '0' then
BCD_HRD1 <= count_hrd1;
BCD_HRD0 <= count_hrd0;
BCD_MIND1 <= count_mind1;
BCD_MIND0 <= count_mind0;
BCD_SECD1 <= count_secd1;
BCD_SECD0 <= count_secd0;
BCD_TSEC <= X"3" & count_tsec;
elsif time_set_state = '1' then
BCD_HRD1 <= count_hrd1;
BCD_HRD0 <= count_hrd0;
BCD_MIND1 <= count_mind1;
BCD_MIND0 <= count_mind0;
BCD_SECD1 <= count_secd1;
BCD_SECD0 <= count_secd0;
BCD_TSEC <= X"20";
elsif alarm_set_state = '1' then
BCD_HRD1 <= alarm_hrd1;
BCD_HRD0 <= alarm_hrd0;
BCD_MIND1 <= alarm_mind1;
BCD_MIND0 <= alarm_mind0;
BCD_SECD1 <= alarm_secd1;
BCD_SECD0 <= alarm_secd0;
BCD_TSEC <= X"20";
end if;
end if;
end process;
--计时
process (clk_10hz, reset, time_set_state)
begin
if reset = '0' then
count_HRD1 <= X"0";
count_HRD0 <= X"0";
count_MIND1 <= X"0";
count_MIND0 <= X"0";
count_SECD1 <= X"0";
count_SECD0 <= X"0";
count_TSEC <= X"0";
bcd_yrd3 <= X"0";
bcd_yrd2 <= X"0";
bcd_yrd1 <= X"0";
bcd_yrd0 <= X"0";
bcd_mond1 <= X"0";
bcd_mond0 <= X"0";
bcd_dad1 <= X"0";
bcd_dad0 <= X"0";
elsif time_set_state = '1' then
count_HRD1 <= set_hrd1;
count_HRD0 <= set_hrd0;
count_MIND1 <= set_mind1;
count_MIND0 <= set_mind0;
count_SECD1 <= set_secd1;
count_SECD0 <= set_secd0;
count_TSEC <= X"0";
bcd_yrd3 <= set_yrd3;
bcd_yrd2 <= set_yrd2;
bcd_yrd1 <= set_yrd1;
bcd_yrd0 <= set_yrd0;
bcd_mond1 <= set_mond1;
bcd_mond0 <= set_mond0;
bcd_dad1 <= set_dad1;
bcd_dad0 <= set_dad0;
elsif clk_10HZ'EVENT AND clk_10HZ = '1' THEN
-- TENTHS OF SECONDS
IF count_TSEC < 9 THEN
count_TSEC <= count_TSEC + 1;
ELSE
count_TSEC <= X"0";
-- SECONDS
IF count_SECD0 < 9 THEN
count_SECD0 <= count_SECD0 + 1;
ELSE
-- TENS OF SECONDS
count_SECD0 <= "0000";
IF count_SECD1 < 5 THEN
count_SECD1 <= count_SECD1 + 1;
ELSE
-- MINUTES
count_SECD1 <= "0000";
IF count_MIND0 < 9 THEN
count_MIND0 <= count_MIND0 + 1;
ELSE
-- TENS OF MINUTES
count_MIND0 <= "0000";
IF count_MIND1 < 5 THEN
count_MIND1 <= count_MIND1 + 1;
ELSE
-- HOURS
count_MIND1 <= "0000";
IF count_HRD0 < 9 AND NOT((count_HRD1 = 2) AND (count_HRD0 = 3))THEN
count_HRD0 <= count_HRD0 + 1;
ELSE
-- TENS OF HOURS
IF NOT((count_HRD1 = 2) AND (count_HRD0 = 3)) THEN
count_HRD1 <= count_HRD1 + 1;
count_HRD0 <= "0000";
ELSE
-- NEW DAY
count_HRD1 <= "0000";
count_HRD0 <= "0000";
--年月日
if bcd_dad0 < 9 and bcd_dad1 < 2 then
bcd_dad0 <= bcd_dad0 + 1;
else
if bcd_dad1 < 2 then
bcd_dad0 <= X"0";
bcd_dad1 <= bcd_dad1 + 1;
else
if bcd_dad1 = 2 and bcd_dad0 < 8 then
bcd_dad0 <= bcd_dad0 + 1;
else
if bcd_mond1 = 0 and bcd_mond0 = 2 and (not(bcd_yrd1 = 0 and bcd_yrd0 = 0) and
bcd_yrd0(1) = '0' and bcd_yrd0(0) = '0') and bcd_dad0 < 9 then
bcd_dad0 <= bcd_dad0 + 1;
else
if not(bcd_mond1 = 0 and bcd_mond0 = 2) and bcd_dad0 < 9 and bcd_dad1 < 3 then
bcd_dad0 <= bcd_dad0 + 1;
else
if not(bcd_mond1 = 0 and bcd_mond0 = 2) and bcd_dad1 < 3 then
bcd_dad0 <= X"0";
bcd_dad1 <= bcd_dad1 + 1;
else
if (bcd_mond1 = 0 and (bcd_mond0 = 1 or bcd_mond0 = 3 or bcd_mond0 = 5
or bcd_mond0 = 7 or bcd_mond0 = 8)) and (bcd_mond1 = 1 and (bcd_mond0 = 0
or bcd_mond0 = 2)) then
bcd_dad1 <= bcd_dad1 + 1;
else
bcd_dad0 <= X"1";
bcd_dad1 <= X"0";
if not(bcd_mond1 = 1 and bcd_mond0 = 2) and bcd_mond0 < 9 then
bcd_mond0 <= bcd_mond0 + 1;
else
if not(bcd_mond1 = 1 and bcd_mond0 = 2) then
bcd_mond1 <= bcd_mond1 + 1;
bcd_mond0 <= X"0";
else
bcd_mond1 <= X"0";
bcd_mond0 <= X"1";
if bcd_yrd0 < 9 then
bcd_yrd0 <= bcd_yrd0 + 1;
else
bcd_yrd0 <= X"0";
if bcd_yrd1 < 9 then
bcd_yrd1 <= bcd_yrd1 + 1;
else
bcd_yrd1 <= X"0";
if bcd_yrd2 < 9 then
bcd_yrd2 <= bcd_yrd2 + 1;
else
bcd_yrd2 <= X"0";
if bcd_yrd3 < 9 then
bcd_yrd3 <= bcd_yrd3 + 1;
else
bcd_yrd3 <= X"0";
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
end if;
end process;
--校时设闹
process (clk_48Mhz, inc_valid, reset)
begin
if reset = '0' then
alarm_HRD1 <= X"0";
alarm_HRD0 <= X"0";
alarm_MIND1 <= X"0";
alarm_MIND0 <= X"0";
alarm_SECD1 <= X"0";
alarm_SECD0 <= X"0";
set_HRD1 <= X"0";
set_HRD0 <= X"0";
set_MIND1 <= X"0";
set_MIND0 <= X"0";
set_SECD1 <= X"0";
set_SECD0 <= X"0";
elsif clk_48Mhz'event and clk_48Mhz = '1' then
if inc_valid = '1' then
CASE MODIFY IS
--校时
WHEN MDHR1 =>
IF set_HRD1 < 2 THEN
set_HRD1 <= set_HRD1 + 1;
ELSE
set_HRD1 <= X"0";
END IF;
WHEN MDHR0 =>
IF set_HRD1 < 2 THEN
IF set_HRD0 < 9 THEN
set_HRD0 <= set_HRD0 + 1;
ELSE
set_HRD0 <= X"0";
END IF;
ELSE
IF set_HRD0 < 3 THEN
set_HRD0 <= set_HRD0 + 1;
ELSE
set_HRD0 <= X"0";
END IF;
END IF;
WHEN MDMIN1 =>
IF set_MIND1 < 5 THEN
set_MIND1 <= set_MIND1 + 1;
ELSE
set_MIND1 <= X"0";
END IF;
WHEN MDMIN0 =>
IF set_MIND0 < 9 THEN
set_MIND0 <= set_MIND0 + 1;
ELSE
set_MIND0 <= X"0";
END IF;
WHEN MDSEC1 =>
IF set_SECD1 < 5 THEN
set_SECD1 <= set_SECD1 + 1;
ELSE
set_SECD1 <= X"0";
END IF;
WHEN MDSEC0 =>
IF set_SECD0 < 9 THEN
set_SECD0 <= set_SECD0 + 1;
ELSE
set_SECD0 <= X"0";
END IF;
when mdyr3 =>
if set_yrd3 < 9 then
set_yrd3 <= set_yrd3 + 1;
else
set_yrd3 <= X"0";
end if;
when mdyr2 =>
if set_yrd2 < 9 then
set_yrd2 <= set_yrd2 + 1;
else
set_yrd2 <= X"0";
end if;
when mdyr1 =>
if set_yrd1 < 9 then
set_yrd1 <= set_yrd1 + 1;
else
set_yrd1 <= X"0";
end if;
when mdyr0 =>
if set_yrd0 < 9 then
set_yrd0 <= set_yrd0 + 1;
else
set_yrd0 <= X"0";
end if;
when mdmon1 =>
if set_mond1 = X"0" then
set_mond1 <= X"1";
else
set_mond1 <= X"0";
end if;
when mdmon0 =>
if set_mond1 = X"1" then
if set_mond0 < 2 then
set_mond0 <= set_mond0 + 1;
else
set_mond0 <= X"0";
end if;
else
if set_mond0 < 9 then
set_mond0 <= set_mond0 + 1;
else
set_mond0 <= X"1";
end if;
end if;
when mdda1 =>
if set_mond0 = X"2" and set_mond1 = X"0" then
if set_dad1 < 2 then
set_dad1 <= set_dad1 + 1;
else
set_dad1 <= X"0";
end if;
else
if set_dad1 < 3 then
set_dad1 <= set_dad1 + 1;
else
set_dad1 <= X"0";
end if;
end if;
when mdda0 =>
if set_dad1 = X"2" then
if set_mond0 = X"2" and set_mond1 = X"0" and not(set_yrd0(1) = '0' and
set_yrd0(0) = '0') and not(set_yrd2(1) = '0' and set_yrd2(0) = '0' and
set_yrd1 = X"0" and set_yrd0 = X"0") then
if set_dad0 < 8 then
set_dad0 <= set_dad0 + 1;
else
set_dad0 <= X"0";
end if;
else
if set_dad0 < 9 then
set_dad0 <= set_dad0 + 1;
else
set_dad0 <= X"0";
end if;
end if;
elsif set_dad1 = X"3" then
if set_dad0 = X"0" then
set_dad0 <= X"1";
else
set_dad0 <= X"0";
end if;
else
if set_dad0 < 9 then
set_dad0 <= set_dad0 + 1;
else
set_dad0 <= X"0";
end if;
end if;
--设闹
WHEN alHR1 =>
IF alarm_HRD1 < 2 THEN
alarm_HRD1 <= alarm_HRD1 + 1;
ELSE
alarm_HRD1 <= X"0";
END IF;
WHEN alHR0 =>
IF alarm_HRD1 < 2 THEN
IF alarm_HRD0 < 9 THEN
alarm_HRD0 <= alarm_HRD0 + 1;
ELSE
alarm_HRD0 <= X"0";
END IF;
ELSE
IF alarm_HRD0 < 3 THEN
alarm_HRD0 <= alarm_HRD0 + 1;
ELSE
alarm_HRD0 <= X"0";
END IF;
END IF;
WHEN alMIN1 =>
IF alarm_MIND1 < 5 THEN
alarm_MIND1 <= alarm_MIND1 + 1;
ELSE
alarm_MIND1 <= X"0";
END IF;
WHEN alMIN0 =>
IF alarm_MIND0 < 9 THEN
alarm_MIND0 <= alarm_MIND0 + 1;
ELSE
alarm_MIND0 <= X"0";
END IF;
WHEN alSEC1 =>
IF alarm_SECD1 < 5 THEN
alarm_SECD1 <= alarm_SECD1 + 1;
ELSE
alarm_SECD1 <= X"0";
END IF;
WHEN alSEC0 =>
IF alarm_SECD0 < 9 THEN
alarm_SECD0 <= alarm_SECD0 + 1;
ELSE
alarm_SECD0 <= X"0";
END IF;
WHEN OTHERS => NULL;
END CASE;
end if;
end if;
END PROCESS;
--状态转换
PROCESS (clk_48mhz, TIME_SET_VALID, alarm_set_valid, RESET)
BEGIN
IF RESET = '0' THEN
MODIFY <= COUNT;
TIME_SET_STATE <= '0';
alarm_set_state <= '0';
ELSIF clk_48mhz'event and clk_48mhz = '1' then
if TIME_SET_VALID = '1' THEN
CASE MODIFY IS
WHEN COUNT => MODIFY <= MDHR1; TIME_SET_STATE <= '1';
WHEN MDHR1 => MODIFY <= MDHR0; TIME_SET_STATE <= '1';
WHEN MDHR0 => MODIFY <= MDMIN1; TIME_SET_STATE <= '1';
WHEN MDMIN1 => MODIFY <= MDMIN0; TIME_SET_STATE <= '1';
WHEN MDMIN0 => MODIFY <= MDSEC1; TIME_SET_STATE <= '1';
WHEN MDSEC1 => MODIFY <= MDSEC0; TIME_SET_STATE <= '1';
WHEN MDSEC0 => MODIFY <= MDyr3; TIME_SET_STATE <= '1';
WHEN MDyr3 => MODIFY <= MDyr2; TIME_SET_STATE <= '1';
WHEN MDyr2 => MODIFY <= MDyr1; TIME_SET_STATE <= '1';
WHEN MDyr1 => MODIFY <= MDyr0; TIME_SET_STATE <= '1';
WHEN MDyr0 => MODIFY <= MDmon1; TIME_SET_STATE <= '1';
WHEN MDmon1 => MODIFY <= MDmon0; TIME_SET_STATE <= '1';
WHEN MDmon0 => MODIFY <= MDda1; TIME_SET_STATE <= '1';
WHEN MDda1 => MODIFY <= MDda0; TIME_SET_STATE <= '1';
WHEN MDda0 => MODIFY <= COUNT; TIME_SET_STATE <= '0';
when others => time_set_state <= '0';
END CASE;
elsif alarm_set_valid = '1' then
case modify is
WHEN COUNT => MODIFY <= alHR1; alarm_SET_STATE <= '1';
WHEN alHR1 => MODIFY <= alHR0; alarm_SET_STATE <= '1';
WHEN alHR0 => MODIFY <= alMIN1; alarm_SET_STATE <= '1';
WHEN alMIN1 => MODIFY <= alMIN0; alarm_SET_STATE <= '1';
WHEN alMIN0 => MODIFY <= alSEC1; alarm_SET_STATE <= '1';
WHEN alSEC1 => MODIFY <= alSEC0; alarm_SET_STATE <= '1';
WHEN alSEC0 => MODIFY <= COUNT; alarm_SET_STATE <= '0';
when others => alarm_set_state <= '0';
end case;
end if;
END IF;
END PROCESS;
--闹铃
process (clk_10hz, cancel)
begin
if cancel = '0' then
alarm_led <= '0';
current <= normal;
elsif clk_10hz'event and clk_10hz = '1' then
case current is
when normal =>
if count_hrd1 = alarm_hrd1 and count_hrd0 = alarm_hrd0 and count_mind1 = alarm_mind1 and count_mind0 = alarm_mind0 and count_secd1 = alarm_secd1 and
count_secd0 = alarm_secd0 and alarm = '0' then current <= alarm_on;
elsif count_mind1 = X"0" and count_mind0 = X"0" and count_secd1 = X"0" and
count_secd0 = X"0" and hour_alarm = '0' then current <= hour_on;
else current <= normal;alarm_led <= '0';
end if;
when alarm_on =>
if (count_secd1 = (alarm_secd1 + 1)) and count_secd0 = alarm_secd0 then
current <= normal;
alarm_led <= '0';
else
alarm_led <= '1';
current <= alarm_on;
end if;
when hour_on =>
if count_secd0 = (alarm_secd0 + 1) then
current <= normal;
alarm_led <= '0';
else
alarm_led <= '1';
current <= hour_on;
end if;
end case;
end if;
end process;
--24hour to 12hour
process (shift, bcd_hrd0, bcd_hrd1)
begin
if shift = '0' then
if bcd_hrd1 = X"2" or (bcd_hrd1 = X"1" and bcd_hrd0 > 2) then
am_pm <= X"50";
else
am_pm <= X"41";
end if;
else
am_pm <= X"41";
end if;
end process;
END a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -