Study/FPGA

11. DMA Controller | FPGA 컨트롤러의 역할 및 설정

도엔 2025. 3. 15. 19:16
728x90

1. DMA 컨트롤러 역할

  • AXI4-Lite 버스를 통해 DMA의 동작을 설정 및 모니터링
  • CPU(혹은 FPGA 내부 컨트롤 로직)가 DMA를 실행할 수 있도록 설정을 관리하는 모듈

_

1.1 주요 기능

  1. RDMA(읽기 DMA) 및 WDMA(쓰기 DMA) 제어
    1) DMA가 어떤 메모리 주소에서 읽을 것인지(RDMA), 어떤 주소에 쓸 것인지(WDMA) 설정
    2) rdma_mem_ptr, wdma_mem_ptr에 각각의 메모리 주소값을 설정
    3) rdma_transfer_byte, wdma_transfer_byte전송할 데이터 크기 설정
  2. AXI4-Lite를 통해 CPU 또는 FPGA 로직에서 제어 가능
    • CPU가 AXI4-Lite를 통해 DMA를 시작(start), 완료(done), 중지(stop) 등의 동작을 수행 가능
  3. 인터럽트(Interrupt) 지원
    • DMA 동작이 끝났을 때 CPU로 인터럽트를 보내 작업 완료를 알림


==========𝔼𝔼𝟚𝟚==========

 

2. DMA 컨트롤러 레지스터 설정

2.1 주요 레지스터 (AXI4-Lite 접근 가능)

// 0x00 : Control signals (제어 신호)
//        bit 0  - ap_start (DMA 시작) (Read/Write)
//        bit 1  - ap_done (DMA 완료) (Read/COR)
//        bit 2  - ap_idle (DMA 유휴 상태) (Read)
//        bit 3  - ap_ready (DMA 준비 완료) (Read/COR)
//        bit 7  - auto_restart (자동 재시작) (Read/Write)
//        bit 9  - interrupt (인터럽트 발생 여부) (Read)
// 0x10 : RDMA 전송 바이트 수 (rdma_transfer_byte)
//        bit 31~0 - 전송할 데이터 크기 (Read/Write)
// 0x14 : RDMA 메모리 주소 (rdma_mem_ptr)
//        bit 31~0 - 읽을 메모리 주소 (Read/Write)
// 0x18 : WDMA 전송 바이트 수 (wdma_transfer_byte)
//        bit 31~0 - 전송할 데이터 크기 (Read/Write)
// 0x1c : WDMA 메모리 주소 (wdma_mem_ptr)
//        bit 31~0 - 데이터를 쓸 메모리 주소 (Read/Write)
// 0x24 : value_to_add (추가 데이터 값, 필요시 수정 가능)

_

2.2 레지스터 요약

  1. 0x00DMA 시작/완료/유휴 상태를 관리하는 제어 레지스터
  2. 0x10 / 0x14RDMA 관련 설정 (데이터 크기, 읽기 주소)
  3. 0x18 / 0x1cWDMA 관련 설정 (데이터 크기, 쓰기 주소)


==========𝔼𝔼𝟚𝟚==========

 

3. 내부 로직에서의 동작 방식

3.1 DMA 동작 흐름

  1. CPU 또는 FPGA가 DMA 컨트롤러에 설정 값을 입력
    1) rdma_mem_ptr읽을 메모리 주소 설정
    2) rdma_transfer_byte읽을 데이터 크기 설정
    3) wdma_mem_ptr데이터를 쓸 메모리 주소 설정
    4) wdma_transfer_byte쓸 데이터 크기 설정
  2. CPU가 ap_start 신호를 1로 설정하여 DMA 시작
    • 0x00 주소의 첫 번째 비트(ap_start)를 1로 설정
  3. DMA가 AXI 버스를 통해 데이터 전송 수행
    • rdma_mem_ptr에서 데이터를 읽고, FIFO에 저장 후, wdma_mem_ptr로 전달
  4. DMA가 작업을 완료하면 ap_done 신호를 1로 설정
    • CPU 또는 FPGA 로직이 이를 감지하고 다음 동작 수행 가능
  5. (선택 사항) 자동 재시작 기능을 사용하면 연속적으로 DMA 수행 가능
    • 0x00 주소의 auto_restart 비트를 1로 설정하면, DMA가 완료되자마자 자동 재시작


==========𝔼𝔼𝟚𝟚==========

 

4. 설정 예제

4.1 RDMA, WDMA

#define DMA_BASE_ADDR  0x40000000  // DMA 컨트롤러의 AXI4-Lite 베이스 주소
#define RDMA_ADDR      (DMA_BASE_ADDR + 0x14)  // RDMA 시작 주소
#define RDMA_SIZE      (DMA_BASE_ADDR + 0x10)  // RDMA 데이터 크기
#define WDMA_ADDR      (DMA_BASE_ADDR + 0x1C)  // WDMA 쓰기 주소
#define WDMA_SIZE      (DMA_BASE_ADDR + 0x18)  // WDMA 데이터 크기
#define DMA_CTRL       (DMA_BASE_ADDR + 0x00)  // DMA 제어 레지스터

void start_dma(uint32_t read_addr, uint32_t write_addr, uint32_t size) {
    *(volatile uint32_t*) RDMA_ADDR = read_addr; // RDMA 메모리 주소 설정
    *(volatile uint32_t*) RDMA_SIZE = size;      // RDMA 데이터 크기 설정
    *(volatile uint32_t*) WDMA_ADDR = write_addr;// WDMA 메모리 주소 설정
    *(volatile uint32_t*) WDMA_SIZE = size;      // WDMA 데이터 크기 설정

    *(volatile uint32_t*) DMA_CTRL = 1; // DMA 시작 (ap_start=1)
}

int main() {
    start_dma(0x80000000, 0x81000000, 1024); // 0x80000000에서 0x81000000으로 1024바이트 전송
    while ((*(volatile uint32_t*) DMA_CTRL & (1 << 1)) == 0); // DMA 완료 대기 (ap_done 확인)
    return 0;
}

_

4.2 코드 실행 흐름

  1. 0x80000000에서 1024바이트를 읽고 → 0x81000000에 1024바이트를 씀.
  2. ap_done이 설정될 때까지 대기.


==========𝔼𝔼𝟚𝟚==========

 

5. 결론

  1. DMA 컨트롤러의 역할
    • RDMA와 WDMA를 설정하고, AXI4를 통해 데이터 이동을 수행
    • AXI4-Lite 인터페이스를 통해 CPU가 설정 값을 전달하여 제어 가능
    • 인터럽트를 사용하여 CPU에게 DMA 완료 알림 가능
  2. WDMA 사용 시 필요한 설정
    • wdma_mem_ptr에 쓰기 메모리 주소 설정
    • wdma_transfer_byte에 전송할 데이터 크기 설정
    • ap_start 신호를 1로 설정하여 DMA 실행
  3. CPU가 AXI4-Lite를 통해 DMA를 제어할 수 있음
    • CPU가 AXI4-Lite로 DMA 설정값을 쓰고 시작할 수 있음
    • DMA 완료 여부를 ap_done을 통해 확인 가능

_

즉, DMA 컨트롤러는 FPGA 내부에서 AXI4-Lite를 통해 RDMA & WDMA 설정을 수행하고, CPU가 이를 제어할 수 있도록 하는 역할을 수행한다.

728x90
반응형