본문내용
1. 프로젝트 목적
Verilog를 이용하여 알람 기능과 스톱워치 기능이 탑재된 디지털 시계를 설계하는 것이 이 프로젝트의 목적이다. 요일 표현, 알람 시간과 현재 시간의 차이 계산 등의 추가 기능도 구현할 것이다.
Alarm Clock Module은 시간, 분, 초 및 AM/PM을 나타내는 레지스터와 알람 시간을 설정하는 레지스터로 구성된다. 시간이 증가할 때마다 초가 60이 되면 분이 1 증가하고, 분이 60이 되면 시간이 1 증가하는 방식으로 동작한다. 12시를 기준으로 AM/PM이 전환되며, AM/PM이 바뀔 때 요일도 1 증가한다. 또한 현재 시간과 알람 시간의 차이를 계산하여 출력하는 기능을 구현하였다. [1]
Stopwatch Module은 시간, 분, 초, 밀리초를 나타내는 레지스터로 구성되며, 스톱워치의 시작, 정지, 초기화 기능을 수행한다. 밀리초가 999가 되면 초가 1 증가하고, 초가 59가 되면 분이 1 증가하며, 분이 59가 되면 시간이 1 증가하는 방식으로 동작한다. 또한 랩타임 측정 기능을 추가로 구현하였다. [1]
Clock Generator Module은 1초와 1밀리초 주기의 클록 신호를 생성한다. 5kHz 클록 신호를 기반으로 1밀리초 클록 신호를 만들고, 이를 이용하여 1초 클록 신호를 생성한다. [1]
Top Module은 Control 신호에 따라 Alarm Clock Module과 Stopwatch Module 중 하나를 선택하여 동작시킨다. Control 신호가 1이면 Alarm Clock Module이 동작하고, 0이면 Stopwatch Module이 동작한다. [1]
Testbench를 통해 각 모듈의 동작을 시뮬레이션하고 검증하였다. Alarm Clock Module, Stopwatch Module, Clock Generator Module, Top Module 각각에 대한 testbench를 작성하여 모듈의 기능이 올바르게 구현되었음을 확인하였다. [1]
2. 설계 및 분석
2.1. Alarm Clock Module
Alarm Clock module은 디지털 시계의 기본적인 시간 표시 기능과 알람 기능을 제공한다. 시, 분, 초를 나타내는 출력 포트를 선언하고 시간을 변경할 수 있는 레지스터를 선언하였다. 초와 분은 0부터 59까지의 범위이므로 60이 되면 각각 +1분, +1시간으로 시간을 증가시켜 주었다. 시간은 0부터 12까지의 범위이므로 13이 되면 1로 변경하였다. 또한 12시를 기준으로 오전과 오후를 구분하는 AM_PM 레지스터를 두어 12시가 되면 오전에서 오후로 바뀌도록 하였다.[1]
요일을 나타내는 date 출력 포트와 daydate 레지스터를 추가하여 요일을 표현할 수 있게 하였다. 오후 12시가 되면 daydate 값을 1 증가시켜 총 7일(월화수목금토일)을 나타낼 수 있도록 하였다. 이를 시뮬레이션 파형에 명시적으로 표현하기 위해 $monitor와 $time을 활용하였다.[1]
알람 기능을 위해 AlarmHoursIn, AlarmMinsIn, Alarm_AM_PM_In 입력 포트를 두어 사용자가 알람 시간을 설정할 수 있게 하였다. LoadAlm이 1이 되면 이 입력값들이 각각의 레지스터에 저장되도록 설계하였다. 알람은 현재 시간과 알람 시간이 일치하고 현재 AM_PM과 알람 AM_PM이 같으며 AlarmEnable이 1일 때에만 동작하도록 하였다. 알람은 1분간 울리게 설계하였다.[1]
현재 시간과 알람 시간의 차이를 계산하여 gapHours 레지스터에 저장하는 기능을 추가하였다. 이를 위해 5가지 서로 다른 경우의 수를 고려하여 시간 차이를 계산하였다. 정각일 때와 그렇지 않을 때, 알람 시간과 현재 시간의 AM_PM이 같을 때와 다를 때, 현재 시간이 알람 시간보다 클 때와 작을 때 등을 구분하여 정확한 시간 차이를 산출하였다.[1]
2.2. Alarm Clock Module Simulation Analysis
《 Alarm Clock Module Simulation Analysis 》
Reset이 0일 때 시간이 알려지지 않은 상태(unknown)였다가 0이 되는 순간 시간이 초기화되는 것을 확인할 수 있다. 이는 모듈의 동작이 비동기식으로 설계되어 Reset과 클럭이 별개로 작동하기 때문이다. [1]
Loadtime이 1이 되면 SetSecs, SetMins, SetHours에 저장된 값이 각각 현재 Hours_C, Mins_C, Secs_C에 반영되는 것을 확인할 수 있다. [1]
마찬가지로 LoadAlm이 1이 되면 AlarmMinsIn, AlarmHoursIn, Alarm_AM_PM_In에 설정된 값이 해당 레지스터에 저장되는 것을 확인할 수 있다. [1]
Secs_C가 59에서 0으로 넘어가면서 Mins_C가 30에서 31로 증가하는 것을 확인할 수 있다. 이처럼 초 단위 카운트가 60이 되면 분 단위가 증가하는 것이 정상적으로 동작하고 있음을 알 수 있다. [1]
Mins_C가 59에서 0으로 넘어가면서 Hours_C가 7에서 8로 증가하는 것을 확인할 수 있다. 이를 통해 분 단위...