Multi Sensing Watch project

FPGA 기반 실시간 센서 통합 감지 시스템

개요

프로젝트 기간

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과 같은 문제를 겪으면서 센서 제어를 위한 로직 구현 뿐만 아니라 하드웨어 상의 최적화 로직 및 타이밍 제어의 중요성을 깨달음.

GitHub Source