?? up3_clock.vhd
字號(hào):
WHEN WRITE_CHAR17 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_DAY1;
state<= TOGGLE_E;
next_command <= WRITE_CHAR18;
WHEN WRITE_CHAR18 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_DAY0;
state<= TOGGLE_E;
next_command <= RETURN_HOME;
-----------------------
-- Return write address to first character postion
WHEN RETURN_HOME =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"80";
state <= TOGGLE_E;
next_command <= DISPLAY_SET;
-----------
WHEN GOTO_NEXTLINE =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"C0";
state <= TOGGLE_E;
next_command <= WRITE_CHAR11;
--------------
-- 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_10hz, reset)
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"0";
state1 <= WRITE_HOUR;
next_command1 <= WRITE_MIN;
---
ELSIF CLK_10HZ'EVENT AND CLK_10HZ = '1' THEN
IF SET_TIME = '0' AND SET_MOD = '0' THEN
CASE STATE1 IS
WHEN WRITE_HOUR =>
IF SET_CHANGE = '0' THEN
state1 <= TOGGLE_E1;
next_command1 <= WRITE_MIN;
ELSE
IF SET_ADD= '0' THEN
-- HOURS
IF BCD_HRD0 < 9 AND NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3))THEN
BCD_HRD0 <= BCD_HRD0 + 1;
ELSE
-- TENS OF HOURS
IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
BCD_HRD1 <= BCD_HRD1 + 1;
BCD_HRD0 <= "0000";
ELSE
BCD_HRD1 <= "0000";
BCD_HRD0 <= "0000";
END IF;
END IF;
END IF;
state1 <= TOGGLE_E1;
next_command1 <= WRITE_HOUR;
END IF;
WHEN WRITE_MIN =>
IF SET_CHANGE = '0' THEN
state1 <= TOGGLE_E1;
next_command1 <= WRITE_SEC;
ELSE
IF SET_ADD= '0' THEN
-- MINUTES
IF BCD_MIND0 < 9 THEN
BCD_MIND0 <= BCD_MIND0 + 1;
ELSE
-- TENS OF MINUTES
BCD_MIND0 <= "0000";
IF BCD_MIND1 < 5 THEN
BCD_MIND1 <= BCD_MIND1 + 1;
ELSE
BCD_MIND1 <= "0000";
END IF;
END IF;
END IF;
state1 <= TOGGLE_E1;
next_command1 <= WRITE_MIN;
END IF;
WHEN WRITE_SEC =>
IF SET_CHANGE = '0' THEN
state1 <= TOGGLE_E1;
next_command1 <= WRITE_HOUR;
ELSE
IF SET_ADD= '0' THEN
-- MINUTES
IF BCD_SECD0 < 9 THEN
BCD_SECD0 <= BCD_SECD0 + 1;
ELSE
-- TENS OF MINUTES
BCD_SECD0 <= "0000";
IF BCD_SECD1 < 5 THEN
BCD_SECD1 <= BCD_SECD1 + 1;
ELSE
BCD_SECD1 <= "0000";
END IF;
END IF;
state1 <= TOGGLE_E1;
next_command1 <= WRITE_SEC;
END IF;
END IF;
WHEN TOGGLE_E1 =>
-- LCD_E <= '0';
state1 <= HOLD1;
-- Hold LCD inst/data valid after falling edge of E line
WHEN HOLD1 =>
state1 <= next_command1;
END CASE;
ELSIF SET_TIME = '1' THEN
-- TENTHS OF SECONDS
IF BCD_TSEC < 9 THEN
BCD_TSEC <= BCD_TSEC + 1;
ELSE
BCD_TSEC <= X"0";
-- SECONDS
IF BCD_SECD0 < 9 THEN
BCD_SECD0 <= BCD_SECD0 + 1;
ELSE
-- TENS OF SECONDS
BCD_SECD0 <= "0000";
IF BCD_SECD1 < 5 THEN
BCD_SECD1 <= BCD_SECD1 + 1;
ELSE
-- MINUTES
BCD_SECD1 <= "0000";
IF BCD_MIND0 < 9 THEN
BCD_MIND0 <= BCD_MIND0 + 1;
ELSE
-- TENS OF MINUTES
BCD_MIND0 <= "0000";
IF BCD_MIND1 < 5 THEN
BCD_MIND1 <= BCD_MIND1 + 1;
ELSE
-- HOURS
BCD_MIND1 <= "0000";
IF BCD_HRD0 < 9 AND NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3))THEN
BCD_HRD0 <= BCD_HRD0 + 1;
ELSE
-- TENS OF HOURS
IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
BCD_HRD1 <= BCD_HRD1 + 1;
BCD_HRD0 <= "0000";
ELSE
-- NEW DAY
BCD_HRD1 <= "0000";
BCD_HRD0 <= "0000";
IF BCD_DAY0 < 9 THEN
BCD_DAY0 <= BCD_DAY0 + 1;
ELSE
BCD_DAY0 <= "0000";
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
--TIME COUNT
END IF;
--MODEL CHOOSE
END IF;
--IF INIT
END PROCESS;
PROCESS (Clk_10hz)
BEGIN
IF reset = '0' THEN
TIME <= 0;
END IF;
ALARM_LED <= '0';
IF SET_ALARM = '0' AND
CLOSE_ALARM = '1' AND
BCD_SECD0 = BCD_S0 AND
BCD_SECD1 = BCD_S1 AND
BCD_MIND1 = BCD_M1 AND
BCD_MIND0 = BCD_M0 AND
BCD_HRD1 = BCD_H1 AND
BCD_HRD0 = BCD_H0 THEN
TIME <= 100;
ALARM_LED <= '1';
ELSIF SET_ALARM = '0' AND
CLOSE_ALARM = '0' AND
TIME > 0 THEN
ALARM_LED <= '0';
TIME <= 0;
ELSIF BCD_SECD0 = BCD_S0 AND
((BCD_SECD1 = BCD_S1 + 1) OR (BCD_SECD1 =0 AND BCD_S1=5) )THEN
TIME <= 0;
ALARM_LED <= '0';
ELSIF TIME > 0 AND
SET_ALARM = '0' THEN
ALARM_LED <= '1';
TIME <= TIME - 1;
ELSE
ALARM_LED <= '0';
TIME <= 0;
END IF;
END PROCESS;
PROCESS (Clk_10hz)
BEGIN
GIVE_TIME_LED <= '0';
IF GIVE_TIME = '0' AND
BCD_SECD1 = 0 AND
BCD_SECD0 = 0 AND
BCD_MIND1 = 0 AND
BCD_MIND0 = 0 THEN
GIVE_TIME_LED <= '1';
ELSE
GIVE_TIME_LED <= '0';
END IF;
END PROCESS;
PROCESS (Clk_10hz, reset)
BEGIN
IF reset = '0' THEN
BCD_H1 <= X"0";
BCD_H0 <= X"0";
BCD_M1 <= X"0";
BCD_M0 <= X"0";
BCD_S1 <= X"0";
BCD_S0 <= X"0";
state2 <= ALARM_HOUR;
next_command2 <= ALARM_MIN;
ELSIF CLK_10HZ'EVENT AND CLK_10HZ = '1' THEN
IF SET_TIME = '0' AND SET_MOD = '1' THEN
CASE STATE2 IS
WHEN ALARM_HOUR =>
IF SET_CHANGE = '0' THEN
state2 <= TOGGLE_E2;
next_command2 <= ALARM_MIN;
ELSE
IF SET_ADD= '0' THEN
-- HOURS
IF BCD_H0 < 9 AND NOT((BCD_H1 = 2) AND (BCD_H0 = 3))THEN
BCD_H0 <= BCD_H0 + 1;
ELSE
-- TENS OF HOURS
IF NOT((BCD_H1 = 2) AND (BCD_H0 = 3)) THEN
BCD_H1 <= BCD_H1 + 1;
BCD_H0 <= "0000";
ELSE
BCD_H1 <= "0000";
BCD_H0 <= "0000";
END IF;
END IF;
END IF;
state2 <= TOGGLE_E2;
next_command2 <= ALARM_HOUR;
END IF;
WHEN ALARM_MIN =>
IF SET_CHANGE = '0' THEN
state2 <= TOGGLE_E2;
next_command2 <= ALARM_SEC;
ELSE
IF SET_ADD= '0' THEN
-- MINUTES
IF BCD_M0 < 9 THEN
BCD_M0 <= BCD_M0 + 1;
ELSE
-- TENS OF MINUTES
BCD_M0 <= "0000";
IF BCD_M1 < 5 THEN
BCD_M1 <= BCD_M1 + 1;
ELSE
BCD_M1 <= "0000";
END IF;
END IF;
END IF;
state2 <= TOGGLE_E2;
next_command2 <= ALARM_MIN;
END IF;
WHEN ALARM_SEC =>
IF SET_CHANGE = '0' THEN
state2 <= TOGGLE_E2;
next_command2 <= ALARM_HOUR;
ELSE
IF SET_ADD= '0' THEN
-- MINUTES
IF BCD_S0 < 9 THEN
BCD_S0 <= BCD_S0 + 1;
ELSE
-- TENS OF MINUTES
BCD_S0 <= "0000";
IF BCD_S1 < 5 THEN
BCD_S1 <= BCD_S1 + 1;
ELSE
BCD_S1 <= "0000";
END IF;
END IF;
state2 <= TOGGLE_E2;
next_command2 <= ALARM_SEC;
END IF;
END IF;
WHEN TOGGLE_E2 =>
-- LCD_E <= '0';
state2 <= HOLD2;
-- Hold LCD inst/data valid after falling edge of E line
WHEN HOLD2 =>
state2 <= next_command2;
END CASE;
END IF;
END IF;
END PROCESS;
END a;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -