?? up3_clock.vhd
字號:
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR42;
state <= TOGGLE_E;
next_command <= WRITE_CHAR43;
WHEN WRITE_CHAR43 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR43;
state <= TOGGLE_E;
next_command <= WRITE_CHAR44;
WHEN WRITE_CHAR44 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR44;
state <= TOGGLE_E;
next_command <= WRITE_CHAR45;
WHEN WRITE_CHAR45 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR45;
state <= TOGGLE_E;
next_command <= WRITE_CHAR46;
WHEN WRITE_CHAR46 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR46 ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR47;
WHEN WRITE_CHAR47 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR47;
state <= TOGGLE_E;
next_command <= WRITE_CHAR48;
WHEN WRITE_CHAR48 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR48;
state <= TOGGLE_E;
next_command <= WRITE_CHAR49;
WHEN WRITE_CHAR49 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR49;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4A;
WHEN WRITE_CHAR4A =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4A ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4B;
WHEN WRITE_CHAR4B =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4B;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4C;
WHEN WRITE_CHAR4C =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4C;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4D;
WHEN WRITE_CHAR4D =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4D ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4E;
WHEN WRITE_CHAR4E =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4E ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4F;
WHEN WRITE_CHAR4F =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= CHAR4F;
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 <= WRITE_CHAR0;
-- 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;
--******************************************************************************
-- SIGNAL CHAR0,CHAR1,CHAR2,CHAR3,CHAR4,CHAR5,CHAR6,CHAR7,CHAR8,CHAR9,CHARA,CHARB,CHARC,
-- CHARD,CHARE,CHARFCHAR40,CHAR41,CHAR42,CHAR43,CHAR44,CHAR45,CHAR46,CHAR47,CHAR48,
-- CHAR49,CHAR4A,CHAR4B,CHAR4C,CHAR4D,CHAR4E,CHAR4F:STD_LOGIC_VECTOR(7 DOWNTO 0);
--******************************************************************************
PROCESS(CLK_10Hz,reset,AL2NOL)
BEGIN
IF(reset= '0')OR (AL2NOL ='0' ) THEN
WR_OR_BL <= '1';
ELSE
IF rising_edge(CLK_10Hz) THEN
IF (WR_OR_BL = '1') THEN
CHAR0 <= X"3" & BCD_HRD1;
CHAR1 <= X"3" & BCD_HRD0;
CHAR2 <= X"3A";
CHAR3 <= X"3" & BCD_MIND1;
CHAR4 <= X"3" & BCD_MIND0;
CHAR5 <= X"3A";
CHAR6 <= X"3" & BCD_SECD1;
CHAR7 <= X"3" & BCD_SECD0;
CHAR8 <= X"2E";
CHAR9 <= X"3" & BCD_TSEC;
CHARA <= X"20";
CHARE <= X"3"&BCD_CLK_HRD1;
CHARF <= X"3"&BCD_CLK_HRD0;
CHAR40 <= X"3" & BCD_YEAR3;
CHAR41 <= X"3" & BCD_YEAR2;
CHAR42 <= X"3" & BCD_YEAR1;
CHAR43 <= X"3" & BCD_YEAR0;
CHAR44 <= X"2E";
CHAR45 <= X"3" & BCD_MON1;
CHAR46 <= X"3" & BCD_MON0;
CHAR47 <= X"2E";
CHAR48 <= X"3" & BCD_DAY1;
CHAR49 <= X"3" & BCD_DAY0;
CHAR4A <= X"20";
CHAR4B <= X"3" & BCD_CLK_MIN1;
CHAR4C <= X"3" & BCD_CLK_MIN0;
CHAR4D <= X"3A";
CHAR4E <= X"3" & BCD_CLK_SEC1;
CHAR4F <= X"3" & BCD_CLK_SEC0;
WR_OR_BL <= '0';
ELSE
WR_OR_BL <= '1';
IF (MODIFY_HOUR1_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR0 <= X"20";
ELSE
CHARE <= X"20";
END IF;
ELSIF (MODIFY_HOUR0_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR1 <= X"20";
ELSE
CHARF <= X"20";
END IF;
ELSIF (MODIFY_MIN1_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR3 <= X"20";
ELSE
CHAR4B <= X"20";
END IF;
ELSIF (MODIFY_MIN0_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR4 <= X"20";
ELSE
CHAR4C <= X"20";
END IF;
ELSIF (MODIFY_SECD1_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR6 <= X"20";
ELSE
CHAR4E <= X"20";
END IF;
ELSIF (MODIFY_SECD0_CON = '1') THEN
IF (MOD_OR_SET = '1') THEN
CHAR7 <= X"20";
ELSE
CHAR4F <= X"20";
END IF;
ELSIF(MODIFY_YEAR3_CON = '1') THEN
CHAR40 <= X"20";
ELSIF(MODIFY_YEAR2_CON = '1') THEN
CHAR41 <= X"20";
ELSIF(MODIFY_YEAR1_CON = '1') THEN
CHAR42 <= X"20";
ELSIF(MODIFY_YEAR0_CON = '1') THEN
CHAR43 <= X"20";
ELSIF(MODIFY_MON1_CON = '1') THEN
CHAR45 <= X"20";
ELSIF(MODIFY_MON0_CON = '1') THEN
CHAR46 <= X"20";
ELSIF(MODIFY_DAY1_CON = '1') THEN
CHAR48 <= X"20";
ELSIF(MODIFY_DAY0_CON = '1') THEN
CHAR49 <= X"20";
ELSE
CHAR0 <= X"3" & BCD_HRD1;
CHAR1 <= X"3" & BCD_HRD0;
CHAR2 <= X"3A";
CHAR3 <= X"3" & BCD_MIND1;
CHAR4 <= X"3" & BCD_MIND0;
CHAR5 <= X"3A";
CHAR6 <= X"3" & BCD_SECD1;
CHAR7 <= X"3" & BCD_SECD0;
CHAR8 <= X"2E";
CHAR9 <= X"3" & BCD_TSEC;
CHARA <= X"20";
CHARE <= X"3"&BCD_CLK_HRD1;
CHARF <= X"3"&BCD_CLK_HRD0;
CHAR40 <= X"3" & BCD_YEAR3;
CHAR41 <= X"3" & BCD_YEAR2;
CHAR42 <= X"3" & BCD_YEAR1;
CHAR43 <= X"3" & BCD_YEAR0;
CHAR44 <= X"2E";
CHAR45 <= X"3" & BCD_MON1;
CHAR46 <= X"3" & BCD_MON0;
CHAR47 <= X"2E";
CHAR48 <= X"3" & BCD_DAY1;
CHAR49 <= X"3" & BCD_DAY0;
CHAR4A <= X"20";
CHAR4B <= X"3" & BCD_CLK_MIN1;
CHAR4C <= X"3" & BCD_CLK_MIN0;
CHAR4D <= X"3A";
CHAR4E <= X"3" & BCD_CLK_SEC1;
CHAR4F <= X"3" & BCD_CLK_SEC0;
END IF;
END IF;
END IF;
End IF;
END PROCESS;
--******************************************************************************
-- 根據分頻原理設置時間BCD_HRD1 <= X"0";
-- BCD_HRD1 計10小時
-- BCD_HRD0 計1小時
-- BCD_MIND1 計10分鐘
-- BCD_MIND0 計1分鐘
-- BCD_SECD1 計10秒
-- BCD_SECD0 計1秒
-- BCD_TSEC 計0.1秒
-- 通過以上變量可以以十進制的形式來輸出時間例如:12:34:55.8
-- 通過狀態機產生的兩個變量INC_CON 和DEC_CON 來控制調整時鐘。
--******************************************************************************
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";
ELSIF clk_10HZ'EVENT AND clk_10HZ = '1' THEN
IF(ONE_DAY = '1') THEN
ONE_DAY <= '0';
END IF;
-- TENTHS OF SECONDS 0.1秒
IF NOT((COUNT_CON = '0')AND (MOD_OR_SET = '1' )) THEN
IF BCD_TSEC < 9 THEN
BCD_TSEC <= BCD_TSEC + 1;
ELSE
BCD_TSEC <= X"0";
-- SECONDS 1秒
IF BCD_SECD0 < 9 THEN
BCD_SECD0 <= BCD_SECD0 + 1;
ELSE
-- TENS OF SECONDS 10秒
BCD_SECD0 <= "0000";
IF BCD_SECD1 < 5 THEN
BCD_SECD1 <= BCD_SECD1 + 1;
ELSE
-- MINUTES 1分鐘
BCD_SECD1 <= "0000";
IF BCD_MIND0 < 9 THEN
BCD_MIND0 <= BCD_MIND0 + 1;
ELSE
-- TENS OF MINUTES 10分鐘
BCD_MIND0 <= "0000";
IF BCD_MIND1 < 5 THEN
BCD_MIND1 <= BCD_MIND1 + 1;
ELSE
-- HOURS 1小時
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 10小時
IF NOT((BCD_HRD1 = 2) AND (BCD_HRD0 = 3)) THEN
BCD_HRD1 <= BCD_HRD1 + 1;
BCD_HRD0 <= "0000";
ELSE
-- NEW DAY 1天
BCD_HRD1 <= "0000";
BCD_HRD0 <= "0000";
ONE_DAY <= '1';
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
ELSE
IF (HIT = '1')AND (MOD_OR_SET = '1') THEN
IF (MODIFY_HOUR1_CON = '1') THEN
IF (BCD_HRD0<4) THEN
IF(KEY_BCD < 3) THEN
BCD_HRD1 <= KEY_BCD;
END IF;
ELSE
IF (KEY_BCD<3) THEN
BCD_HRD1<=KEY_BCD;
BCD_HRD0<="0000";
END IF;
END IF;
ELSIF (MODIFY_HOUR0_CON = '1') THEN
IF(BCD_HRD1 = "0010") THEN
IF (KEY_BCD <4) THEN
BCD_HRD0 <= KEY_BCD;
END IF;
ELSE
BCD_HRD0 <= KEY_BCD;
END IF;
ELSIF (MODIFY_MIN1_CON = '1') THEN
IF(KEY_BCD < 6) THEN
BCD_MIND1 <= KEY_BCD;
END IF;
ELSIF (MODIFY_MIN0_CON = '1') THEN
BCD_MIND0 <= KEY_BCD;
ELSIF (MODIFY_SECD1_CON = '1') THEN
IF(KEY_BCD < 6) THEN
BCD_SECD1 <= KEY_BCD;
END IF;
ELSIF (MODIFY_SECD0_CON = '1') THEN
BCD_SECD0 <=KEY_BCD;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
--************************************************************************************
-- 修改狀態機
-- TYPE STATE_TYPE_SET IS (COUNT,MODIFY_HOUR,MODIFY_MIN,MODIFY_SECD,MODIFY_YEAR,
-- MODIFY_MON,MODIFY_DAY,SET_HOUR,SET_MIN,SET_SECD,SET_YEAR,SET_MON,SET_DAY);
-- 并不是直接在狀態機里面進行操作,而是可以控制變量,然后用該變量控制其他進程
-- SET: PROCESS (Clk_10hz,INC_CON,RESET )這樣的寫法是不對的因為BCD_HRD1不可以在不同
-- 的進程中被不同的時鐘驅動
-- 寫程序時遇到的問題有:忘寫
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -