사용 장치
7 Segment : 숫자 출력용
2프레임 문자 디스플레이 : 현재 모드 표시 및 안내
버튼 SW A~F : 입력용
A : Mode (모드변경)
B : Set (설정)
C : Act (시작)
D : Reset (초기화)
E :
F :
키패드 : 숫자 입력용
Dot Matrix : 재미용 (그림 및 초에 따른 ...)
예전에 쓰던 시계와 인터페이스가 비슷해지는듯.
시계 모듈
7 Segment : [A_/P_/24.] (시간)(분)(초)
디스플레이 : Clock / ABC
Dot : 시계그림 및 초에 따른 Dot 값 반전 (총 140개 -> 60초, 1개씩 켜고, 남는 80개 중 20개를 뺀 60개로 아래쪽애 분 표현)
버튼 SW :
A (Mod) : 스탑워치 모듈로 넘어감
B (Set) : 24시간 모드 변경
C (Edit) : 현재 시간 설정 모드로.
키패드 : 없음
시계 모듈 - 현재 시간 설정 모드
7 Segment : [A_/P_/24.] (시간)(분)(초), 0.5 초 주기로 설정중인 시간 깜빡임, 2자리 단위. (시 -> 분 -> 초)
디스플레이 : Clock Time? / AB
Dot : 모두 꺼짐, 기어그림 (... 고생길이 보인다...)
버튼 SW :
A (Mod) : 다음 시간 단위 설정으로 넘어감.
B (Set) : 시간을 저장하고 시계 모듈로 돌아감.
C (Edit) : 숫자 +1
키패드 : 각각 위치의 숫자 입력 (범위 초과시 무시)
스탑워치 모듈
7 Segment : (시)(분)(초)(1/100초 2자리)
디스플레이 : StopWatch / ABC
Dot : 달리는 사람 모양
버튼 SW :
A (Mod) : 시계 (일단, 타이머 모듈 만들시 타이머) 모듈로 넘어감
B (Set) : 시작 / 중지
C (Edit) : 리셋
키패드 : 없음
시간이 남으면 : 타이머 모듈
7 Segment : 8_ (시)(분)(초) (지정중인 것 깜박깜박)
디스플레이 : StopWatch / ABC
Dot : 라면모양 (뒤집어진 사다리꼴 및 뚜껑...) / 전체 반전된 상태부터 / 가능하면 전체 시간의 비율로 반전.
버튼 SW :
A (Mod) : 시계 (일단, 타이머 모듈 만들시 타이머) 모듈로 넘어감
B (Set) : 타이머 시작 / 중지, 초기상태에서는 C와 동일한 기능
C (Edit) : 시간을 지정하고 다음으로 넘어감
키패드 : 시간 지정
알람 모듈 - 시간 설정 모드
7 Segment : [A_/P_/24.] __ (시간)(분), 설정중인 것이 깜박임
디스플레이 : Alarm / ABC
Dot : 8분음표 모양
버튼 SW :
A (Mod) : 시계 모듈로 넘어감
B (Set) : 시간을 저장하고 알람을 활성화한 후 시계 모듈로 돌아감.
C (Edit) : 알람을 비활성화 / 활성화
키패드 : 시간 입력
필요한 모듈 : 출력부 처리용
7 Segment : 잔상효과 [구현완료]
필요한 기능
입력받은 값의 출력. (값은 처리하지 않음)
특정 위치 깜박거리기 (깜박거리는 위치는 입력을 받음)
그에 따른 변수
input : 출력할 값 전체 (4비트 8개 : 32비트)
reg : 출력할 값 ( 범위 : 0~9, 공백 (10), A (11), P(12), 4.(13) )
reg : 깜박거릴 위치 : 8비트 0, 1 / 1일경우 깜박거림
구현 방식
짤 때 생각함.
Dot Matrix : 잔상효과
필요한 기능
그림 출력
입력된 값을 이용해 그림을 반전시킴
그에 따른 변수
input : [139:0] draw (그릴 포인트)
reg : [139:0] draw_save (입력받아 보관함)
input reg : [139:0] invert (반전)
reg : [139:0] invert_save (반전포인트 보관 및 처리)
실제 출력용
output : [13:0] dot_data (세로줄 한 줄의 표시)
output : [9:0] dot_com (세로줄 위치 결정)
* 목표 클럭은 10Mhz 정도면 되려나?
클럭 분주 모듈 [구현완료]
시계 the 모듈
* 분량 : 일단 7 Segment 만 표시하는 걸로 합의.
필요한 기능 :
시간 데이터의 저장
시간 데이터의 초과값 처리
24시간 표현방식 처리
24시간 모드 변경에 대한 처리
현재시간 변경
하위모듈로 할까?
시간 데이터를 디코드하는 게 편할듯.
→ 2자리씩 디코드하는 함수
구현방법
reg : 시계 데이터, 2자리씩, 7바이트 (0~127). cdata_hour / cdata_min / cdata_sec
reg : 24시간 처리상태 보관 hr_24 (1 : 24, 0: AM, PM)
output reg : 시계 출력 데이터 (seg_7 을 호출해 출력) : cdata_com [31:0]
두 자리씩 각각 바이트로 디코드하는 함수 decode_pos2
디코드전에 24시간에 대한 처리를 해야할 것 같은데...
1) 24시간 체크 및 변경 (reg cout_hour) → 2) 결합 연산자를 이용하여 출력 예정값에 대입. {AM PM 24. / 시(cout_hour 디코드한 것) / 분 (cdata_min 디코드) / 초(cdata_sec 디코드) ) }
시간 설정의 처리는 어떻게?
reg : set_mod 로 상태변환을 체크.
시간 설정 모드일 시
reg : [7:0] blink_cur 을 이용해 현재 선택된 것 표시, 키패드로 수치 입력... 잠깐 키패드 모듈이 필요할듯. 어떤 방식으로 키패드 모듈이랑 통신하지? ...
키패드 모듈부터 만들어야할듯. -_-;;
덧셈 과정에서 올림은 어떤 순서로 일어나야 하는가?
순차적인 것보다는 병렬적인 것이 낫지 않은가? 근데 병렬적으로 처리하면 귀찮은 경우가 생긴다. 하드웨어적으로는 어떤 것이 빠른가? non-blocking? blocking? ... non-blocking 식으로 시계 데이터를 처리할 수 있는가?
→ 계산기가 되는 셈이므로, 올림값에 대한 별도의 처리가 있어야 할 것이다. 아니면 그냥 blocking 으로 처리하는 것이 나은가?
이 모듈에서 저 모듈을 건드리는 방법은 없는가?
→ 구조상 모드별로 모듈이 생기므로, 시계 모듈과 알람 모듈은 데이터를 공유해야 함.
→ 시계의 시계 데이터를 전역으로 뺄까? (...)
가장 간단한 방법은, 시계의 데이터들을 output reg로 설정해서 알람 모듈에서 input으로 사용하는 방법인듯.
그 외에 방법은 없는가? 타 모듈의 데이터를 엑세스하는 방법은>? 딱히 생각나지 않음. 이 방법으로 진행
알람 모듈
> 시계 모듈로부터 output reg 입력을 따로 받아 진행
> master 에서 부저와는 항상 연결. (가능한가?)
필요한 기능
알람시간의 설정 (AM PM? 이건 어쩔겨?)
자세한 workflow :
1) 알람 모드로 모드가 바뀌어있다.
if 알람 시간이 설정되어있다
if 알람이 켜져있다
do 현재 알람시간을 표시한다.
else 알람이 꺼져있다
do AL---OFF을 출력한다
else AL----no 을 출력한다.
2) 알람 시간 설정 버튼을 누른다.
if "알람 시간 설정 버튼" 을 누른다 :
function 알람 시간을 설정한다.
3) 알람을 켜고 끈다
if "알람 ON / OFF" 버튼을 누른다 :
if 알람이 아예 설정되어있지 않다
do 아무 작업도 하지 않음
if 알람이 켜져있다
알람 켜짐 값을 반전 (0으로) 하고, 출력 값을 AL---OFF로 바꾼다
이렇게 쓰고보니 회로같지가 않음. 기능 위주로 쓰는 게 효율적일 듯.
만들고 싶은 기능
출력의 형태
AL______ (6자리) -> [31:0] adata_com
AL----NO -> 설정된 값 없음 아래로 통합.
AL---OFF -> 알람 꺼짐
ALP_(시간)(분) -> 알람이 설정되어있음 (12시간 출력 모드)
AL24.(시간)(분) -> 알람이 설정되어있음 (24시간 출력모드)
버튼의 구성
A (mode) : 다음 모드 (시계 모듈) 로 넘어감 (이 모듈에서 다루지 않고 master에서 다룸)
B (Set) : 알람을 켜고 끔
알람이 설정중이 아닐 때
알람이 울리고 있지 않음 : 알람을 켜고 끔.
알람이 울리고 있음 : 알람소리 출력을 중지함.
알람이 설정중일 때
이전 설정칸으로 혹은 24시간 모드 변경. 어쩔래? ... 둘 다 구현하고 싶은데... 별도의 버튼을 할당해야 하나? ... 고것만큼은 싫은데 ㅠㅠ
키패드를 사용한다는 점에서부터, 설정 중에 24시간 모드 변경은 불가능에 가깝다. 차라리 24시간 모드로 통일하는 것이 간편.
근데 싫은데?
해결방법이 없잖아.
있을 것 같은데?
귀찮아...
결론 : 설정은 24시간, 24mod 출력은 시계의 모드를 따름.
C (Edit) : 알람 시간 설정 버튼. 설정이 끝나면 알람을 켬.
알람 설정중이 아닐때 : 알람 시간 설정모드로 진입
알람 설정중일때 : 다음 설정칸으로 이동
D (Reset) : 당연히도 리셋.
설정된 알람시간을 00(시)00(분)으로 바꾸고, 알람을 끄고, 소리 출력을 중지.
그 외에 버튼 없이 자동으로 동작하는 것
시간이 일치하고, 알람이 켜져있을 시 알람을 울림. (분단위까지 체크, 30초동안 울림)
과정 기록 ) 조건에 필요한 reg가 있는가?
reg isalarm = 0 생성
reg set_alarm = 0 생성
이슈 : 12, 24시간 출력모드를 위해 따로 값을 할당할 수 없으므로, 입력은 24시간 모드로 하되 출력은 시계에서의 설정을 따름?