Skip to content

kngyeol/resnet50-mac-accelerator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ResNet50 MAC Accelerator on Xilinx Zynq

Xilinx Zynq-7000 SoC 기반 ResNet50 CNN 추론 가속기 프로젝트. FPGA(PL)에 구현된 Multiply-Accumulate(MAC) 가속기와 ARM Cortex-A9(PS)의 SW를 결합하여 2D Convolution 연산을 하드웨어 가속한다.

Architecture Overview

┌─────────────────────────────────────────────────────────────────┐
│                        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       │
└─────────────────────────────────────────────────────────────────┘

Key Features

  • 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) 측정

Project Structure

├── 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 프로젝트

RTL Versions

v1 — Basic Sequential FIFO

  • 단순 FIFO 기반 MAC 가속기
  • 외부 clr 신호로 weight FIFO 포인터 리셋
  • 1개 config 파라미터 (F: output feature size)

v2 — Tiled/Matrix-Aware Access

  • 스트라이드 주소 생성: addr = cnt_m * C + cnt_i (3중 중첩 루프)
  • 3개 config 파라미터 (F, C, M)
  • Controller의 clr 신호 제거 → PDMA 내부에서 자체 관리
  • 더 큰 데이터셋 지원 (64 → 580 elements)

MAC Operation

                    ┌─────────────┐
  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 우측 시프트)

Build & Run

RTL Simulation (Vivado)

  1. Vivado에서 새 프로젝트 생성
  2. rtl/v1/src/*.v 파일을 Design Sources로 추가
  3. rtl/v1/tb/tb_axis_mac.v를 Simulation Sources로 추가
  4. rtl/v1/sim_data/의 txt 파일을 시뮬레이션 워킹 디렉토리에 복사
  5. rtl/constraints/constrs.xdc를 Constraints로 추가
  6. Behavioral Simulation 실행

SW Build (Xilinx SDK)

  1. Vivado에서 Block Design 생성 및 Export Hardware (.hdf)
  2. SDK에서 BSP 및 Application Project 생성
  3. sw/src/ 파일을 프로젝트에 복사
  4. Build 후 ARM에 다운로드 & 실행

Performance

Implementation Description
Reference (conv2d_ref) ARM CPU-only, 6중 루프 직접 연산
Optimized (conv2d_opt) DMA + FPGA MAC 가속, weight 재사용

벤치마크 실행 시 Optimized is x{N} faster than Reference 형태로 속도 향상 배율이 출력된다.

Technology

  • Target Board: Xilinx Zynq-7000 (Cortex-A9 + Artix-7 FPGA)
  • Tool: Vivado 2018.x / Xilinx SDK
  • Clock: 50 MHz (PL)
  • Fixed-Point: Q10.22

References

  • K. He et al., "Deep Residual Learning for Image Recognition," CVPR 2016
  • Venkatesan et al., 2019 (see docs/)

License

Copyright (c) 2023 SoC Design Laboratory, Konkuk University, South Korea. See LICENSE for details.

About

ResNet50 MAC Accelerator on Xilinx Zynq-7000 (Verilog RTL + ARM C Software)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages