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, 개인 프로젝트)
| 항목 | 내용 |
|---|---|
| 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%) |
- 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% 달성
Button → Custom AXI GPIO → MicroBlaze Application → Reaction Test FSM → Timer(1ms Tick) → FND/LED → Custom AXI I2C Master → PCF8574 LCD 순서로 데이터가 흐릅니다.
AXI Register Block(CR/DR/ADDR/SR)이 Software Command를 I2C Controller의 cmd_start/stop/write/read로 변환하고, I2C FSM이 실제 SCL/SDA Timing을 생성합니다. done은 ack_out과 함께 AND 연산되어 Interrupt Controller로 전달됩니다.
| Write | Read |
|---|---|
![]() |
![]() |
AW/W/B(Write), AR/R(Read) 5개 채널을 VALID/READY handshake로 처리하는 표준 AXI4-Lite 트랜잭션입니다.
MicroBlaze + AXI Interconnect + AXI Interrupt Controller에 GPIO 4개, Timer, I2C Master, AXI Uartlite를 연결했고, 각 Peripheral은 독립된 64KB 영역의 Base Address를 갖습니다.
Application(ReactionTest) → Driver(LED/FND/Button/LCD) → HAL(GPIO/GPIO/GPIO/I2C/TMR) → H/W 4계층 구조입니다.
IDLE → WAIT(랜덤 2~5s) → GO → RESULT → IDLE 상태로 구성되며, WAIT 상태에서 너무 빨리 버튼을 누르면(Too Early) 결과를 9999로 처리합니다.
| 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) |
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
| 검증 구분 | 검증 항목 | 결과 |
|---|---|---|
| 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 반응시간 값 불일치 | ✅ 해결 |
세부 Coverage Bin (클릭)
| Coverage 항목 | 결과 |
|---|---|
| cp_addr (CR/IDR/ODR) | ![]() |
| cp_rw (Read/Write) | ![]() |
| cp_wdata (Zero/Low/Mid/High/Max/Alt) | ![]() |
| cp_wstrb (Byte0~3/Full) | ![]() |
| cx_addr_rw (Address × R/W Cross) | ![]() |
| cx_data_rw (Data × R/W Cross) | ![]() |
| tb_top 종합 결과 | ![]() |
| 문제 | 원인 | 해결 |
|---|---|---|
| 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 대신
donebit 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 | 최종 발표 — 시스템 구조, 검증 결과, 결론 |
- 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



















