디지털 시스템 설계

2003731187 최성열

디지털 시계 최종 보고서

과 목 명 : 디지털시스템설계

학    과 : 정보제어공학과

학    번 : 2003731187

이    름 : 최   성   열

제출기한 : 2006.  12.  20.

교 수 명 : 이 기 서 교수님

목차

1. 연구 소개

2. 개발 내용

3. 개발 일정

4. 세부 동작

5. 문제점 및 발전 방향

첨부 : Source 파일

1. 연구 소개

- 디지털 논리 회로를 이용하여 디지털 시계를 구현

2. 개발 내용

-  보드에 내장된 16Mhz를 1초 분주

-  주어진 7SEGMENT 4자리 시간, 분 표시

-  셋팅으로 시간 설정 가능

3. 개발 일정

날짜	~ 12.20
내용	코딩 및 디버깅

4. 세부 동작

(1) 기본 시계

- SEGMENT 4자리 = 시, 분 표현 =>ex: 10시 38분

- 최우측 LED = 초를 나타냄

(2) 시간 세팅

7번 : 분 set(일의 자리)

6번 : 분 set(십의 자리)

5번 : 시 set(일의 자리)

4번 : 시 set(십의 자리)

(3) Reset

1번 : Reset 버튼으로 Segment 모두를 초기화 함.

5. 문제점 및 발전 방향

1) 문제점

-  시간셋팅 할시 Dip 스위치의 셋팅에 따른 불편함

-  Clock 과 동기화된 시간 셋팅 방법에 의해 시간 셋팅이 조금 불편함

2) 발전방향

-  한꺼번에 코딩하는 것 보다 Component를 이용하는 것이 모드 확장에 효과적

-  여러 가지 모드 추가(알람, StopWatch 등)

6. 제작효과

- FPGA에 대한 이해

- Quatus프로그램에 이해

- 디지털 시계의 논리 회로를 이해 할 수 있다.

- 시계를 실용적으로 이용할 수 있다.

*소스 파일

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity syclock is

port(	clk16m	:	in	std_logic;

reset	:	in	std_logic;

en	:	in	std_logic;

clock1s	:	buffer	std_logic;

m_one	:	out	std_logic_vector(6	downto	0);

m_ten	:	out	std_logic_vector(6	downto	0);

h_one	:	out	std_logic_vector(6	downto	0);

h_ten	:	out	std_logic_vector(6	downto	0);

mode_mo :	in	std_logic;

mode_mt	:	in	std_logic;

mode_ho	:	in	std_logic;

mode_ht	:	in	std_logic;

set	:	in	std_logic);

end syclock;

architecture arc of syclock	is

function sec_dec(A : integer)return std_logic_vector is

variable seg_out : std_logic_vector (6 downto 0);

begin

if (A = 0)then

seg_out := "0000001";

elsif (A = 1) then

seg_out := "1001111";

elsif (A = 2) then

seg_out	:= "0010010";

elsif (A = 3) then

seg_out := "0000110";

elsif (A = 4) then

seg_out := "1001100";

elsif (A = 5) then

seg_out := "0100100";

elsif (A = 6) then

seg_out := "0100000";

elsif (A = 7) then

seg_out := "0001101";

elsif (A = 8) then

seg_out := "0000000";

else

seg_out := "0000100";

end if;

return seg_out;

end sec_dec;

signal T_min_one: integer range 0 to 9;

signal T_min_ten: integer range 0 to 5;

signal T_hou_one: integer range 0 to 9;

signal T_hou_ten: integer range 0 to 2;

begin

process(clk16m)

variable cnt : integer range 0 to 7999999;

begin

if(clk16m'event and clk16m = '1')then

cnt:= cnt+1;

if(cnt=7999999)then

cnt:=0;

clock1s<= not clock1s;

end if;

end if;

end process;

process(clock1s,reset)

variable cnt:	integer range 0 to 59;

begin

if reset ='1' then

T_min_one	<=0;

T_min_ten	<=0;

T_hou_one	<=0;

T_hou_ten	<=0;

m_one	<="0000000";

m_ten	<="0000000";

h_one	<="0000000";

h_ten	<="0000000";

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

if(en='1')then

if (cnt = 59) then

cnt := 0;

if (T_min_one = 9)then

T_min_one <=0;

if (T_min_ten = 5)then

T_min_ten <=0;

if(T_hou_ten = 2 and T_hou_one = 3)then

T_hou_ten <=0;

T_hou_one <=0;

elsif(T_hou_one = 9) then

T_hou_one <=0;

T_hou_ten <=T_hou_ten + 1;

else T_hou_one <=T_hou_one + 1;

end if;

else T_min_ten <= T_min_ten + 1;

end if;

else T_min_one <= T_min_one + 1;

end if;

else cnt := cnt +1;

end if;

elsif(en = '0' and

mode_mo ='1' and

mode_mt ='0' and

mode_ho ='0' and

mode_ht ='0')then

if(set='0')then

T_min_one <= T_min_one + 1;

if(T_min_one = 9)then

T_min_one <= 0;

end if;

end if;

elsif(en = '0' and

mode_mt ='1' and

mode_mo ='0' and

mode_ho ='0' and

mode_ht ='0')then

if(set='0')then

T_min_ten <= T_min_ten + 1;

if(T_min_ten = 5)then

T_min_ten <= 0;

end if;

end if;

elsif(en = '0' and

mode_ho ='1' and

mode_mo ='0' and

mode_mt ='0' and

mode_ht ='0')then

if(set='0')then

T_hou_one <= T_hou_one + 1;

if(T_min_ten = 9)then

T_hou_one <= 0;

end if;

end if;

elsif(en = '0' and

mode_ht ='1' and

mode_ho ='0' and

mode_mt ='0' and

mode_mo ='0')then

if(set='0')then

T_hou_ten <= T_hou_ten + 1;

if(T_hou_ten = 2)then

T_hou_ten <= 0;

end if;

end if;

else

null;

end if;

h_ten	<= sec_dec(T_hou_ten);

h_one	<= sec_dec(T_hou_one);

m_ten	<= sec_dec(T_min_ten);

m_one	<= sec_dec(T_min_one);

end if;

end process;

end arc;