630 likes | 851 Vues
Digital Watch 구현. Lecture #13. Digital Watch – Design Specification. VHDL 의 입출력 설계 사양 입력 : Clock : 12MHz Key 3 개 : RESET SW, SET SW, INC SW 출력 : LCD Interface : E, RS, RW, D0, D1, D2, D3, D4, D5, D6, D7. RESET. SET. INC. Digital Watch – Design Specification.
E N D
Digital Watch 구현 Lecture #13
Digital Watch – Design Specification • VHDL의 입출력 설계 사양 • 입력 : • Clock : 12MHz • Key 3개 : RESET SW, SET SW, INC SW • 출력 : • LCD Interface : E, RS, RW, D0, D1, D2, D3, D4, D5, D6, D7 모바일컴퓨터특강
RESET SET INC Digital Watch – Design Specification • 입력장치( Input Device ) • 3개의 푸시 버튼 스위치를 사용 • RESET SW, SET SW, INC SW • 각각의 스위치는 눌러질 경우에 1을 출력하고, 평상시에는 0을 출력하는 구조 모바일컴퓨터특강
Digital Watch – Design Specification • 출력장치(Output Device) • Character LCD 16문자 2줄 D.D.RAM의 주소 모바일컴퓨터특강
Digital Watch – Design Specification • Digital Watch 동작 설계 (1) 초기 POWER ON시 RESET상태 ( = Initial_State ) - 초기에 표시되는 값은 AM 12 : 00 임 - AM 12 00 전체가 0.5초 간격으로 깜박거림 - SET KEY가 눌러지면 시간 수정모드의 처음인 TIME AM/PM SETTING MODE 로 이동 모바일컴퓨터특강
Digital Watch – Design Specification (2) 시간 수정모드 ① TIME AM/PM SETTING MODE ( = Time_AmPm_Set_State ) - 초기상태는 AM/PM위치의 LED가 0.5초 간격으로 깜박이며 다른 부분은 DISPLAY ON됨 - INC KEY에 의해 AM/PM이 반전되어 나타남 - SET KEY를 누르면 TIME HOUR SETTING MODE로 이동 ② TIME HOUR SETTING MODE ( = Time_Hour_Set_State ) - 현재의 HOUR을 나타내는 LED가 0.5초 간격으로 깜박임 - INC KEY에 의해 1씩 증가함 12 1 2 3 4 5 6 7 8 9 10 11 12 .. - SET KEY를 누르면 TIME MIN HIGH SETTING MODE로 이동 Set Key나 Inc Key 2가지 입력 중 어느 하나의 Key라도 눌러지면 그 시점에 동기를 맞춰 켜짐부터 깜박임을 다시 시작해야 한다.=> 이런 디스플레이 방식이 시간 수정 시에 자연스럽다. 모바일컴퓨터특강
Digital Watch – Design Specification (2) 시간 수정모드 ③ TIME MIN HIGH SETTING MODE ( = Time_Min_High_Set_State ) - 현재의 분의 HIGH를 나타내는 LED가 0.5초 간격으로 깜박임 - INC KEY에 의해 1씩 증가함 0 1 2 3 4 5 0 .. - SET KEY를 누르면 TIME MIN LOW SETTING MODE로 이동 ④ TIME MIN LOW SETTING MODE ( = Time_Min_Low_Set_State ) - 현재의 분의 LOW를 나타내는 LED가 0.5초 간격으로 깜박임 - INC KEY에 의해 1씩 증가함 0 1 2 3 4 5 0 .. - SET KEY를 누르면 NORMAL TIME MODE로 이동 모바일컴퓨터특강
Digital Watch – Design Specification (3) NORMAL TIME MODE ( = Normal_Time_State ) - 현재 진행되는 시간을 나타냄 - SET KEY가 눌러지면 시간 수정모드의 처음인 TIME AM/PM SETTING MODE 로 이동 모바일컴퓨터특강
Digital Watch –전체 회로 LCD의 밝기 조절 회로. 이 부분을 VHDL로 설계함. CharacterLCD사용. 모바일컴퓨터특강
Digital Watch – Top Level 구성 모바일컴퓨터특강
Digital Watch – Top Level 구성 BCD -> ASCII 변환부 LCD Interface 부 이 블록을 제외하고 나머지는 Digital Watch – FND Interface와 같음. 모바일컴퓨터특강
Digital Watch – Top Level Entity (1) -- purpose : clock top block -- ver 2 : LCD interface LIBRARY IEEE; USE IEEE.std_logic_1164.all; entity clocklcd is port( clk : in std_logic; reset_sw : in std_logic; set_sw : in std_logic; inc_sw : in std_logic; --; e : out std_logic; rw : out std_logic; rs : out std_logic; data : out std_logic_vector(7 downto 0) ); end clocklcd; Architecture a of clocklcd is signal set_button, inc_button : std_logic; signal set_shot, inc_shot : std_logic; signal reset, Hz100 : std_logic; signal state : std_logic_vector(3 downto 0); signal time_set_mode : std_logic; -- time counters for 7 segment signal time_ampm : std_logic; signal time_hour_high : std_logic; signal time_hour_low : std_logic_vector(3 downto 0); signal time_min_high : std_logic_vector(2 downto 0); signal time_min_low : std_logic_vector(3 downto 0); signal time_sec_high : std_logic_vector(2 downto 0); signal time_sec_low : std_logic_vector(3 downto 0); signal led_blink : std_logic; signal buzzer_blink : std_logic; -- for 0.5 sec buzer blink 모바일컴퓨터특강
Digital Watch – Top Level Entity (2) signal initial_state : std_logic; signal time_ampm_set_state : std_logic; signal time_hour_set_state : std_logic; signal time_min_high_set_state : std_logic; signal time_min_low_set_state : std_logic; signal normal_time_state : std_logic; signal s_select_hour_high : std_logic; -- for hour_high=0 : display Off; signal LCD_time_ampm_ap : std_logic_vector(7 downto 0); signal LCD_time_ampm_m : std_logic_vector(7 downto 0); signal LCD_time_hour_high : std_logic_vector(7 downto 0); signal LCD_time_hour_low : std_logic_vector(7 downto 0); signal LCD_time_min_high : std_logic_vector(7 downto 0); signal LCD_time_min_low : std_logic_vector(7 downto 0); signal LCD_time_sec_high : std_logic_vector(7 downto 0); signal LCD_time_sec_low : std_logic_vector(7 downto 0); signal LCD_time_sec_colon : std_logic_vector(7 downto 0); component statemachine port ( clk : in std_logic; reset : in std_logic; set_shot : in std_logic; initial_state : out std_logic; time_ampm_set_state : out std_logic; time_hour_set_state : out std_logic; time_min_high_set_state : out std_logic; time_min_low_set_state : out std_logic; normal_time_state : out std_logic; time_set_mode : out std_logic ); end component; 모바일컴퓨터특강
Digital Watch – Top Level Entity (3) component timecount port( clk : in std_logic; reset : in std_logic; inc_shot : in std_logic; set_shot : in std_logic; initial_state : in std_logic; time_ampm_set_state : in std_logic; time_hour_set_state : in std_logic; time_min_high_set_state : in std_logic; time_min_low_set_state : in std_logic; normal_time_state : in std_logic; -- time counters for 7 segment time_ampm : buffer std_logic; time_hour_high : buffer std_logic; time_hour_low : buffer std_logic_vector(3 downto 0); time_min_high : buffer std_logic_vector(2 downto 0); time_min_low : buffer std_logic_vector(3 downto 0); time_sec_high : buffer std_logic_vector(2 downto 0); time_sec_low : buffer std_logic_vector(3 downto 0); buzzer_blink : buffer std_logic -- for 0.5 sec buzer blink ); end component; component ledblink port( clk : in std_logic; reset : in std_logic; set_shot : in std_logic; inc_shot : in std_logic; initial_state : in std_logic; time_set_mode : in std_logic; led_blink : buffer std_logic ); end component; 모바일컴퓨터특강
Digital Watch – Top Level Entity (4) component LCD_IF port( clk : in std_logic; -- 10KHz : 0.1msec = 100usec resetb : in std_logic; -- LCD input : time information LCD_time_ampm_ap : in std_logic_vector(7 downto 0); LCD_time_ampm_m : in std_logic_vector(7 downto 0); LCD_time_hour_high : in std_logic_vector(7 downto 0); LCD_time_hour_low : in std_logic_vector(7 downto 0); LCD_time_min_high : in std_logic_vector(7 downto 0); LCD_time_min_low : in std_logic_vector(7 downto 0); LCD_time_sec_high : in std_logic_vector(7 downto 0); LCD_time_sec_low : in std_logic_vector(7 downto 0); LCD_time_sec_colon : in std_logic_vector(7 downto 0); e : out std_logic; rw : out std_logic; rs : out std_logic; data : out std_logic_vector(7 downto 0) ); end component; component Hz100ctrl port( clk,nclr : in std_logic; Hz100 : out std_logic ); end component; component shotpulse port( clk : in std_logic; reset : in std_logic; d : in std_logic; rising_shot : out std_logic ); end component; 모바일컴퓨터특강
Digital Watch – Top Level Entity (5) component ToLCDBlink port( initial_state : in std_logic; time_ampm_set_state : in std_logic; time_hour_set_state : in std_logic; time_min_high_set_state : in std_logic; time_min_low_set_state : in std_logic; normal_time_state : in std_logic; led_blink : in std_logic; -- time clock time_ampm : in std_logic; time_hour_high : in std_logic; time_hour_low : in std_logic_vector(3 downto 0); time_min_high : in std_logic_vector(2 downto 0); time_min_low : in std_logic_vector(3 downto 0); time_sec_high : in std_logic_vector(2 downto 0); time_sec_low : in std_logic_vector(3 downto 0); -- LCD input : time information LCD_time_ampm_ap : out std_logic_vector(7 downto 0); LCD_time_ampm_m : out std_logic_vector(7 downto 0); LCD_time_hour_high : out std_logic_vector(7 downto 0); LCD_time_hour_low : out std_logic_vector(7 downto 0); LCD_time_min_high : out std_logic_vector(7 downto 0); LCD_time_min_low : out std_logic_vector(7 downto 0); LCD_time_sec_high : out std_logic_vector(7 downto 0); LCD_time_sec_low : out std_logic_vector(7 downto 0); LCD_time_sec_colon : out std_logic_vector(7 downto 0)); end component; 모바일컴퓨터특강
Digital Watch – Top Level Entity (6) begin U1: statemachine port map( Hz100, reset, set_shot, initial_state, time_ampm_set_state, time_hour_set_state, time_min_high_set_state, time_min_low_set_state, normal_time_state, time_set_mode); U2: timecount port map( Hz100, reset, inc_shot, set_shot, initial_state, time_ampm_set_state, time_hour_set_state, time_min_high_set_state, time_min_low_set_state, normal_time_state, time_ampm, time_hour_high, time_hour_low, time_min_high, time_min_low, time_sec_high, time_sec_low, buzzer_blink ); U3: ledblink port map( Hz100, reset, set_shot, inc_shot, initial_state, time_set_mode, led_blink); U4 :Hz100ctrl port map( clk,reset,Hz100); U5: shotpulse port map( Hz100, reset, set_button, set_shot ); U6: shotpulse port map( Hz100, reset, inc_button, inc_shot ); reset <= not(reset_sw); set_button <= (set_sw) and not(inc_sw); inc_button <= not(set_sw) and inc_sw; U7: ToLCDBlink port map( initial_state, time_ampm_set_state, time_hour_set_state, time_min_high_set_state, time_min_low_set_state, normal_time_state, led_blink, time_ampm, time_hour_high, time_hour_low, time_min_high, time_min_low, time_sec_high, time_sec_low, LCD_time_ampm_ap, LCD_time_ampm_m, LCD_time_hour_high, LCD_time_hour_low, LCD_time_min_high, LCD_time_min_low, LCD_time_sec_high, LCD_time_sec_low, LCD_time_sec_colon); U8: LCD_IF port map(clk, reset, LCD_time_ampm_ap, LCD_time_ampm_m, LCD_time_hour_high, LCD_time_hour_low, LCD_time_min_high, LCD_time_min_low, LCD_time_sec_high, LCD_time_sec_low, LCD_time_sec_colon, e, rw, rs, data ); end a; 모바일컴퓨터특강
Digital Watch - Shot Pulse Gen. • 외부에서 입력되는 키의 신호는 모두 클럭 100Hz에 비동기인 신호 • 실제 회로 내부에서 필요한 신호는 동기신호 이므로 동기처리 후 Shot Pulse를 만들어야 한다 100Hz Clk에 비동기 입력 Clk에 동기 됨 입력신호가 1로 들어오면 100Hz의 1주기동안 1인 신호 모바일컴퓨터특강
Digital Watch - Shot Pulse Gen. -- purpose : rising shot pulse generator LIBRARY IEEE; USE IEEE.std_logic_1164.all; entity shotpulse is port( clk : in std_logic; reset : in std_logic; d : in std_logic; rising_shot : out std_logic ); end shotpulse; architecture a of shotpulse is signal qa,qb : std_logic; begin process(clk,reset) begin if(reset='0') then qa<='0';qb<='0'; elsif(clk'event and clk='1') then qa<= d; qb<=qa; end if; end process; rising_shot <= qa and not(qb); end a; 모바일컴퓨터특강
Digital Watch - 100Hz Gen. • 12MHz Clock(=clk)으로부터 1/100초인 100Hz(=Hz100)을 만드는 회로 10KHz 100Hz는 1/100초이므로 Stop Watch의 1/100초를 카운트하는데 사용되는 클럭으로 사용된다. TimeControl 블록과 KeyIF의 클럭으로 사용됨 10KHz:100Hz=100:1 그러므로 10KHz가 100주기 발생할 때 100Hz는 1주기 발생하면 된다. 모바일컴퓨터특강
Digital Watch - 100Hz Gen. Clk=10KHz library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity Hz100ctrl is port( clk, nclr : in std_logic; Hz100 : out std_logic); end Hz100ctrl; architecture a of Hz100ctrl is signal cnt : std_logic_vector(5 downto 0); signal sHz100 : std_logic; Begin process(nclr,clk) begin if( nclr='0') then cnt <="000000"; elsif(clk'event and clk='1') then if(cnt=49) then cnt <= "000000"; else cnt <= cnt+'1'; end if; end if; end process; process(nclr,clk) begin if( nclr='0') then sHz100 <='0'; elsif(clk'event and clk='1') then if(cnt=49) then sHz100 <= not sHz100; end if; end if; end process; Hz100 <= sHz100; end a; Hz100=100Hz Modulo 50 Counter Cnt=49일 때마다 Hz100를 Toggle함 모바일컴퓨터특강
Digital Watch - Mode Control(Flow) Input : Set_Shot Set_Shot은 입력 스위치인 Set Key를 누르면 클럭의 1주기 동안만 1이 되는 Shot Pulse 임. 0 S0 1 상태는 전부 6개로 나누어짐. S0 : Initial State S1 : AM/PM Setting State S2 : Hour Setting State S3 : Minute High Setting State S4 : Minute Low Setting State S5 : Normal Time State 0 S1 1 S1, S2, S3, S4는 시간 수정 Mode임. 0 S2 1 0 S3 1 상태도 설명 : 초기에 전원이 인가되면 S0에서 부터 시작한다. Set_Shot 신호가 1이 입력될 때마다 다음 상태로 천이 되며, 0 입력이면 상태를 그대로 유지한다. 시간 수정모드의 마지막 상태인 S4에서 Set_Shot이 1로 들어오면, 상태는 정상적인 시간이 진행되는 S5로 천이 된다. S5상태에서 Set_Shot이 1로 입력되면 상태는 시간 수정모드의 시작인 S1으로 다시 천이 되고 AM/PM 값의 수정을 시작한다. 0 S4 1 1 0 S5 모바일컴퓨터특강
Digital Watch - Mode Control(Flow) -- purpose : mode control. ver2 LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.std_logic_unsigned.all; entity statemachine is port( clk : in std_logic; reset : in std_logic; set_shot : in std_logic; initial_state : out std_logic; time_ampm_set_state : out std_logic; time_hour_set_state : out std_logic; time_min_high_set_state : out std_logic; time_min_low_set_state : out std_logic; normal_time_state : out std_logic; time_set_mode : out std_logic ); end statemachine; architecture a of statemachine is signal cnt : std_logic_vector(2 downto 0); signal decout : std_logic_vector(5 downto 0); begin 출력신호:각각의 상태를 출력함 Time_set_mode는 시간수정모드인 경우에 1을 출력함. 모바일컴퓨터특강
Digital Watch - Mode Control(Flow) process(clk,reset) begin if(reset='0') then cnt <= "000"; elsif(clk'event and clk='1') then if(set_shot ='1') then if(cnt="101") then cnt <= "001"; else cnt <= cnt+'1'; end if; end if; end if; end process ; process(cnt) begin case cnt is when "000" => decout <= "100000"; when "001" => decout <= "010000"; when "010" => decout <= "001000"; when "011" => decout <= "000100"; when "100" => decout <= "000010"; when others => decout <= "000001"; end case; end process ; Counter를 이용한 State Machine 구현 Cnt의 값을 Decoding 모바일컴퓨터특강
Digital Watch - Mode Control(Flow) initial_state <= decout(5); time_ampm_set_state <= decout(4); time_hour_set_state <= decout(3); time_min_high_set_state <= decout(2); time_min_low_set_state <= decout(1); normal_time_state <= decout(0); time_set_mode <= decout(4) or decout(3) or decout(2) or decout(1) ; end a; 각각의 State를 출력함. Time_set_mode는 시간수정모드인 경우에 1을 출력함. 모바일컴퓨터특강
Digital Watch - Time Control 시간 수정모드에서의 Flow AM/PM 수정모드 Hour 수정모드 분 10의자리 수정모드 분 1의자리 수정모드 9시 12시 50분 9분 모바일컴퓨터특강
Digital Watch - Time Control 시간진행모드에서의 Flow 1초= time_Cnt=25 & Buzzer_Blink=1 9초 59초 9분59초 59분59초 9시59분59초 12시59분59초 11시59분59초 모바일컴퓨터특강
Digital Watch - Time Control -- purpose : time counter control(revised 3) LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.std_logic_unsigned.all; entity timecount is port( clk : in std_logic; reset : in std_logic; inc_shot : in std_logic; set_shot : in std_logic; initial_state : in std_logic; time_ampm_set_state : in std_logic; time_hour_set_state : in std_logic; time_min_high_set_state : in std_logic; time_min_low_set_state : in std_logic; normal_time_state : in std_logic; -- time counters for 7 segment time_ampm : buffer std_logic; time_hour_high : buffer std_logic; time_hour_low : buffer std_logic_vector(3 downto 0); time_min_high : buffer std_logic_vector(2 downto 0); time_min_low : buffer std_logic_vector(3 downto 0); time_sec_high : buffer std_logic_vector(2 downto 0); time_sec_low : buffer std_logic_vector(3 downto 0); buzzer_blink : buffer std_logic -- for 0.5 sec buzer blink ); end timecount; 모바일컴퓨터특강
Digital Watch - Time Control architecture a of timecount is CONSTANT AM : std_logic := '0'; CONSTANT PM : std_logic := '1'; signal time_cnt : std_logic_vector(5 downto 0); -- for 0.5 sec count signal sec_high5,sec_low9 : std_logic; signal min_high5,min_low9 : std_logic; signal hour_high1,hour_low1,hour_low2,hour_low9 : std_logic; signal sec_59 : std_logic; signal min_sec_959 : std_logic; signal min_sec_5959 : std_logic; signal hour_min_sec_95959 : std_logic; signal hour_min_sec_115959 : std_logic; signal hour_min_sec_125959 : std_logic; signal hour_12 : std_logic; signal one_sec : std_logic; begin sec_high5 <= time_sec_high(2) and time_sec_high(0); min_high5 <= time_min_high(2) and time_min_high(0); hour_high1 <= time_hour_high; sec_low9 <= time_sec_low(3) and time_sec_low(0); min_low9 <= time_min_low(3) and time_min_low(0); hour_low9 <= time_hour_low(3) and time_hour_low(0); hour_low1 <= time_hour_low(0); hour_low2 <= time_hour_low(1); sec_59 <= sec_high5 and sec_low9; min_sec_959 <= min_low9 and sec_59; min_sec_5959 <= min_high5 and min_sec_959; hour_min_sec_95959 <= hour_low9 and min_sec_5959; hour_min_sec_115959 <= hour_high1 and hour_low1 and min_sec_5959; hour_min_sec_125959 <= hour_high1 and hour_low2 and min_sec_5959; hour_12 <= hour_high1 and hour_low2; 모바일컴퓨터특강
Digital Watch - Time Control process(clk, reset) begin if(reset='0') then time_ampm <= AM; elsif(clk'event and clk='1') then if( (time_ampm_set_state='1' and inc_shot='1') or (normal_time_state='1' and one_sec='1' and hour_min_sec_115959='1')) then time_ampm <= not(time_ampm); end if; end if; end process; process(clk, reset) begin if(reset='0') then time_hour_high <= '1'; elsif(clk'event and clk='1') then if( (time_hour_set_state='1' and inc_shot='1' and ( hour_low9='1' or hour_12='1') ) or (normal_time_state='1' and one_sec='1' and (hour_min_sec_95959='1' or hour_min_sec_125959='1') ) ) then time_hour_high <= not(time_hour_high); end if; end if; end process; 11시59분59초 9시 또는 12시 12시59분59초 9시59분59초 모바일컴퓨터특강
Digital Watch - Time Control 9시 process(clk, reset) begin if(reset='0') then time_hour_low <= "0010"; elsif(clk'event and clk='1') then if( (time_hour_set_state='1' and inc_shot='1' and hour_low9='1') or (normal_time_state='1' and one_sec='1' and hour_min_sec_95959='1') )then time_hour_low <= "0000"; elsif( (time_hour_set_state='1' and inc_shot='1' and hour_12='1') or (normal_time_state='1' and one_sec='1' and hour_min_sec_125959='1') ) then time_hour_low <= "0001"; elsif( ( time_hour_set_state='1' and inc_shot='1') or ( normal_time_state='1' and one_sec='1' and min_sec_5959='1' ) )then time_hour_low <= time_hour_low+'1'; end if; end if; end process; process(clk, reset) begin if(reset='0') then time_min_high <= "000"; elsif(clk'event and clk='1') then if( (time_min_high_set_state='1' and inc_shot='1' and min_high5='1') or (normal_time_state='1' and one_sec='1' and min_sec_5959='1' )) then time_min_high <= "000"; elsif( (time_min_high_set_state='1' and inc_shot='1') or (normal_time_state='1' and one_sec='1' and min_sec_959='1' ) )then time_min_high <= time_min_high+'1'; end if; end if; end process; 9시59분59초 12시 12시59분59초 59분59초 50분 59분59초 모바일컴퓨터특강 9분59초
Digital Watch - Time Control process(clk, reset) begin if(reset='0') then time_min_low <= "000"; elsif(clk'event and clk='1') then if( (time_min_low_set_state='1' and inc_shot='1' and min_low9='1') or (normal_time_state='1' and one_sec='1' and min_sec_959='1' ) )then time_min_low <= "0000"; elsif( (time_min_low_set_state='1' and inc_shot='1' ) or (normal_time_state='1' and one_sec='1' and sec_59='1' ) )then time_min_low <= time_min_low+'1'; end if; end if; end process; process(clk, reset) begin if(reset='0') then time_sec_high <= "000"; elsif(clk'event and clk='1') then if(normal_time_state='1' and one_sec='1' and sec_59='1' ) then time_sec_high <= "000"; elsif(normal_time_state='1' and one_sec='1' and sec_low9='1' ) then time_sec_high <= time_sec_high+'1'; end if; end if; end process; 9분 9분59초 59초 59초 9초 모바일컴퓨터특강
Digital Watch - Time Control process(clk, reset) begin if(reset='0') then time_sec_low <= "0000"; elsif(clk'event and clk='1') then if(normal_time_state='1' and one_sec='1' and sec_low9='1' ) then time_sec_low <= "0000"; elsif(normal_time_state='1' and one_sec='1' ) then time_sec_low <= time_sec_low+'1'; end if; end if; end process; process(clk,reset) -- time_cnt, buzzer_blink processing begin if(reset='0') then time_cnt <= "000000"; elsif(clk'event and clk='1') then if( time_min_low_set_state='1' and set_shot='1') then time_cnt <= “000000"; elsif( initial_state='1') then null; elsif(time_cnt = 49) then time_cnt<=“000000"; else time_cnt <= time_cnt+'1'; end if; end if; end process; 9초 1초 0.5초 모바일컴퓨터특강
Digital Watch - Time Control process(clk,reset) begin if(reset='0') then buzzer_blink <= '0'; elsif(clk'event and clk='1') then if( time_min_low_set_state='1' and set_shot='1') then buzzer_blink <= '0'; elsif(time_cnt = 49) then buzzer_blink <= not( buzzer_blink); end if; end if; end process; process(time_cnt,buzzer_blink) begin if(time_cnt = 49 and buzzer_blink ='1' ) then one_sec <='1'; else one_sec <='0'; end if; end process; end a; 0.5초 1초 모바일컴퓨터특강
Digital Watch – LedBlink (Flow) 이 블럭의 목적은 키가 눌러졌을 때마다 FND의 Display를 동기화 시키는데 목적이 있는 것임. 1. 시스템의 초기상태(Initial_State)에서는 Set Key만 센싱을 하게 되는데, Set Key가 눌러지면 눌러지는 시점에서부터 0.5초간 FND의 값을 Display를 ON하고 다음 0.5초간은 Display를 OFF 한다. 2. 시간을 고치는 시간수정모드(Time_Set_Mode) 에서는 Set Key나 Inc Key 2가지 입력 모두에 대해 센싱을 해서 어느 하나의 Key라도 눌러지면 그 시점에 동기를 맞춰 Display On 시점을 다시 조정해서 0.5초간은 Display ON하며 다음 0.5초간은 Display OFF를 반복한다. 3. Led_blink_cnt는 30초(Half_CnT)를 세기위한 카운터임. 4. Led_blink가 1이면 Display ON이며, 0이면 Display OFF의 상태임. 모바일컴퓨터특강
Digital Watch - LedBlink -- purpose : led blink control LIBRARY IEEE; USE IEEE.std_logic_1164.all; USE IEEE.std_logic_unsigned.all; entity ledblink is port( clk : in std_logic; reset : in std_logic; set_shot : in std_logic; inc_shot : in std_logic; initial_state : in std_logic; time_set_mode : in std_logic; led_blink : buffer std_logic ); end ledblink; architecture a of ledblink is signal led_blink_cnt : std_logic_vector(5 downto 0); begin 모바일컴퓨터특강
Digital Watch - LedBlink 초기상태(Initial_State)에서는 Set SW가 눌러졌을 경우에 Display를 켜기부터 시작, -- 0.5 sec led blink control process(clk,reset) begin if(reset='0') then led_blink_cnt <= "00000"; elsif(clk'event and clk='1') then if( initial_state='1' and set_shot='1') then led_blink_cnt <="00000"; elsif( time_set_mode='1' and (set_shot='1' or inc_shot='1')) then led_blink_cnt <="00000"; else if(led_blink_cnt=49)then led_blink_cnt <="00000"; else led_blink_cnt <= led_blink_cnt+'1'; end if; end if; end if; -- end clk'event end process; 시간수정모드(Time_Set_Mode)에서는 Set Sw나 Inc Sw가 눌러지는 경우에 Display를 켜기부터 시작함. Led_blink_Cnt 는 30초씩 깜박임 조절을 위해 30초(Half_CnT)를 세기위한 카운터임. 그러므로 Display를 새로이 하기위해서는 위의 두가 지 경우에 0부터 다시 카운트 되어야 함. 모바일컴퓨터특강
Digital Watch - LedBlink 초기상태(Initial_State)에서는 Set SW가 눌러졌을 경우에 Display를 켜기 위해 Led_Blink=1로 만듬. process(clk,reset) begin if(reset='0') then led_blink <='0'; elsif(clk'event and clk='1') then if( initial_state='1' and set_shot='1') then led_blink <= '1'; elsif( time_set_mode='1' and (set_shot='1' or inc_shot='1')) then led_blink <= '1'; elsif(led_blink_cnt=49)then led_blink <= not(led_blink); end if; end if; end process; end a; Led_blink가 1이면 Display ON이며, 0이면 Display OFF의 상태임. 시간수정모드(Time_Set_Mode)에서는 Set Sw나 Inc Sw가 눌러지는 경우에 Display를 켜기 위해 Led_Blink=1로 만듬. 0.5초가 지나면 Led_Blink를 Toggle해서 깜박임 조절함. 모바일컴퓨터특강
Digital Watch – LCD_IF library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use work.myLCD.all; entity LCD_IF is port( clk : in std_logic; -- 10KHz : 0.1msec = 100usec resetb : in std_logic; -- LCD input : time information LCD_time_ampm_ap : in std_logic_vector(7 downto 0); LCD_time_ampm_m : in std_logic_vector(7 downto 0); LCD_time_hour_high : in std_logic_vector(7 downto 0); LCD_time_hour_low : in std_logic_vector(7 downto 0); LCD_time_min_high : in std_logic_vector(7 downto 0); LCD_time_min_low : in std_logic_vector(7 downto 0); LCD_time_sec_high : in std_logic_vector(7 downto 0); LCD_time_sec_low : in std_logic_vector(7 downto 0); LCD_time_sec_colon : in std_logic_vector(7 downto 0); e : out std_logic; rw : out std_logic; rs : out std_logic; data : out std_logic_vector(7 downto 0) ); end LCD_IF; architecture hb of LCD_IF is signal dsp_data : std_logic_vector(7 downto 0); signal clk2 : std_logic; -- 5KHz : 0.2msec = 200usec signal Fclk2 : std_logic; -- 5KHz : 0.2msec = 200usec signal LCD_mode : std_logic_vector(3 downto 0); signal cnt5 : std_logic_vector(4 downto 0); -- modulo 21 counter signal Func_Set_shot : std_logic; signal Normal_Mode : std_logic; signal Write_shot : std_logic; signal Line : std_logic_vector(1 downto 0); -- 2 bits counter begin 입력클럭 clk=100us ASCII Code로 표시된 시간 정보 LCD의 제어를 위한 출력 모바일컴퓨터특강
Digital Watch – LCD_IF process(clk, resetb) -- modulo 2 counter gen. begin if(resetb='0') then clk2 <= '0'; elsif( clk='1' and clk'event )then clk2 <= not clk2; end if; end process; process(clk, resetb) begin if(resetb='0') then Fclk2 <= '0'; elsif( clk='0' and clk'event )then Fclk2 <= clk2; end if; end process; process(clk2, resetb) -- modulo 21 counter gen. begin if(resetb='0') then cnt5 <= "00000"; elsif( clk2='1' and clk2'event )then if(cnt5 = "10100") then cnt5 <= "00000"; else cnt5 <= cnt5 + "00001"; end if; end if; end process; process(clk2, resetb) -- Line Counter gen. begin if(resetb='0') then Line <= "00"; elsif( clk2='1' and clk2'event )then if( cnt5 = "10100" ) then -- when cnt5=20 ? Line <= Line + "01"; else Line <= Line; end if; end if; end process; 2분주회로 Clk2 = Fclk2 = 200us Modulo 21 Counter Line = 21x200us = 41us 모바일컴퓨터특강
Digital Watch – LCD_IF process(clk2, resetb) -- LCD Mode Allocation begin if(resetb='0') then LCD_mode <= "0000"; elsif( clk2='1' and clk2'event )then if( cnt5 = "10100" and Line = "11" ) then -- when 21*4*0.2msec = 16.8msec interval if(LCD_mode = "1000") then LCD_mode <= "1000"; else LCD_mode <= LCD_mode + "0001"; end if; end if; end if; end process; process( LCD_mode ) begin if( LCD_mode = "1000") then Normal_Mode <= '1'; else Normal_Mode <= '0'; end if; end process; process( cnt5, Line, LCD_mode) -- Command Shot Pulse gen. begin if( cnt5 = "00000" and Line = "00" and (LCD_mode < "1000") and not (LCD_mode="0000")) then -- 16.8msec interval Func_Set_shot <= '1'; else Func_Set_shot <= '0'; end if; end process; 16.8msec마다 LCD_mode증가하고, 8이면 LCD_mode를 정지 LCD_mode의 값이 1-7인 범위일 떄, 16.8 ms마다 한번씩 Line=00미면서 cnt5=00000인 구간에서 Func_Set_shot를 1로 만듬. LCD_mode=8이면 Normal_Mode 로 함. 모바일컴퓨터특강
Digital Watch – LCD_IF -- Write_Shot gen. process(Normal_Mode, cnt5) begin if(cnt5 = "00000" and Normal_Mode ='1') then Write_Shot <= '1'; else Write_Shot <= '0'; end if; end process; rw <= '0'; -- write only rs <= not ( Func_Set_shot or Write_Shot ); e <= ( Func_Set_shot or Normal_Mode) and Fclk2; process( LCD_mode ) begin case LCD_mode is when "0001" => data<="00111100"; -- Function Setting when "0010" => data<="00111100"; when "0011" => data<="00111100"; when "0100" => data<="00111100"; when "0101" => data<="00000001"; -- Display Clear when "0110" => data<="00000110"; -- Entry Mode Setting when "0111" => data<="00001100"; -- Display On/Off setting when "1000" => data<= Dsp_Data; when others => data<="00000000"; end case; end process; Write Only Mode. E, RS발생 RS는 200us동안만 0, E는 100usec동안만 1로 만듬. LCD 초기화 과정 모바일컴퓨터특강
Digital Watch – LCD_IF process(clk) begin if( Line = "00") then case cnt5 is when "00000" => dsp_data <="10000000"; -- DD Ram Addr = 00H when "00100" => dsp_data <= Ascii_D; when "00101" => dsp_data <= Ascii_I; when "00110" => dsp_data <= Ascii_G; when "00111" => dsp_data <= Ascii_I; when "01000" => dsp_data <= Ascii_T; when "01001" => dsp_data <= Ascii_A; when "01010" => dsp_data <= Ascii_L; when "01100" => dsp_data <= Ascii_W; when "01101" => dsp_data <= Ascii_A; when "01110" => dsp_data <= Ascii_T; when "01111" => dsp_data <= Ascii_C; when "10000" => dsp_data <= Ascii_H; when others => dsp_data <= Ascii_space; end case; else LCD 첫번째 라인 출력 DIGITAL WATCH 모바일컴퓨터특강
Digital Watch – LCD_IF case cnt5 is when "00000" => dsp_data <="11000000"; -- DD RAM addr = 40H when "00100" => dsp_data <= Ascii_T; --T when "00101" => dsp_data <= Ascii_I; --I when "00110" => dsp_data <= Ascii_M; --M when "00111" => dsp_data <= Ascii_E; --E when "01000" => dsp_data <= Ascii_colon; --: when "01001" => dsp_data <= LCD_time_ampm_ap; when "01010" => dsp_data <= LCD_time_ampm_m; when "01100" => dsp_data <= LCD_time_hour_high; when "01101" => dsp_data <= LCD_time_hour_low ; when "01110" => dsp_data <= Ascii_colon; --: when "01111" => dsp_data <= LCD_time_min_high ; when "10000" => dsp_data <= LCD_time_min_low ; when "10001" => dsp_data <= LCD_time_sec_colon ; when "10010" => dsp_data <= LCD_time_sec_high ; when "10011" => dsp_data <= LCD_time_sec_low ; when others => dsp_data <= Ascii_space; end case; end if; end process; end hb; LCD 두 번째 라인 출력 (예) TIME:AM 12:07:25 모바일컴퓨터특강
Digital Watch– LCD_IF Timing 7번의 명령어를 세팅 후에 LCD에 문자를 써 넣는다. 16.8ms 16.8ms 16.8ms 16.8ms 16.8ms 16.8ms 16.8ms 16.8ms Entry Mode Setting Function Setting Function Setting Function Setting Function Setting Display Clear Display On/Off setting DD Ram Addr = 00H 16.8msec마다 rs, e를 하나씩 발생해서 Function Set. 모바일컴퓨터특강
Digital Watch – LCD_IF Timing Cnt5는 Modulo 21 Counter Line은 Cnt5가 20일 때만 증가 모바일컴퓨터특강
Digital Watch – LCD_IF Timing LCD_Mode는 Line=3이며, cnt5=20일 때만 증가 확대는 다음 쪽 Line은 cnt5=20일 때만 증가하며 Line=3 이 되면 0으로 증가 모바일컴퓨터특강
Digital Watch – LCD_IF Timing LCD_Mode는 Line=3이며, cnt5=20일 때만 증가 4x21=84(clkx2) 84x0.2msec=16.8.msec LCD의 Setup Time, Hold Time을 만족함. 100usec 50usec 50usec 0.5 clk = 0.5 x 0.1msec=0.05msec=50usec 전원 켜진 후16.8msec지나서 rs, e를 하나 발생. 모바일컴퓨터특강
Digital Watch – LCD_IF Timing DD Ram Addr = 00H 첫번째 라인에 해당되는 문자20개 써 넣기. 모바일컴퓨터특강
Digital Watch – LCD_IF Timing 1번째의 명령어 : 00111100 Function Setting 모바일컴퓨터특강