You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
FPGA(Basys-3) 상에서 UART(Universal Asynchronous Receiver/Transmitter) 송수신 구조를 구현하고, Loopback(수신 데이터를 그대로 재전송) 방식을 통해 송수신 기능의 정확성을 검증한 프로젝트입니다. Tx/Rx를 FSM 기반으로 분리 설계하고, 16배 Oversampling으로 수신 안정성을 확보했습니다.
온디바이스 AI 시스템반도체설계 2기 프로젝트 (2026.04.21 ~ 2026.04.27)
📌 Overview
항목
내용
동작 주파수
100MHz (System Clock)
Baud Rate
9600 bps
Oversampling
16x (b_tick 기준)
데이터 프레임
1 Start bit + 8 Data bits + 1 Stop bit
전송 방식
Serial, LSB-first
FPGA / Tool
Basys-3 / Vivado, Vivado Simulator, ComPortMaster
✨ Features
UART Transmitter / Receiver: FSM 기반(IDLE → START → DATA → STOP) 상태 제어로 송수신 동작 정의
Baud Tick Generator: 100MHz 시스템 클럭을 분주해 9600bps 기준 Tick(b_tick) 생성, Tx/Rx가 공통으로 사용
16x Oversampling: 비트 중앙(mid-point)에서 샘플링하여 노이즈·타이밍 오차에 대한 수신 안정성 확보
Loopback 구조: rx_done을 tx_start에 직접 연결해 수신 완료 즉시 동일 데이터를 자동 재전송
Shift Register 기반 직렬-병렬 변환: LSB-first 방식으로 데이터 조립/분해
🏗️ Architecture
UART Receiver (Rx): rx 신호의 High→Low 전이로 Start bit 감지 → b_tick 기반 카운터로 mid-point 샘플링 → 8bit 수신 완료 시 rx_done(1-cycle pulse) 발생
UART Transmitter (Tx): tx_start 신호로 동작 시작 → Start bit(0) → 8bit 데이터(LSB-first, shift register) → Stop bit(1) 순서로 출력, 전송 중 tx_busy High 유지
Baud Tick Generator: 시스템 클럭을 분주하여 Tx/Rx가 공유하는 공통 타이밍 기준(b_tick, 9600bps × 16) 생성
Loopback: rx_done → tx_start 직접 연결로 별도 제어 로직 없이 수신 즉시 재전송되는 구조
📁 구성 파일
파일
설명
uart.v
UART Top module — uart_tx, uart_rx, baud_tick_gen 통합
uart_loopback.v
Loopback 구조 최상위 모듈 (rx_done → tx_start 연결)
🔍 Simulation & Verification (요약)
항목
목표
결과
UART Loopback 동작
입력 데이터(8'h30)와 동일한 값이 출력됨
✅ 달성
Tx FSM 상태 전이
IDLE → START → DATA → STOP → IDLE 순서 전이
✅ 달성
Tx 데이터 전송 순서
LSB-first(bit0→bit7) 방식으로 출력
✅ 달성
tx_busy 신호
START~STOP 구간 동안 High 유지, 종료 후 Low
✅ 달성
b_tick_cnt_reg / bit_cnt_reg
015 / 07 카운트 후 정상 초기화·전이
✅ 달성
Rx FSM 상태 전이
IDLE → START → DATA → STOP → IDLE 순서 전이
✅ 달성
Rx 데이터 샘플링
b_tick 기준 각 bit 구간에서 안정적 샘플링
✅ 달성
rx_done 신호
수신 완료 시 1-cycle pulse 발생
✅ 달성
FPGA(Basys-3) + PC 시리얼 통신(ComPortMaster) 환경에서도 PC에서 입력한 문자열이 동일하게 되돌아오는 것을 확인했으며, 반복 실험에서도 데이터 손실·순서 오류 없이 안정적으로 동작함을 검증했습니다.
🛠️ Trouble Shooting
문제
원인
해결
DATA bit 전송 순서가 직관적으로 이해 안 됨
LSB-first 전송 방식
data_reg를 right shift하는 구조로 이해/구현
bit 전송 타이밍이 일정하지 않음
타이밍 기준 미정립
b_tick 기준 16 tick마다 1bit 전송하는 카운터 구조 추가
Start bit 검출 후 샘플링 시점 불명확
노이즈·전이 구간 영향
16x oversampling 중 8번째 tick(mid-point)에서 샘플링
rx_done → tx_start 직접 연결 시 Tx 동작 불안정
rx_done이 1-cycle pulse인지 불명확
Tx FSM이 IDLE 상태에서만 tx_start를 인식하도록 제한
STOP 상태에서도 tx_busy가 계속 유지됨(오동작으로 오인)
STOP 상태가 실제 Stop bit를 출력 중인 구간이라 정상 동작
파형 분석으로 정상 동작임을 확인, tx_busy는 전송 완료 시점과 정확히 일치
👥 Team & Role
이름
담당
최민영
UART Tx/Rx FSM 설계, Testbench 작성 및 시뮬레이션 검증, Loopback 구조 System Integration, FPGA Bitstream 생성 및 보드 동작 확인
🗓️ 진행 일지
날짜
내용
04.22
UART 통신 시스템 아키텍처 정의, Tx/Rx/Baud Tick Generator 모듈 분리 설계
04.23
UART Tx 모듈 RTL 설계 및 구현 (FSM 기반 송신 구조)
04.24
UART Rx 모듈 RTL 설계 및 구현 (16x Oversampling 기반 수신 구조)
04.25
Tx/Rx/Baud Tick Generator 통합, Loopback 구조 구현
04.26
Loopback 시스템 Testbench 작성 및 시뮬레이션 검증
04.27
최종 발표, baud_tick_gen 단위 검증 필요성 확인
⚙️ Design Environment
Language: Verilog HDL
FPGA: Basys-3
EDA Tool: Vivado / Vivado Simulator
Interface Tool: ComPortMaster
About
UART Tx/Rx 및 Loopback 구조 구현 — 16x Oversampling 기반 FPGA 직렬 통신 (Verilog)