FPGA WorldClock
7-Segment & Keypad 기반 FPGA 디지털 세계시계
At a Glance
| 항목 | 값 |
|---|---|
| 분야 | 디지털 하드웨어 / Verilog HDL |
| 기간 | (채워주세요: YYYY.MM ~ YYYY.MM) |
| 팀 규모 / 내 비중 | (채워주세요: 예 — 1명 개인 / FSM · 입출력 전체) |
| 핵심 스택 | Verilog HDL, Vivado, 7-Segment Display, 4x4 Keypad |
| 대상 보드 | (채워주세요: 예 — Xilinx Basys3 / Artix-7 등) |
| 핵심 기능 | 시/분/초 카운트 · 도시 시간대 전환 · 키패드 설정 · 7-Seg 멀티플렉싱 |
| 결과물 | (채워주세요: 보드 시연 영상 / 시뮬파 캡처 / GitHub) |
한 줄 요약: FPGA 위에서 FSM으로 설정 모드와 운행 모드를 분리한, 도시 시간대별 디지털 세계시계입니다.
Problem & Constraints
소프트웨어와 달리 FPGA에서는 시간 그 자체도 직접 만들어야 합니다. 입력 처리, 시간 증가, 상태 전환, 표시 제어가 동시에 돌아갑니다.
필수 제약:
- 시스템 클럭을 나눠 1Hz tick을 만들어야 함
- Keypad 입력은 떨림(헌팅)을 가정해 안정화가 필요
- 7-Segment는 멀티플렉싱으로 자릿수를 돌려가며 표시
- 시간 증가와 설정 입력이 충돌하면 시계가 틀림 → 이걸 구조적으로 막아야 함
즉 문제는 “Verilog로 시계 만들기”가 아니라, 입력·상태·계산·표시가 서로 간섭하지 않게 설계하기입니다.
What I Built · How
FSM 설계
[ IDLE / RUN ]
│ ▲
set key │ │ confirm
▼ │
[ SET_HOUR ] ───▶ [ SET_MINUTE ] ───▶ [ CITY_SELECT ]
│
▼
[ RUN ]
설정 모드(SET_)에서는 1Hz 시간 증가를 *멈춤 → 입력 로직과 시간 로직이 동시에 같은 상태를 건드리지 않게 함.
모듈 분해
| 모듈 | 책임 |
|---|---|
| Keypad 입력 | 키 스캔 · 디바운싱 · 이벤트화 |
| Clock divider | 시스템 클럭 → 1Hz tick |
| Time counter | 초/분/시 카운터 · 오버플로·언더플로·AM/PM |
| City offset | 도시별 시간 보정 적용 |
| Display driver | 7-Seg 멀티플렉싱 · BCD 변환 |
| Top FSM | 모드 전환 · 입력 라우팅 |
핵심 기술 결정
- 입력 ↔ 시간 계산을 구조적으로 분리 — SET_* 상태에서는 tick 입력을 주지 않음 → 종합 테스트에서 충돌 제거.
- FSM 기반 모드 분리 — “설정 중”/”시계 돌아감”을 명시적으로 구분해 디버깅·추가 기능이 쉬움.
- 모듈러 Verilog — Top은 단순 배선으로 유지, 테스트벤치가 모듈별로 가능.
- 도시 오프셋 분리 — 기준 시간은 한 세트만 관리, 도시 전환은 표시 단계에서만 오프셋 적용 → 시간 동기화를 단일 소스로 유지.
Results & Demo
- FPGA 보드에서 다중 도시 디지털 세계시계 동작.
- Keypad로 시간 설정 / 도시 전환 / RUN 동작 전환 가능.
- 설정 중 시간 증가가 멈춰 입력↔시간 계산의 충돌이 설계 단계에서 제거됨.
(채워주세요: 보드에서 시간이 올라가는 구동 영상 1개 · 도시 전환 시연 캡처 · 주요 모듈 다이어그램과 명세 요약 · GitHub 링크)
What I’d Do Differently
- 합성 리포트 기록 — LUT / FF / BRAM 사용량, 타이밍 슬랙을 기록해 어느 모듈이 병목인지 알 수 있게.
- 테스트벤치 정리 — Time counter 경계 조건(23:59:59 → 00:00:00 등)을 모듈별 테스트벤치로 남겨 회귀 검증이 가능하도록.
- UART/USB 확장 — 시간 설정을 외부에서 주입하고 상태를 로그로 내보내 디버깅 편의성 향상.
- BCD 변환 분리 · 멀티플렉싱 주파수 파라미터화 — 다른 보드·다른 세그먼트 수의 재사용성 확보.
English version: FPGA WorldClock