728x90
1. DMA 컨트롤러 역할
- AXI4-Lite 버스를 통해 DMA의 동작을 설정 및 모니터링
- CPU(혹은 FPGA 내부 컨트롤 로직)가 DMA를 실행할 수 있도록 설정을 관리하는 모듈
_
1.1 주요 기능
- RDMA(읽기 DMA) 및 WDMA(쓰기 DMA) 제어
1) DMA가 어떤 메모리 주소에서 읽을 것인지(RDMA), 어떤 주소에 쓸 것인지(WDMA) 설정
2)rdma_mem_ptr,wdma_mem_ptr에 각각의 메모리 주소값을 설정
3)rdma_transfer_byte,wdma_transfer_byte에 전송할 데이터 크기 설정 - AXI4-Lite를 통해 CPU 또는 FPGA 로직에서 제어 가능
- CPU가 AXI4-Lite를 통해 DMA를 시작(start), 완료(done), 중지(stop) 등의 동작을 수행 가능
- 인터럽트(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 레지스터 요약
0x00→ DMA 시작/완료/유휴 상태를 관리하는 제어 레지스터0x10/0x14→ RDMA 관련 설정 (데이터 크기, 읽기 주소)0x18/0x1c→ WDMA 관련 설정 (데이터 크기, 쓰기 주소)
==========𝔼𝔼𝟚𝟚==========
3. 내부 로직에서의 동작 방식
3.1 DMA 동작 흐름
- CPU 또는 FPGA가 DMA 컨트롤러에 설정 값을 입력
1)rdma_mem_ptr에 읽을 메모리 주소 설정
2)rdma_transfer_byte에 읽을 데이터 크기 설정
3)wdma_mem_ptr에 데이터를 쓸 메모리 주소 설정
4)wdma_transfer_byte에 쓸 데이터 크기 설정 - CPU가
ap_start신호를 1로 설정하여 DMA 시작0x00주소의 첫 번째 비트(ap_start)를1로 설정
- DMA가 AXI 버스를 통해 데이터 전송 수행
rdma_mem_ptr에서 데이터를 읽고, FIFO에 저장 후,wdma_mem_ptr로 전달
- DMA가 작업을 완료하면
ap_done신호를 1로 설정- CPU 또는 FPGA 로직이 이를 감지하고 다음 동작 수행 가능
- (선택 사항) 자동 재시작 기능을 사용하면 연속적으로 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 코드 실행 흐름
- 0x80000000에서 1024바이트를 읽고 → 0x81000000에 1024바이트를 씀.
ap_done이 설정될 때까지 대기.
==========𝔼𝔼𝟚𝟚==========
5. 결론
- DMA 컨트롤러의 역할
- RDMA와 WDMA를 설정하고, AXI4를 통해 데이터 이동을 수행
- AXI4-Lite 인터페이스를 통해 CPU가 설정 값을 전달하여 제어 가능
- 인터럽트를 사용하여 CPU에게 DMA 완료 알림 가능
- WDMA 사용 시 필요한 설정
wdma_mem_ptr에 쓰기 메모리 주소 설정wdma_transfer_byte에 전송할 데이터 크기 설정ap_start신호를1로 설정하여 DMA 실행
- CPU가 AXI4-Lite를 통해 DMA를 제어할 수 있음
- CPU가 AXI4-Lite로 DMA 설정값을 쓰고 시작할 수 있음
- DMA 완료 여부를
ap_done을 통해 확인 가능
_
즉, DMA 컨트롤러는 FPGA 내부에서 AXI4-Lite를 통해 RDMA & WDMA 설정을 수행하고, CPU가 이를 제어할 수 있도록 하는 역할을 수행한다.
728x90
반응형
'Study > FPGA' 카테고리의 다른 글
| 12. Registered Output vs. Combinational Logic Output 비교 정리 (0) | 2025.03.22 |
|---|---|
| 10. AMBA | AXI4와 AXI4-Stream의 차이점 (0) | 2025.03.11 |
| 09. AXI4-Lite 개념 (+standard와의 차이점) (0) | 2025.03.11 |
| 08. Handshake 개념 (0) | 2025.03.08 |
| [FPGA] 07 - 파이프라인 Pipeline 개념과 예제 (0) | 2025.03.08 |