개요
프로젝트 기간
2025.05.21 ~ 2025.06.02
목적
- UART, HC-SR04, DHT11 Controller 등 FPGA 설계 및 통합 SoC 시스템 구현
- Basys 3 보드의 스위치, 버튼, UART를 통한 모드 변경을 FSM으로 구현
하드웨어
- Basys 3
- 클럭 입력 : 100MHz
- I/O 전압 : 3.3V LVCMOS
- HC-SR04 (초음파 센서)
- 측정 거리 : 2cm ~ 400cm
- 트리거 입력 신호 : 10us TTL
- DHT11 (온습도 센서)
- 온도 범위 : 0 ~ 50℃
- 습도 범위 : 20 ~ 90% RH
- 전원 공급 : 3 ~ 5.5 VDC
개발 환경
- 사용 언어 : Verilog
- Tool : Vivado, draw.io
- editor : VS Code
기본 모듈 설계
Top Module Blockdiagram
버튼, 스위치, UART 입력 기반 각 센서 및 시게 기능 중심 제어
- WATCH : 시계 및 스톱워치 기능 처리
- UART_CNTL : 데이터 시리얼 통신 (전송 및 수신)
- SR04 : 초음파 센서 거리 측정
- DHT11 : 온습도 데이터 수신
- FND_CNTR : 데이터 공통 FND 표시
Watch/Stopwatch Module Blockdiagram
- Watch : 시간-분-초 단위 시간 카운팅
- Stopwatch : 시작 / 정지 / 리셋 기능 타이머
- FND_CNTR : 시간 데이터 FND 표시
- pos_sel : 시간 셋팅 시 FND 깜빡임
UART Module Blockdiagram
- UART Sender : 송신할 문자열 포맷 생성
- UART_Tx : 센서 측정 데이터 전송
- UART_Rx : 사용자 입력 (버튼, 스위치)
- Tx : UART 송신 라인 (FPGA -> PC)
- Rx : UART 수신 라인 (PC -> FPGA)
SR04 모듈 설계
동작 원리
- Trigger 핀에 10us의 펄스 -> 초음파 발생
- 8 cycle 초음파 (40kHz) 송출
- 반사된 초음파가 Echo 핀 도달 시간 측정
- Distance : 시간(us) x 속도(340m/s) / 2
FSM
ASM
Blockdiagram
- Start_trigger : 시작 후 Trigger 신호 10us 동안 출력
- Tick_gen : 1us 단위 tick 생성
- FND_CNTR : 계산된 거리 값 FND 표시
- Distance : echo 신호 펄스 폭을 측정, 거리 계산
DHT11 모듈 설계
통신 흐름
- 1. MCU에서 18ms이상의 Low 신호를 DHT11 센서로 보냄
- 2. DHT11 응답 (80us Low -> 80us HIGH)
- 3. DHT11에서 총 40 비트의 데이터를 MCU로 전송
비트 판별 방법
FSM
ASM
- 1. 초기 구동 ASM 상태
- 2. 데이터 수신 ASM 상태
- 3. 데이터 유효성 검사 및 ASM 종료
Blockdiagram
- DHT11_CNTL : DHT11 센서 데이터 수신 FSM 제어
- FND_CNTL : 수신된 온습도 값 FND 출력
시뮬레이션 및 검증
sr04 검증 결과
dht11 검증 결과
동작 영상
버튼 및 스위치 제어
Uart 제어
트러블 슈팅
1. 최종 merge 후 setup timing violation
- 문제 상황 : 최종 merge 후 Negative Slack 발생. (-4.608ns)
- 원인 분석 : SR04 CTRL에 측정된 Distance 값 -> UART_Sender로 전달.
- 해결 방법 : Uart_Sender 단에서 불필요한 나누기 연산 축소.
2. DHT11 FSM 종료 타이밍 문제
- 문제 상황 : 40개의 데이터 수신 후, DATA_SYNC 상태에서 DATA_DETECT로 전이가 안되는 현상 발생.
- 원인 분석 : 데이터를 다 받으면 dht11_io 신호가 1로 발생하지 않아 상태가 넘어가지 않음.
- 해결 방법 : DATA_DETECT에서 data_count == 39일 때 바로 STOP 상태 전환.
느낀점
- FSM구조와 모듈화된 하드웨어 설계 방식에 대해 이해할 수 있었음.
- Timing violation과 같은 문제를 겪으면서 센서 제어를 위한 로직 구현 뿐만 아니라 하드웨어 상의 최적화 로직 및 타이밍 제어의 중요성을 깨달음.