Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔌 AXI I2C Master Peripheral + MicroBlaze SoC (Reaction Test)

MicroBlaze를 AXI Master로 사용하고, 직접 설계한 Custom AXI I2C Master IP를 포함한 GPIO/Timer Peripheral을 AXI4-Lite로 통합한 SoC 프로젝트입니다. LCD/FND/LED/Button을 이용한 반응속도 측정(Reaction Test) 애플리케이션을 Hardware/Software Co-Design으로 구현하고, Simulation·Logic Analyzer·UVM Functional Coverage로 검증했습니다.

온디바이스 AI 시스템반도체설계 2기 프로젝트 (2026.06.22 ~ 2026.06.29, 개인 프로젝트)

📌 Overview

항목 내용
Processor MicroBlaze
Bus Protocol AXI4-Lite (32-bit, Memory-Mapped)
FPGA Board Digilent Basys3
System Clock 100MHz
Custom Peripheral AXI I2C Master, AXI GPIO, AXI Timer
I2C 대상 LCD(PCF8574, 0x27), 결과 전송 Slave(0x41)
Timer 1ms Tick (PSC=99, ARR=999)
Application FSM IDLE → WAIT(2~5s 랜덤) → GO → RESULT
Display 4-digit FND(Dynamic), 16x2 Character LCD
Hardware / Software Tool Vivado / Vitis
Verification Vivado Simulation, Logic Analyzer, UVM, Functional Coverage(29/29 Bin, 100%)

✨ Features

  • Custom AXI I2C Master IP: AXI Register Interface(CR/DR/ADDR/SR)와 I2C Protocol Controller(FSM)를 분리 설계
  • AXI4-Lite Register Map: 유지형 Control Bit(intr_en)와 Pulse형 Command(cmd_start/stop/write/read)를 분리, done 플래그는 SR 읽기 시 자동 클리어(rc_r)
  • SDA Open-Drain 설계: Master/Slave가 같은 Data Line을 충돌 없이 공유
  • MicroBlaze 기반 SoC 통합: AXI Interconnect + AXI Interrupt Controller로 GPIO×4, Timer, I2C Master, UARTLite를 하나의 SoC로 구성
  • Software 계층 분리: Application(ReactionTest) → Driver(LCD/FND/LED/Button) → HAL(GPIO/I2C/TMR) → Common(interrupt/delay) 구조
  • Non-blocking Reaction Test FSM: Timer Interrupt 기반 1ms Tick + FND Multiplexing으로 반응시간을 논블로킹으로 측정
  • 결과값 단일 Capture: Button Push Event 시점에 한 번만 계산한 값을 FND/LCD/I2C Slave에 동일하게 전달 (트러블슈팅으로 개선)
  • Custom AXI GPIO IP UVM 검증: Write/Readback/WSTRB/Corner Pattern 등 5개 테스트, Functional Coverage 29/29 Bin 100% 달성

🏗️ Architecture

System Block Diagram

System Block Diagram

Button → Custom AXI GPIO → MicroBlaze Application → Reaction Test FSM → Timer(1ms Tick) → FND/LED → Custom AXI I2C Master → PCF8574 LCD 순서로 데이터가 흐릅니다.

AXI I2C Master Peripheral

AXI I2C Master Peripheral

AXI Register Block(CR/DR/ADDR/SR)이 Software Command를 I2C Controller의 cmd_start/stop/write/read로 변환하고, I2C FSM이 실제 SCL/SDA Timing을 생성합니다. doneack_out과 함께 AND 연산되어 Interrupt Controller로 전달됩니다.

AXI4-Lite Write / Read Transaction

Write Read
AXI Write AXI Read

AW/W/B(Write), AR/R(Read) 5개 채널을 VALID/READY handshake로 처리하는 표준 AXI4-Lite 트랜잭션입니다.

MicroBlaze Block Design

MicroBlaze Block Design MicroBlaze Address Map

MicroBlaze + AXI Interconnect + AXI Interrupt Controller에 GPIO 4개, Timer, I2C Master, AXI Uartlite를 연결했고, 각 Peripheral은 독립된 64KB 영역의 Base Address를 갖습니다.

Software Layer

Software Layer Diagram

Application(ReactionTest) → Driver(LED/FND/Button/LCD) → HAL(GPIO/GPIO/GPIO/I2C/TMR) → H/W 4계층 구조입니다.

Reaction Test FSM

Reaction Test FSM

IDLE → WAIT(랜덤 2~5s) → GO → RESULT → IDLE 상태로 구성되며, WAIT 상태에서 너무 빨리 버튼을 누르면(Too Early) 결과를 9999로 처리합니다.

📋 I2C Master Register Map

Register Map Overview

Offset 이름 설명
0x00 CR (Control Register) bit[4:1] cmd_read/write/stop/start (Pulse, W), bit[0] intr_en (R/W)
0x04 DR (Data Register) bit[7:0] TX/RX data (R/W)
0x08 ADDR (Slave Address) bit[6:0] slave_addr (R/W) — 이 프로젝트에서는 LCD(0x27), Slave(0x41) 사용
0x0C SR (Status Register, Read Only) bit[2] ack_out(R), bit[1] done(rc_r), bit[0] busy(R)
레지스터 상세 (클릭)

CR DR ADDR SR

Command bit(cmd_start/stop/write/read)는 1클럭 펄스 후 하드웨어가 자동 클리어되며, done은 SR을 읽으면 자동 클리어(rc_r)되어 intr_en과 AND되어 인터럽트를 발생시킵니다.

📁 구성 파일

rtl/              — Custom AXI Peripheral RTL
  I2C_Master.v              I2C Protocol Controller (FSM)
  i2c_master_v1_0.v         AXI I2C Master IP Top
  i2c_master_v1_0_S00_AXI.v AXI4-Lite Register Interface (CR/DR/ADDR/SR)
  myip_v1_0.v                Custom AXI GPIO IP Top (UVM 검증 대상)
  myip_v1_0_S00_AXI.v        Custom AXI GPIO Register Interface

verification/      — Custom AXI GPIO UVM Testbench
  gpio_transaction.sv / gpio_sequence.sv   UVM Transaction/Sequence
  gpio_driver.sv / gpio_monitor.sv          UVM Driver/Monitor
  gpio_agent.sv / gpio_env.sv               UVM Agent/Environment
  gpio_scoreboard.sv / gpio_coverage.sv    Scoreboard/Functional Coverage
  gpio_if.sv / gpio_test.sv / tb_top.sv     Interface/Test/Top

firmware/           — Vitis Software (MicroBlaze)
  main.c                      진입점
  ReactionTest.c/h            Application FSM (IDLE/WAIT/GO/RESULT)
  GPIO.c/h, I2C.c/h, TMR.c/h   HAL (Peripheral Register 접근)
  LCD.c/h, FND.c/h, LED.c/h, Button.c/h   Driver
  interrupt.c/h, delay.c/h    Common

🔍 Simulation & Verification (요약)

검증 구분 검증 항목 결과
AXI Simulation CR/DR/ADDR Write Sequence ✅ 달성
AXI Simulation START/WRITE Command Pulse ✅ 달성
I2C FSM START Condition / 8-bit Data Transfer / ACK Sampling / STOP Condition ✅ 달성
Logic Analyzer LCD Address 0x27, Slave ACK 확인 ✅ 확인
FPGA Board IDLE/WAIT/GO/RESULT 정상 동작, Too Early 처리, Clear 복귀 ✅ 정상
UVM GPIO Write / Readback / WSTRB / Corner Pattern (5 Test) ✅ PASS
Functional Coverage 29/29 Bin ✅ 100%
Trouble Shooting FND/LCD 반응시간 값 불일치 ✅ 해결

UVM Functional Coverage 결과 (29/29 Bin, 100%)

Coverage Summary

세부 Coverage Bin (클릭)
Coverage 항목 결과
cp_addr (CR/IDR/ODR) cp_addr
cp_rw (Read/Write) cp_rw
cp_wdata (Zero/Low/Mid/High/Max/Alt) cp_wdata
cp_wstrb (Byte0~3/Full) cp_wstrb
cx_addr_rw (Address × R/W Cross) cx_addr_rw
cx_data_rw (Data × R/W Cross) cx_data_rw
tb_top 종합 결과 tb_top

🛠️ Trouble Shooting

문제 원인 해결
FND와 LCD가 서로 다른 반응시간 값을 표시 (예: FND=0300 / LCD=307ms) FND는 GO 상태에서 ReactionTest_RunTime()이 10ms마다 갱신한 마지막 값을 표시하고, LCD는 Button 이벤트 시점에 반응시간을 새로 계산해서 사용 — 서로 다른 시점의 값 Button Push Event가 감지된 순간 RT_ResultMs를 한 번만 계산(Capture)하고, FND/LCD/I2C Slave 전송에 동일한 전역값을 사용하도록 수정
Custom I2C Master의 Command가 여러 번 반복 실행될 위험 AXI Register의 START/WRITE/READ가 level 신호로 유지되면 반복 실행 가능 Command를 1-clock Pulse로 변환해 한 번의 Write마다 한 번만 동작하도록 구성
Master/Slave가 SDA 라인을 동시에 구동할 위험 I2C는 여러 장치가 하나의 데이터선을 공유하는 오픈 드레인 버스 SDA를 Open-Drain(tri-state)으로 설계해 충돌 없이 공유

향후 개선 방향 (완료보고서 기준)

  • I2C 완료 대기를 고정 delay 대신 done bit polling + timeout으로 개선
  • ACK/NACK을 상위 Driver에 반환해 오류 시 트랜잭션 중단 및 에러 코드 반환
  • Interrupt를 pulse 대신 done_latch 기반 Level Interrupt로 전환해 인식 안정성 향상
  • AXI Protocol 검증 시나리오 확대 (READY 지연, Reset 중 Transaction, SLVERR 등)
  • UVM에 Code Coverage(Statement/Branch/Toggle/FSM) 추가, Random Seed 기반 Regression 반복

🗓️ 진행 일지

날짜 내용
06.22 AXI4-Lite Protocol 구조 분석 (VALID/READY Handshake, Response)
06.23 Custom I2C Master IP 설계 — AXI Register Block, Register Map, Command Pulse, I2C FSM
06.24 MicroBlaze SoC 구성 — Block Design, Address Map, Interrupt, External Port 연결
06.25 GPIO/Timer/I2C HAL 및 LCD/FND/LED/Button Driver 구현
06.26 Reaction Test Application 구현 (IDLE/WAIT/GO/RESULT FSM, 반응시간 측정)
06.27 AXI Register Write Simulation, I2C Address/ACK Logic Analyzer 검증, FPGA 통합 동작 확인
06.28 UVM 검증 수행 및 FND/LCD 결과 불일치 Trouble Shooting
06.29 최종 발표 — 시스템 구조, 검증 결과, 결론

⚙️ Design Environment

  • Processor: MicroBlaze / Bus: AXI4-Lite
  • FPGA Board: Digilent Basys3
  • Hardware Tool: Vivado / Software Tool: Vitis
  • RTL: Verilog, SystemVerilog / Software: C
  • Simulator: Vivado Simulator, Verdi
  • Verification: UVM, Functional Coverage
  • Protocol Measurement: Logic Analyzer

About

MicroBlaze + AXI4-Lite 기반 SoC — Custom AXI I2C Master IP 설계, Reaction Test 앱(HW/SW Co-Design), UVM 검증(Functional Coverage 100%)

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages