Stop watch digital watch
This presentation is the property of its rightful owner.
Sponsored Links
1 / 90

Stop Watch & Digital Watch 구현 PowerPoint PPT Presentation


  • 118 Views
  • Uploaded on
  • Presentation posted in: General

Stop Watch & Digital Watch 구현. Lecture #14. Team Project - 학습목표. 지금까지의 교육을 통해 얻은 지식을 토대로 임베디드 하드웨어를 개발하는 프로젝트를 부과하며 , 이의 관리 및 지도를 통하여 최종 결과물을 발표하도록 한다 다양한 프로젝트들의 구현을 통해 VHDL 의 응용능력을 기른다 기본적인 타이밍도의 이해 및 응용능력을 실질적인 프로젝트에 적용하는 능력을 기른다 주요 입출력 장치의 특성을 이해한다

Download Presentation

Stop Watch & Digital Watch 구현

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Stop watch digital watch

Stop Watch & Digital Watch 구현

Lecture #14


Team project

Team Project - 학습목표

  • 지금까지의 교육을 통해 얻은 지식을 토대로 임베디드 하드웨어를 개발하는 프로젝트를 부과하며, 이의 관리 및 지도를 통하여 최종 결과물을 발표하도록 한다

  • 다양한 프로젝트들의 구현을 통해 VHDL의 응용능력을 기른다

  • 기본적인 타이밍도의 이해 및 응용능력을 실질적인 프로젝트에 적용하는 능력을 기른다

  • 주요 입출력 장치의 특성을 이해한다

  • Stop Watch 및 Digital Watch의 VHDL 회로에 대한 기본적인 설계 개념을 제공한다


Stop watch digital watch

Stop Watch 설계


Stop watch design specification

Stop Watch – Design Specification

  • Stop Watch용 VHDL의 입출력 설계 사양

    • 입력 :

      • Clock : 10KHz

      • Key 2개 : RESET, START_STOP

    • 출력 :

      • 공통캐소드단자 6개 : Com0, Com1, Com2, Com3, Com4, Com5

      • Segment LED 출력 7개 : A, B, C, D, E, F, G


Stop watch design specification1

Stop Watch – Design Specification

  • 입력장치( Input Device )

    • 2개의 푸시 버튼 스위치를 사용

    • RESET, START_STOP

    • 각각의 스위치는 눌러질 경우에 1을 출력하고, 평상시에는 0을 출력하는 구조

RESET

START_STOP


Stop watch design specification2

Stop Watch – Design Specification

  • 출력장치(Output Device)

    • 6개의 7 Segment LED을 사용함.

    • 분:2개, 초:2개, 1/100초:2개

분 초 1/100초


Stop watch design specification3

Stop Watch – Design Specification

  • Stop Watch 동작 설계

    (1) 초기 POWER ON시 RESET상태

    - 초기에 표시되는 값은 00 : 00 : 00임

    - START_STOP KEY 가 눌러지면 시간 증가 모드로 이동함


Stop watch design specification4

Stop Watch – Design Specification

(2) 시간 증가 모드

- 00 : 00 : 00  ..  00 : 00 : 99  00 : 01 : 00  ..  00 : 59 : 99

 01 : 00 : 00  ..  59 : 59 : 99  00 : 00 : 00 의 순서로 순환됨

- 시간이 증가되는 상태에서 START_STOP KEY 가 눌러지면 시간을

정지함

- 다시 START_STOP KEY가 눌러지면 정지된 시간에서부터 시작하여

시간을 1/100초 단위의 정밀도로 증가하는 것을 반복함

- RESET KEY가 눌러지면 초기 파워 온 상태와 같은 초기 값인

00:00:00 으로 되며, 시간증가를 정지함


Stop watch

이 부분을 VHDL로 설계함.

6개의 7 Segments만 사용함

분 : 초 : 1/10초

A,B,C,D,E,F,G는 공통으로 사용.

Stop Watch –전체 회로


Stop watch vhdl top diagram

Stop Watch – VHDL Top Diagram


Stop watch vhdl top diagram1

10KHz

처음 부터 다시 시작 버튼

RUN/STOP조정버튼

Stop Watch – VHDL Top Diagram

6개의 FND가운데 하나를 선택함. 6개의 선택신호 중에서 1개만 0이 되고 나머지는 모두 1이 됨.

ENP가 1이면 스톱워치가 증가, 0이면 정지

위에서부터 순서대로 2개씩 묶어 분, 초, 1/100초를 나타냄.

100Hz

RESET신호는 Key가 눌러졌을 때 1인 신호이며, Nclr은 Active Low신호임.

A,B,C,D,E,F,G는 Segment LED의 입력신호 1이면 해당 LED가 발광함.


Stop watch top level entity

10KHz

Stop Watch의 Run/Stop 동작을 조정하는 스위치

6개의 FND가운데 하나를 선택함. 6개의 선택신호 중에서 1개만 0이 되고 나머지는 모두 1이 됨.

0이 되는 위치의 FND가 발광하게 됨.

A,B,C,D,E,F,G의 값은 6개의 FND가 공통으로 연결하여 사용하므로 MUX를 이용하여 시간 정보를 하나씩 번갈아가며 선택해야 함.

Stop Watch – Top Level Entity

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity stopwatch is

port(

clk: in std_logic;

reset: in std_logic;

start_stop: in std_logic;

com0: out std_logic;

com1: out std_logic;

com2: out std_logic;

com3: out std_logic;

com4: out std_logic;

com5: out std_logic;

A : out std_logic;

B : out std_logic;

C : out std_logic;

D : out std_logic;

E : out std_logic;

F : out std_logic;

G : out std_logic

);

end stopwatch;


Stop watch top level entity1

Stop Watch – Top Level Entity

architecture a of stopwatch is

component Hz100ctrl

port( clk,nclr : in std_logic;

Hz100 : out std_logic);

end component;

component keyif

port( start_stop: in std_logic;

clk, nclr: in std_logic;

enp: out std_logic);

end component;

component timecontrol

port( clk, nclr : in std_logic;

enp: in std_logic;

SSL : out std_logic_vector(3 downto 0);

SSH : out std_logic_vector(3 downto 0);

SECL: out std_logic_vector(3 downto 0);

SECH: out std_logic_vector(3 downto 0);

MINL: out std_logic_vector(3 downto 0);

MINH: out std_logic_vector(3 downto 0));

end component;

component outputif

port( clk, nclr : in std_logic;

SSL : in std_logic_vector(3 downto 0);

SSH : in std_logic_vector(3 downto 0);

SEC: in std_logic_vector(3 downto 0);

SECH: in std_logic_vector(3 downto 0);

MINL: in std_logic_vector(3 downto 0);

MINH : in std_logic_vector(3 downto 0);

com_out: out std_logic_vector(5 downto 0);

seg_out: out std_logic_vector(6 downto 0));

end component;


Stop watch top level entity2

RESET는 키가 눌러졌을 때 1이 된다. 그러므로 Active Low로 만들기 위해 Not 처리함.

이후 모든 블록은 Nclr을 리셋신호로 사용함.

Stop Watch – Top Level Entity

signal nclr : std_logic;

signal Hz100 : std_logic;

signal enp: std_logic;

signal SSL : std_logic_vector(3 downto 0);

signal SSH : std_logic_vector(3 downto 0);

signal SECL : std_logic_vector(3 downto 0);

signal SECH : std_logic_vector(3 downto 0);

signal MINL : std_logic_vector(3 downto 0);

signal MINH : std_logic_vector(3 downto 0);

signal com_out: std_logic_vector(5 downto 0);

signal seg_out: std_logic_vector(6 downto 0);

begin

nclr <= not reset;

U1: Hz100ctrl port map( clk,nclr,Hz100);

U2: keyif port map( start_stop,clk,nclr,enp);

U3: timecontrol port map( Hz100,nclr,enp,SSL,SSH,SECL,SECH,MINL,MINH);

U4: outputif port map( clk,nclr,SSL,SSH,SECL,SECH,MINL,MINH,com_out,seg_out);

com0<=com_out(5);com1<=com_out(4);com2<=com_out(3);

com3<=com_out(2);com4<=com_out(1);com5<=com_out(0);

A<=seg_out(6);B<=seg_out(5);C<=seg_out(4);

D<=seg_out(3);E<=seg_out(2);F<=seg_out(1);G<=seg_out(0);

end a;


Stop watch 100hz gen

Stop Watch – 100Hz Gen.

  • 10KHz Clock(=clk)으로부터 1/100초인 100Hz(=Hz100)을 만드는 회로

10KHz

100Hz는 1/100초이므로 Stop Watch의 1/100초를 카운트하는데 사용되는 클럭으로 사용된다. TimeControl 블록과 KeyIF의 클럭으로 사용됨

10KHz:100Hz=100:1

그러므로 10KHz가 100주기 발생할 때 100Hz는 1주기 발생하면 된다.


Stop watch 100hz gen1

Stop Watch – 100Hz Gen.

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;

Clk=10KHz

Hz100=100Hz

Modulo 50 Counter

Cnt=49일 때마다 Hz100를 Toggle함


Stop watch key interface

Stop Watch – Key Interface

  • Start_Stop 키 입력을 받아 Stop Watch의 시작과 정지를 위해 카운터의 증가/정지를 명령하는 ENP를 생성

  • ENP는 1/100초의 Hz100과의 동기가 필요하므로 Shift Register를 하나 더 사용함

Start

Stop

Start_Stop이 홀수번째 1이 입력되면 가 스톱워치가 증가모드, 짝수번째는 정지모드

Clk에 비동기 입력

Clk에 동기 됨

ENP가 1이면 스톱워치가 증가, 0이면 정지

100Hz


Stop watch key interface1

Stop Watch – Key Interface

library ieee; use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity keyif is

port(

start_stop : in std_logic;

clk,nclr : in std_logic;

enp: out std_logic

);

end keyif;

architecture a of keyif is

signal q : std_logic_vector( 1 downto 0);

signal RisingShotPules : std_logic;

signal s_enp: std_logic;

Begin

process(nclr,clk) -- shift register 2bits :

begin

if( nclr='0') then

q <="00";

elsif(clk'event and clk='1') then

q(1) <= q(0);

q(0) <= start_stop;

end if;

end process;

RisingShotPules <= q(0) and (not q(1));

ENP가 1이면 스톱워치가 증가, 0이면 정지

Rising Shot Pulse 발생회로

Q(0)는 CLK에 동기를 맞추기 위한 플립플롭임.


Stop watch key interface2

Stop Watch – Key Interface

-- enp generation

process(nclr,clk)

begin

if( nclr='0') then

s_enp <='0';

elsif(clk'event and clk='1') then

if(RisingShotPules='1') then

s_enp <= not s_enp;

end if;

end if;

end process;

enp <= s_enp;

end a;

ENP 발생회로

RisingShotPulses가 1인 경우 ENP를 Toggle시킨다.


Stop watch time control

Stop Watch – Time Control

  • 입력된 ENP값이 0일 때는 카운터의 값을 정지하고, 1 일 때는

    00:00:00  ..  00:00:99  00:01:00  ..  00:59:99

  •  01:00:00  ..  59:59:99  00:00:00 의 순서로 증가시킴

ENP가 1이면 카운터 증가, 0이면 정지

0.99초

100Hz

59초

00분 00초 00

59분


Stop watch time control1

Stop Watch – Time Control

모든 Counter는 ENP=1일 때만 정상동작 함.

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity timecontrol is

port( clk,nclr : in std_logic;

enp: in std_logic;

SSL : out std_logic_vector(3 downto 0);

SSH : out std_logic_vector(3 downto 0);

SECL : out std_logic_vector(3 downto 0);

SECH : out std_logic_vector(3 downto 0);

MINL : out std_logic_vector(3 downto 0);

MINH : out std_logic_vector(3 downto 0)

);

end timecontrol;

architecture a of timecontrol is

signal s_SSL : std_logic_vector(3 downto 0);

signal s_SSH : std_logic_vector(3 downto 0);

signal s_SECL : std_logic_vector(3 downto 0);

signal s_SECH : std_logic_vector(2 downto 0);

signal s_MINL : std_logic_vector(3 downto 0);

signal s_MINH : std_logic_vector(2 downto 0);

begin

1/00초


Stop watch time control2

Stop Watch – Time Control

s_SSL_cnt: process(nclr,clk)

begin

if( nclr='0') then

s_SSL <="0000";

elsif(clk'event and clk='1') then

if(enp='1' and s_SSL=9) then

s_SSL <= "0000";

elsif(enp='1') then

s_SSL <= s_SSL+'1';

end if;

end if;

end process;

s_SSH_cnt: process(nclr,clk)

begin

if( nclr='0') then

s_SSH <="0000";

elsif(clk'event and clk='1') then

if(enp='1' and s_SSH=9 and s_SSL=9) then

s_SSH <= "0000";

elsif(enp='1' and s_SSL=9) then

s_SSH <= s_SSH+'1';

end if;

end if;

end process;

1/100 초의 1의 자리 Control

: Modulo 0 Counter

1/100 초의 10의 자리 Control


Stop watch time control3

Stop Watch – Time Control

s_SECL_cnt: process(nclr,clk)

begin

if( nclr='0') then

s_SECL <="0000";

elsif(clk'event and clk='1') then

if(enp='1' and s_SECL=9 and s_SSH=9 and s_SSL=9) then

s_SECL <= "0000";

elsif(enp='1' and s_SSH=9 and s_SSL=9) then

s_SECL <= s_SECL+'1';

end if;

end if;

end process;

s_SECH_cnt: process(nclr,clk)

begin

if( nclr='0') then

s_SECH <="000";

elsif(clk'event and clk='1') then

if(enp='1' and s_SECH=5 and s_SECL=9 and s_SSH=9 and s_SSL=9) then

s_SECH <= "000";

elsif(enp='1' and s_SECL=9 and s_SSH=9 and s_SSL=9) then

s_SECH <= s_SECH+'1';

end if;

end if;

end process;

초의 1의 자리 Control

초의 10의 자리 Control


Stop watch time control4

Stop Watch – Time Control

s_MINL_cnt: process(nclr,clk)

begin

if( nclr='0') then s_MINL <="0000";

elsif(clk'event and clk='1') then

if(enp='1' and s_MINL=9 and s_SECH=5 and s_SECL=9 and s_SSH=9 and s_SSL=9) then s_MINL <= "0000";

elsif(enp='1' and s_SECH=5 and s_SECL=9 and s_SSH=9 and s_SSL=9) then

s_MINL <= s_MINL+'1';

end if;

end if;

end process;

s_MINH_cnt: process(nclr,clk)

begin

if( nclr='0') then s_SSH <="000";

elsif(clk'event and clk='1') then

if(enp='1' and s_MINH=5 and s_MINL=9 and s_SECH=5 and s_SECL=9 and s_SSH=9 and s_SSL=9) then

s_MINH <= "000";

elsif(enp='1' and s_MINL=9 and s_SECH=5 and s_SECL=9 and s_SSH=9 and s_SSL=9) then s_MINH <= s_MINH+'1';

end if;

end if;

end process;

SSL <= s_SSL; SSH <= s_SSH;

SECL <= s_SECL; SECH <= '0' & s_SECH;

MINL <= s_MINL;MINH <= '0' & s_MINH;

end a;

분의 1의 자리 Control

분의 10의 자리 Control


Stop watch output interface

Stop Watch – Output Interface

  • 분, 초, 1/100초를 나타내는 카운터의 출력을 6개의 7 Segment LED에 출력하는 회로

  • a,b,c,d,e,f,g를 6개의 7 Segment LED 가 공통으로 이용하므로 6입력 멀티플렉서를 이용하여 순차적으로 하나씩 선택하여 출력해야 함

  • 6개의 7 Segment LED 의 인터페이스를 위해 BCD-7 Segment Decoder를 멀티플렉서 출력에 연결해야 함

12분

분 High의 FND선택

분 Low의 FND선택

6개의 출력신호 중에서 1개만 0이고 나머지는 1

34초

0.90초

BCD-7 Segment Decoder 출력

1 2 3 4 9 0 1


Stop watch output interface1

Stop Watch – Output Interface

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity outputif is

port( clk,nclr : in std_logic;

SSL : in std_logic_vector(3 downto 0);

SSH : in std_logic_vector(3 downto 0);

SECL : in std_logic_vector(3 downto 0);

SECH: in std_logic_vector(3 downto 0);

MINL: in std_logic_vector(3 downto 0);

MINH: in std_logic_vector(3 downto 0);

com_out: out std_logic_vector(5 downto 0);

seg_out: out std_logic_vector(6 downto 0)

);

end outputif;

architecture a of outputif is

signal muxout : std_logic_vector(3 downto 0);

signal cnt : std_logic_vector(2 downto 0);

begin

-- modulo 6 counter

process(nclr,clk)

begin

if( nclr='0') then

cnt<="111";

elsif(clk'event and clk='1') then

if(cnt=5) then

cnt <="000";

else

cnt <= cnt+'1';

end if;

end if;

end process;

6개의 FND를 공통으로 연결된 A,B,C,D,E,F,G를 이용하여 번갈아가며 Display하기위해서는 Modulo 6 Counter가 필요함.


Stop watch output interface2

Stop Watch – Output Interface

-- com signal gen : 3X8 decoder

process(cnt)

begin

case cnt is

when "000" => com_out <= "011111";

when "001" => com_out <= "101111";

when "010" => com_out <= "110111";

when "011" => com_out <= "111011";

when "100" => com_out <= "111101";

when "101" => com_out <= "111110";

when others=> com_out <= "111111";

end case;

end process;

-- 6_1 mux (4bits)

process(cnt)

begin

case cnt is

when "000" => muxout <= MINH;

when "001" => muxout <= MINL;

when "010" => muxout <= SECH;

when "011" => muxout <= SECL;

when "100" => muxout <= SSH;

when others=> muxout <= SSL;

end case;

end process;

6개의 FND가운데 하나를 선택함. 6개의 선택신호 중에서 1개만 0이 되고 나머지는 모두 1이 됨.

0이 되는 위치의 FND가 발광하게 됨.

A,B,C,D,E,F,G의 값은 6개의 FND가 공통으로 연결하여 사용하므로 MUX를 이용하여 시간 정보를 하나씩 번갈아가며 선택해야 함.


Stop watch output interface3

Stop Watch – Output Interface

-- BCD to 7 Segment gen

process(muxout)

begin

case muxout is

when "0000" => seg_out <= "1111110";

when "0001" => seg_out <= "0110000";

when "0010" => seg_out <= "1101101";

when "0011" => seg_out <= "1111001";

when "0100" => seg_out <= "0110011";

when "0101" => seg_out <= "1011011";

when "0110" => seg_out <= "1011111";

when "0111" => seg_out <= "1110000";

when "1000" => seg_out <= "1111111";

when "1001" => seg_out <= "1110011";

when others => seg_out <= "0000000";

end case;

end process;

end a;

멀티플렉서를 통과시킨 MUXOUT은 4비트의 BCD코드이므로 이를 7 Segment 값인 A,B,C,D,E,F,G로 변경시켜야만 함.


Stop watch digital watch

Digital Watch 설계


Digital watch design specification

Digital Watch – Design Specification

  • VHDL의 입출력 설계 사양

    • 입력 :

      • Clock : 10KHz

      • Key 3개 : RESET SW, SET SW, INC SW

    • 출력 :

      • LCD Interface : E, RS, RW, D0, D1, D2, D3, D4, D5, D6, D7


Digital watch design specification1

RESET

SET

INC

Digital Watch – Design Specification

  • 입력장치( Input Device )

    • 3개의 푸시 버튼 스위치를 사용

    • RESET SW, SET SW, INC SW

    • 각각의 스위치는 눌러질 경우에 1을 출력하고, 평상시에는 0을 출력하는 구조


Digital watch design specification2

Digital Watch – Design Specification

  • 출력장치(Output Device)

    • Character LCD 20문자 2줄

D.D.RAM의 주소


Digital watch design specification3

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 specification4

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 specification5

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 specification6

Digital Watch – Design Specification

  (3) NORMAL TIME MODE ( = Normal_Time_State )

    - 현재 진행되는 시간을 나타냄

- SET KEY 가 눌러지면 시간 수정모드의 처음인 TIME AM/PM

SETTING MODE 로 이동


Digital watch

Digital Watch –전체 회로

LCD의 밝기 조절 회로.

이 부분을 VHDL로 설계함.

CharacterLCD사용.


Digital watch top level

Digital Watch – Top Level 구성


Digital watch top level1

Digital Watch – Top Level 구성

BCD -> ASCII 변환부

LCD Interface 부

이 블록을 제외하고 나머지는 Digital Watch – FND Interface와 같음.


Digital watch top level entity 1

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

Digital Watch – Top Level Entity (2)

signal initial_state: std_logic;

signaltime_ampm_set_state: std_logic;

signaltime_hour_set_state: std_logic;

signaltime_min_high_set_state: std_logic;

signaltime_min_low_set_state: std_logic;

signalnormal_time_state: std_logic;

signals_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

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

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

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

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

Digital Watch - Shot Pulse Gen.

  • 외부에서 입력되는 키의 신호는 모두 클럭 100Hz에 비동기인 신호

  • 실제 회로 내부에서 필요한 신호는 동기신호 이므로 동기처리 후 Shot Pulse를 만들어야 한다

100Hz

Clk에 비동기 입력

Clk에 동기 됨

입력신호가 1로 들어오면 100Hz의 1주기동안 1인 신호


Digital watch shot pulse gen1

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

Digital Watch - 100Hz Gen.

  • 10KHz 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 gen1

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

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 flow1

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 flow2

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 flow3

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

Digital Watch - Time Control

시간 수정모드에서의 Flow

AM/PM

수정모드

Hour

수정모드

분 10의자리

수정모드

분 1의자리

수정모드

9시

12시

50분

9분


Digital watch time control1

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 control2

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 control3

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 control4

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 control5

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 control6

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 control7

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 control8

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

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

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 ledblink1

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 ledblink2

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

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 if1

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 if2

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 if3

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 if4

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 if5

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

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 timing1

Digital Watch – LCD_IF Timing

Cnt5는 Modulo 21 Counter

Line은 Cnt5가 20일 때만 증가


Digital watch lcd if timing2

Digital Watch – LCD_IF Timing

LCD_Mode는 Line=3이며,

cnt5=20일 때만 증가

확대는 다음 쪽

Line은 cnt5=20일 때만 증가하며

Line=3 이 되면 0으로 증가


Digital watch lcd if timing3

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 timing4

Digital Watch – LCD_IF Timing

DD Ram Addr = 00H

첫번째 라인에 해당되는 문자20개 써 넣기.


Digital watch lcd if timing5

Digital Watch – LCD_IF Timing

1번째의 명령어 : 00111100

Function Setting


Digital watch lcd if timing6

Digital Watch – LCD_IF Timing

2번째의 명령어 : 00111100

Function Setting


Digital watch lcd if timing7

Digital Watch – LCD_IF Timing

3번째의 명령어 : 00111100

Function Setting


Digital watch lcd if timing8

Digital Watch – LCD_IF Timing

4번째의 명령어 : 00111100

Function Setting


Digital watch lcd if timing9

Digital Watch – LCD_IF Timing

5번째의 명령어 : 00000001

Display Clear


Digital watch lcd if timing10

Digital Watch – LCD_IF Timing

6번째의 명령어 : 0000110

Entry Mode Setting


Digital watch lcd if timing11

Digital Watch – LCD_IF Timing

7번째의 명령어 : 00001100

Display On/Off setting


Digital watch lcd if timing12

Digital Watch – LCD_IF Timing

8번째의 명령어 : 10000000

DD Ram Addr = 00H

첫째 라인의 1-3번째 lcd의 문자 : SPACE

첫째 라인의 4번째 lcd의 문자 : D

첫째 라인의 4번 재 lcd의 문자 : I


Digital watch tolcdblink

Digital Watch – ToLCDBlink

Library IEEE;

use ieee.std_logic_1164.all;

use work.myLCD.all;

entity ToLCDBlink is

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 ToLCDBlink;

상태(State)

Led_blink=0이면 화면에 표시를 끔

BCD값

ASCII 코드값


Digital watch tolcdblink1

Digital Watch – ToLCDBlink

Architecture a of ToLCDBlink is

begin

process( 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)

begin

if( (initial_state or time_ampm_set_state

or time_hour_set_state or time_min_high_set_state

or time_min_low_set_state)='1' ) then

LCD_time_sec_colon <= Ascii_space;

else

LCD_time_sec_colon <= Ascii_colon;

end if;

if( (initial_state='1' or time_ampm_set_state='1' ) and led_blink='0') then

LCD_time_ampm_ap <= Ascii_space;

LCD_time_ampm_m <= Ascii_space;

else

if(time_ampm='0') then

LCD_time_ampm_ap <= Ascii_A; --A

else

LCD_time_ampm_ap <= Ascii_P; --P

end if;

LCD_time_ampm_m <= Ascii_M;

end if;

if( (initial_state='1' or time_hour_set_state='1' ) and led_blink='0') then

LCD_time_hour_high <= Ascii_space;

LCD_time_hour_low <= Ascii_space;

else

if( time_hour_high ='1') then

LCD_time_hour_high <= Ascii_1;

else

LCD_time_hour_high <= Ascii_space;

end if;

LCD_time_hour_low <= HextoAscii(time_hour_low);

end if;

Led_blink=0이면 화면에 표시를 끔

AM/PM의 처리

시(Hour)의 처리


Digital watch tolcdblink2

Digital Watch – ToLCDBlink

if( (initial_state='1' or time_min_high_set_state='1' ) and led_blink='0') then

LCD_time_min_high <= Ascii_space;

else

LCD_time_min_high <= HextoAscii('0' & time_min_high);

end if;

if( (initial_state='1' or time_min_low_set_state='1' ) and led_blink='0') then

LCD_time_min_low <= Ascii_space;

else

LCD_time_min_low <= HextoAscii(time_min_low);

end if;

if( normal_time_state='1' ) then

LCD_time_sec_high <= HextoAscii(time_sec_high);

LCD_time_sec_low <= HextoAscii(time_sec_low);

else

LCD_time_sec_high <= Ascii_space;

LCD_time_sec_low <= Ascii_space;

end if;

end process;

end a;

분10의 자리(Min high)의 처리

분1의 자리(Min Low)의 처리

초(sec)의 처리


Digital watch mylcd package

Digital Watch– myLCD(Package)

-- LCD Library Header File : myLCD.vhd

library ieee; use ieee.std_logic_1164.all;

package myLCD is

CONSTANT Ascii_space : std_logic_vector(7 downto 0) := "00100000"; -- 20

CONSTANT Ascii_colon : std_logic_vector(7 downto 0) := "00111010"; -- 3a

CONSTANT Ascii_semicolon : std_logic_vector(7 downto 0) := "00111011"; -- 3b

CONSTANT Ascii_0 : std_logic_vector(7 downto 0) := "00110000"; -- 30

CONSTANT Ascii_1 : std_logic_vector(7 downto 0) := "00110001";

CONSTANT Ascii_2 : std_logic_vector(7 downto 0) := "00110010";

CONSTANT Ascii_3 : std_logic_vector(7 downto 0) := "00110011";

CONSTANT Ascii_4 : std_logic_vector(7 downto 0) := "00110100";

CONSTANT Ascii_5 : std_logic_vector(7 downto 0) := "00110101";

CONSTANT Ascii_6 : std_logic_vector(7 downto 0) := "00110110";

CONSTANT Ascii_7 : std_logic_vector(7 downto 0) := "00110111";

CONSTANT Ascii_8 : std_logic_vector(7 downto 0) := "00111000";

CONSTANT Ascii_9 : std_logic_vector(7 downto 0) := "00111001"; -- 39

CONSTANT Ascii_A : std_logic_vector(7 downto 0) := "01000001"; -- 41

CONSTANT Ascii_B : std_logic_vector(7 downto 0) := "01000010";

CONSTANT Ascii_C : std_logic_vector(7 downto 0) := "01000011";

CONSTANT Ascii_D : std_logic_vector(7 downto 0) := "01000100";

CONSTANT Ascii_E : std_logic_vector(7 downto 0) := "01000101";

CONSTANT Ascii_F : std_logic_vector(7 downto 0) := "01000110";

CONSTANT Ascii_G : std_logic_vector(7 downto 0) := "01000111";

CONSTANT Ascii_H : std_logic_vector(7 downto 0) := "01001000";

CONSTANT Ascii_I : std_logic_vector(7 downto 0) := "01001001";

CONSTANT Ascii_J : std_logic_vector(7 downto 0) := "01001010";

CONSTANT Ascii_K : std_logic_vector(7 downto 0) := "01001011";

CONSTANT Ascii_L : std_logic_vector(7 downto 0) := "01001100";

CONSTANT Ascii_M : std_logic_vector(7 downto 0) := "01001101";

CONSTANT Ascii_N : std_logic_vector(7 downto 0) := "01001110";

CONSTANT Ascii_O : std_logic_vector(7 downto 0) := "01001111";

CONSTANT Ascii_P : std_logic_vector(7 downto 0) := "01010000";

CONSTANT Ascii_Q : std_logic_vector(7 downto 0) := "01010001";

CONSTANT Ascii_R : std_logic_vector(7 downto 0) := "01010010";

CONSTANT Ascii_S : std_logic_vector(7 downto 0) := "01010011";

CONSTANT Ascii_T : std_logic_vector(7 downto 0) := "01010100";

CONSTANT Ascii_U : std_logic_vector(7 downto 0) := "01010101";

CONSTANT Ascii_V : std_logic_vector(7 downto 0) := "01010110";

CONSTANT Ascii_W : std_logic_vector(7 downto 0) := "01010111";

CONSTANT Ascii_X : std_logic_vector(7 downto 0) := "01011000";

CONSTANT Ascii_Y : std_logic_vector(7 downto 0) := "01011001";

CONSTANT Ascii_Z : std_logic_vector(7 downto 0) := "01011010"; -- 5a

CONSTANT Ascii_small_a : std_logic_vector(7 downto 0) := "01100001"; -- 61

CONSTANT Ascii_small_b : std_logic_vector(7 downto 0) := "01100010";

CONSTANT Ascii_small_c : std_logic_vector(7 downto 0) := "01100011";

CONSTANT Ascii_small_d : std_logic_vector(7 downto 0) := "01100100";

ASCII Code의 상수선언


Digital watch mylcd package1

Digital Watch – myLCD(Package)

CONSTANT Ascii_small_e : std_logic_vector(7 downto 0) := "01100101";

CONSTANT Ascii_small_f : std_logic_vector(7 downto 0) := "01100110";

CONSTANT Ascii_small_g : std_logic_vector(7 downto 0) := "01100111";

CONSTANT Ascii_small_h : std_logic_vector(7 downto 0) := "01101000";

CONSTANT Ascii_small_i : std_logic_vector(7 downto 0) := "01101001";

CONSTANT Ascii_small_j : std_logic_vector(7 downto 0) := "01101010";

CONSTANT Ascii_small_k : std_logic_vector(7 downto 0) := "01101011";

CONSTANT Ascii_small_l : std_logic_vector(7 downto 0) := "01101100";

CONSTANT Ascii_small_m: std_logic_vector(7 downto 0) := "01101101";

CONSTANT Ascii_small_n : std_logic_vector(7 downto 0) := "01101110";

CONSTANT Ascii_small_o : std_logic_vector(7 downto 0) := "01101111";

CONSTANT Ascii_small_p : std_logic_vector(7 downto 0) := "01110000";

CONSTANT Ascii_small_q : std_logic_vector(7 downto 0) := "01110001";

CONSTANT Ascii_small_r : std_logic_vector(7 downto 0) := "01110010";

CONSTANT Ascii_small_s : std_logic_vector(7 downto 0) := "01110011";

CONSTANT Ascii_small_t : std_logic_vector(7 downto 0) := "01110100";

CONSTANT Ascii_small_u : std_logic_vector(7 downto 0) := "01110101";

CONSTANT Ascii_small_v : std_logic_vector(7 downto 0) := "01110110";

CONSTANT Ascii_small_w : std_logic_vector(7 downto 0) := "01110111";

CONSTANT Ascii_small_x : std_logic_vector(7 downto 0) := "01111000";

CONSTANT Ascii_small_y : std_logic_vector(7 downto 0) := "01111001";

CONSTANT Ascii_small_z : std_logic_vector(7 downto 0) := "01111010"; -- 7a

-- Hex to Ascii decoder

function HexToAscii(hex_in : std_logic_vector(3 downto 0)) return std_logic_vector ;

end myLCD;

package body myLCD is

-- Hex to Ascii decoder

function HexToAscii(hex_in : std_logic_vector(3 downto 0)) return std_logic_vector is

variable Ascii_out : std_logic_vector(7 downto 0);

begin

case hex_in is

when "0000" => Ascii_out := Ascii_0;

when "0001" => Ascii_out := Ascii_1;

when "0010" => Ascii_out := Ascii_2;

when "0011" => Ascii_out := Ascii_3;

when "0100" => Ascii_out := Ascii_4;

when "0101" => Ascii_out := Ascii_5;

when "0110" => Ascii_out := Ascii_6;

when "0111" => Ascii_out := Ascii_7;

when "1000" => Ascii_out := Ascii_8;

when "1001" => Ascii_out := Ascii_9;

when others => Ascii_out := Ascii_space;

end case;

return (Ascii_out);

end HexToAscii;

end myLCD;

ASCII Code의 상수선언

BCD to ASCII Code 변환 함수선언


  • Login