?? up3_clock.vhd
字號:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
-- This code displays time in the UP3's LCD Display
-- SW8 (GLOBAL RESET) resets time
ENTITY UP3_CLOCK IS
PORT(reset, clk_48Mhz,SET_TIME,SET_CHANGE,SET_ADD,CLOSE_ALARM,SET_MOD,SET_ALARM,GIVE_TIME,ALARM : IN STD_LOGIC;
LCD_RS, LCD_E, RESET_LED, SEC_LED,ALARM_LED,GIVE_TIME_LED : OUT STD_LOGIC;
LCD_RW : BUFFER STD_LOGIC;
DATA_BUS : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END UP3_CLOCK;
ARCHITECTURE a OF UP3_CLOCK IS
TYPE STATE_TYPE IS (HOLD, FUNC_SET, DISPLAY_ON, MODE_SET,WRITE_CHAR1,
WRITE_CHAR2,WRITE_CHAR3,WRITE_CHAR4,WRITE_CHAR5,WRITE_CHAR6,WRITE_CHAR7,
WRITE_CHAR8, WRITE_CHAR9, WRITE_CHAR10,
-----
WRITE_CHAR11,WRITE_CHAR12,WRITE_CHAR13,WRITE_CHAR14,WRITE_CHAR15,WRITE_CHAR16,WRITE_CHAR17,WRITE_CHAR18,
-----
RETURN_HOME, GOTO_NEXTLINE,TOGGLE_E, RESET1, RESET2,
RESET3, DISPLAY_OFF, DISPLAY_CLEAR,DISPLAY_SET,WRITE_DISPLAY_CHAR1,
WRITE_DISPLAY_CHAR2,WRITE_DISPLAY_CHAR3,WRITE_DISPLAY_CHAR4,WRITE_DISPLAY_CHAR5,
WRITE_DISPLAY_CHAR6,WRITE_DISPLAY_CHAR7,WRITE_DISPLAY_CHAR8,WRITE_DISPLAY_CHAR9,WRITE_DISPLAY_CHAR10);
TYPE STATE2_TYPE IS (HOLD2,ALARM_HOUR,ALARM_MIN,ALARM_SEC,TOGGLE_E2);
TYPE STATE1_TYPE IS (HOLD1,WRITE_HOUR,WRITE_MIN,WRITE_SEC,TOGGLE_E1);
SIGNAL state, next_command: STATE_TYPE;
SIGNAL state1, next_command1: STATE1_TYPE;
SIGNAL DATA_BUS_VALUE: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL CLK_COUNT_400HZ: STD_LOGIC_VECTOR(19 DOWNTO 0);
SIGNAL CLK_COUNT_10HZ: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL BCD_SECD0,BCD_SECD1,BCD_MIND0,BCD_MIND1: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL BCD_HRD0,BCD_HRD1,BCD_TSEC: STD_LOGIC_VECTOR(3 DOWNTO 0);
------------------------------
SIGNAL BCD_YEAR1,BCD_YEAR0,BCD_MONTH1,BCD_MONTH0,BCD_DAY0,BCD_DAY1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
----------------------
SIGNAL BCD_S1,BCD_S0,BCD_M1,BCD_M0,BCD_H0,BCD_H1: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CLK_400HZ, CLK_10HZ,ALARM_LABEL : STD_LOGIC;
SIGNAL state2, next_command2: STATE2_TYPE;
SIGNAL TIME : INTEGER;
BEGIN
RESET_LED <= NOT RESET;
SEC_LED <= BCD_SECD0(0);
-- BIDIRECTIONAL TRI STATE LCD DATA BUS
DATA_BUS <= DATA_BUS_VALUE WHEN LCD_RW = '0' ELSE "ZZZZZZZZ";
--MAKE CLK_COUNT_400HZ:60000CLK_400HZ0.1
PROCESS
BEGIN
WAIT UNTIL CLK_48MHZ'EVENT AND CLK_48MHZ = '1';
IF RESET = '0' THEN
CLK_COUNT_400HZ <= X"00000";
CLK_400HZ <= '0';
ELSE
IF CLK_COUNT_400HZ < X"0EA60" THEN
CLK_COUNT_400HZ <= CLK_COUNT_400HZ + 1;
ELSE
CLK_COUNT_400HZ <= X"00000";
CLK_400HZ <= NOT CLK_400HZ;
END IF;
END IF;
END PROCESS;
--CLK_400HZstate <=next_command
PROCESS (CLK_400HZ, reset)
BEGIN
IF reset = '0' THEN
state <= RESET1;
DATA_BUS_VALUE <= X"38";
next_command <= RESET2;
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
--CLK_400HZ'EVENT
--CLK_COUNT_10HZ < 19
--CLK_10HZ <= NOT CLK_10HZ;
ELSIF CLK_400HZ'EVENT AND CLK_400HZ = '1' THEN
-- GENERATE 1 SEC CLOCK SIGNAL FOR SECOND COUNT PROCESS
IF CLK_COUNT_10HZ < 19 THEN
CLK_COUNT_10HZ <= CLK_COUNT_10HZ + 1;
ELSE
CLK_COUNT_10HZ <= X"00";
CLK_10HZ <= NOT CLK_10HZ;
END IF;
-- SEND TIME TO LCD
CASE state IS
-- Set Function to 8-bit transfer and 2 line display with 5x8 Font size
-- see Hitachi HD44780 family data sheet for LCD command and timing details
WHEN RESET1 =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"38";
state <= TOGGLE_E;
next_command <= RESET2;
WHEN RESET2 =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"38";
state <= TOGGLE_E;
next_command <= RESET3;
WHEN RESET3 =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"38";
state <= TOGGLE_E;
next_command <= FUNC_SET;
-- EXTRA STATES ABOVE ARE NEEDED FOR RELIABLE PUSHBUTTON RESET OF LCD
WHEN FUNC_SET =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"38";
state <= TOGGLE_E;
next_command <= DISPLAY_OFF;
-- Turn off Display and Turn off cursor
WHEN DISPLAY_OFF =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"08";
state <= TOGGLE_E;
next_command <= DISPLAY_CLEAR;
-- Turn on Display and Turn off cursor
WHEN DISPLAY_CLEAR =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"01";
state <= TOGGLE_E;
next_command <= DISPLAY_ON;
-- Turn on Display and Turn off cursor
WHEN DISPLAY_ON =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"0C";
state <= TOGGLE_E;
next_command <= MODE_SET;
-- Set write mode to auto increment address and move cursor to the right
WHEN MODE_SET =>
LCD_E <= '1';
LCD_RS <= '0';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"06";
state <= TOGGLE_E;
next_command <= DISPLAY_SET;
-- Write ASCII hex character in first LCD character location
WHEN DISPLAY_SET =>
IF ALARM = '0' OR (SET_TIME = '0' AND SET_MOD = '1') THEN
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR1;
ELSE
state <= TOGGLE_E;
next_command <= WRITE_CHAR1;
END IF;
---ALARM
WHEN WRITE_DISPLAY_CHAR1 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_H1;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR2;
-- Write ASCII hex character in second LCD character location
WHEN WRITE_DISPLAY_CHAR2 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_H0;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR3;
-- Write ASCII hex character in third LCD character location
WHEN WRITE_DISPLAY_CHAR3 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3A" ;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR4;
-- Write ASCII hex character in fourth LCD character location
WHEN WRITE_DISPLAY_CHAR4 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_M1;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR5;
-- Write ASCII hex character in fifth LCD character location
WHEN WRITE_DISPLAY_CHAR5 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_M0;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR6;
-- Write ASCII hex character in sixth LCD character location
WHEN WRITE_DISPLAY_CHAR6 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3A" ;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR7;
-- Write ASCII hex character in seventh LCD character location
WHEN WRITE_DISPLAY_CHAR7 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_S1;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR8;
-- Write ASCII hex character in eighth LCD character location
WHEN WRITE_DISPLAY_CHAR8 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_S0;
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR9;
WHEN WRITE_DISPLAY_CHAR9 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"2E";
state <= TOGGLE_E;
next_command <= WRITE_DISPLAY_CHAR10;
WHEN WRITE_DISPLAY_CHAR10 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"30";
state <= TOGGLE_E;
next_command <= RETURN_HOME;
----ALARM_END
WHEN WRITE_CHAR1 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_HRD1;
state <= TOGGLE_E;
next_command <= WRITE_CHAR2;
-- Write ASCII hex character in second LCD character location
WHEN WRITE_CHAR2 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_HRD0;
state <= TOGGLE_E;
next_command <= WRITE_CHAR3;
-- Write ASCII hex character in third LCD character location
WHEN WRITE_CHAR3 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3A" ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR4;
-- Write ASCII hex character in fourth LCD character location
WHEN WRITE_CHAR4 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_MIND1;
state <= TOGGLE_E;
next_command <= WRITE_CHAR5;
-- Write ASCII hex character in fifth LCD character location
WHEN WRITE_CHAR5 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_MIND0;
state <= TOGGLE_E;
next_command <= WRITE_CHAR6;
-- Write ASCII hex character in sixth LCD character location
WHEN WRITE_CHAR6 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3A" ;
state <= TOGGLE_E;
next_command <= WRITE_CHAR7;
-- Write ASCII hex character in seventh LCD character location
WHEN WRITE_CHAR7 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_SECD1;
state <= TOGGLE_E;
next_command <= WRITE_CHAR8;
-- Write ASCII hex character in eighth LCD character location
WHEN WRITE_CHAR8 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_SECD0;
state <= TOGGLE_E;
next_command <= WRITE_CHAR9;
WHEN WRITE_CHAR9 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"2E";
state <= TOGGLE_E;
next_command <= WRITE_CHAR10;
WHEN WRITE_CHAR10 =>
LCD_E <= '1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_TSEC;
state <= TOGGLE_E;
next_command <= GOTO_NEXTLINE;
---------------
WHEN WRITE_CHAR11 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_YEAR1;
state<= TOGGLE_E;
next_command <= WRITE_CHAR12;
WHEN WRITE_CHAR12 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_YEAR0;
state<= TOGGLE_E;
next_command <= WRITE_CHAR13;
WHEN WRITE_CHAR13 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"2D"; --顯示"-"
state<= TOGGLE_E;
next_command <= WRITE_CHAR14;
WHEN WRITE_CHAR14 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_MONTH1;
state<= TOGGLE_E;
next_command <= WRITE_CHAR15;
WHEN WRITE_CHAR15 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"3" & BCD_MONTH0;
state<= TOGGLE_E;
next_command <= WRITE_CHAR16;
WHEN WRITE_CHAR16 =>
LCD_E <='1';
LCD_RS <= '1';
LCD_RW <= '0';
DATA_BUS_VALUE <= X"2D"; --顯示"-"
state<= TOGGLE_E;
next_command <= WRITE_CHAR17;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -