Xilinx Zynq-7000 SoC 기반 ResNet50 CNN 추론 가속기 프로젝트. FPGA(PL)에 구현된 Multiply-Accumulate(MAC) 가속기와 ARM Cortex-A9(PS)의 SW를 결합하여 2D Convolution 연산을 하드웨어 가속한다.
┌─────────────────────────────────────────────────────────────────┐
│ Zynq-7000 SoC │
│ │
│ ┌──────────────────┐ AXI DMA x4 ┌────────────────┐ │
│ │ PS (ARM A9) │◄───────────────────►│ PL (FPGA) │ │
│ │ │ IDMA (Input) │ │ │
│ │ ResNet50 SW │ WDMA (Weight) │ MAC Accelerator│ │
│ │ - conv2d_opt │ PDMA (Config) │ - IFIFO │ │
│ │ - conv2d_ref │ ODMA (Output) │ - WFIFO │ │
│ │ - batchnorm2d │ │ - MACcore │ │
│ │ - relu, maxpool │ AXI4-Lite │ - Controller │ │
│ │ - fc_layer │◄──────────────────►│ - AXI Regs │ │
│ │ │ (iteration 설정) │ │ │
│ └──────────────────┘ └────────────────┘ │
│ │
│ DDR Memory: Input Image + Weights (0x2C900000~) + Output │
└─────────────────────────────────────────────────────────────────┘
- Q10.22 고정소수점 연산 (10-bit 정수, 22-bit 소수)
- AXI-Stream 기반 데이터 스트리밍 (IDMA/WDMA/PDMA/ODMA)
- AXI4-Lite 설정 레지스터 (MAC iteration count)
- Weight 재사용: 1×1 Conv에서 weight를 WFIFO에 캐싱하여 F×E번 재사용
- ResNet50 전체 추론: ImageNet 1000-class 분류
- 벤치마크 프레임워크: Reference(SW) vs Optimized(HW 가속) 성능 비교 및 정확도(NSR) 측정
├── README.md
├── LICENSE
├── docs/
│ └── architecture.md # 상세 아키텍처 문서
├── rtl/
│ ├── v1/ # v1: Basic Sequential FIFO
│ │ ├── src/
│ │ │ ├── axis_mac.v # AXI-Stream 최상위 래퍼
│ │ │ ├── TopMAC.v # MAC 유닛 구조적 최상위
│ │ │ ├── Controller.v # FSM 컨트롤러 (IDLE→COMP→STORE)
│ │ │ ├── MACcore.v # 곱셈-누적 연산 코어
│ │ │ ├── IFIFO.v # Input FIFO
│ │ │ ├── WFIFO.v # Weight FIFO (재사용 지원)
│ │ │ ├── pdma.v # Config 레지스터 (PDMA)
│ │ │ └── s_axi_lite_register.v # AXI4-Lite 레지스터 뱅크
│ │ ├── tb/
│ │ │ └── tb_axis_mac.v # 테스트벤치
│ │ └── sim_data/
│ │ ├── RTLin_ref.txt # 입력 데이터 (hex)
│ │ ├── RTLwt_ref.txt # Weight 데이터 (hex)
│ │ └── RTLout_ref.txt # 기대 출력 (hex)
│ ├── v2/ # v2: Tiled/Matrix-Aware Access
│ │ ├── src/ # 스트라이드 주소 생성 + M/C 파라미터 추가
│ │ ├── tb/
│ │ └── sim_data/
│ └── constraints/
│ └── constrs.xdc # Timing constraint (50 MHz)
├── sw/
│ └── src/
│ ├── main.c # 메인 — 벤치마크 실행
│ ├── conv2d_opt.c # DMA 가속 Conv2d
│ ├── conv2d_ref.c # Reference Conv2d (Golden)
│ ├── PL_DMA.c / .h # AXI DMA 드라이버
│ ├── benchmarking.c / .h # 성능 측정 프레임워크
│ ├── platform.c / .h # Xilinx 플랫폼 초기화
│ └── resnet/
│ ├── resnet50.c / .h # ResNet50 네트워크 구현
│ ├── functions.c / .h # NN 레이어 함수 (BN, ReLU, MaxPool, FC)
│ ├── input_image.h # 테스트 입력 이미지 데이터
│ └── class_labels.h # ImageNet 클래스 레이블
└── original/ # 원본 Vivado/SDK 프로젝트 (참고용)
├── term_opt4.srcs/ # v1 원본 소스
├── try/term_opt6.srcs/ # v2 원본 소스
└── Termproject01.sdk/ # Xilinx SDK 프로젝트
- 단순 FIFO 기반 MAC 가속기
- 외부
clr신호로 weight FIFO 포인터 리셋 - 1개 config 파라미터 (F: output feature size)
- 스트라이드 주소 생성:
addr = cnt_m * C + cnt_i(3중 중첩 루프) - 3개 config 파라미터 (F, C, M)
- Controller의
clr신호 제거 → PDMA 내부에서 자체 관리 - 더 큰 데이터셋 지원 (64 → 580 elements)
┌─────────────┐
in_data[31:0] ──►│ │
(Q10.22) │ 32×32 MUL │──► 64-bit product
│ │
wt_data[31:0] ──►│ │
(Q10.22) └─────────────┘
│
▼
┌─────────────┐
│ 64-bit ACC │──► REG_O[63:0]
│ (N cycles) │
└─────────────┘
│
▼
REG_O[53:22] ──► out_data[31:0] (Q10.22)
- 곱셈: Q10.22 × Q10.22 = Q20.44 (64-bit)
- 누적: N회 (iteration 값) 누적 덧셈
- 출력: bit[53:22] 추출 → Q10.22 복원 (22-bit 우측 시프트)
- Vivado에서 새 프로젝트 생성
rtl/v1/src/*.v파일을 Design Sources로 추가rtl/v1/tb/tb_axis_mac.v를 Simulation Sources로 추가rtl/v1/sim_data/의 txt 파일을 시뮬레이션 워킹 디렉토리에 복사rtl/constraints/constrs.xdc를 Constraints로 추가- Behavioral Simulation 실행
- Vivado에서 Block Design 생성 및 Export Hardware (.hdf)
- SDK에서 BSP 및 Application Project 생성
sw/src/파일을 프로젝트에 복사- Build 후 ARM에 다운로드 & 실행
| Implementation | Description |
|---|---|
| Reference (conv2d_ref) | ARM CPU-only, 6중 루프 직접 연산 |
| Optimized (conv2d_opt) | DMA + FPGA MAC 가속, weight 재사용 |
벤치마크 실행 시 Optimized is x{N} faster than Reference 형태로 속도 향상 배율이 출력된다.
- Target Board: Xilinx Zynq-7000 (Cortex-A9 + Artix-7 FPGA)
- Tool: Vivado 2018.x / Xilinx SDK
- Clock: 50 MHz (PL)
- Fixed-Point: Q10.22
- K. He et al., "Deep Residual Learning for Image Recognition," CVPR 2016
- Venkatesan et al., 2019 (see
docs/)
Copyright (c) 2023 SoC Design Laboratory, Konkuk University, South Korea. See LICENSE for details.