Keep-H's Hardware Design Study Notes

DMA (Direct Memory Access) 본문

카테고리 없음

DMA (Direct Memory Access)

Keep-H 2026. 7. 6. 16:09

DMA : CPU 대신 데이터를 복사해주는 블록

 

  • CPU는 다음과 같은 정보를 DMA에게 알려준다. 
어디서 읽을지 = SOURCE
어디에 쓸지 = DEST
얼마나 옮길지 = BNUM
시작 = GO

 

 

  • DMA는 위 신호들을 확인해서 직접 AHB bus를 잡는다.
1. SOURCE 주소에서 데이터 읽기
2. DEST 주소에 데이터 쓰기
3. 정해진 byte 수만큼 반복
4. 끝나면 done

 

CPU가 주소와 크기를 설정하면 DMA는 memory에서 데이터를 읽고 다른 memory 위치에 써서 데이터를 복사한다.

 

 

DMA 동작 Flow

 

다음 그림으로 동작을 설명해보면,

 

1. 초기화 : CPU가 DMA Controller 내부 레지스터에 접근하여 데이터 전송에 필요한 설정 값을 기록한다. 이때 Source, Destination 주소, 전송할 데이터의 크기(Size) 등이 설정된다.

이 설정이 완료되면 CPU는 버스 제어권을 DMA에게 넘기고 다른 연산 작업으로 복귀하며 이후의 데이터 전송은 DMA(bus master)가 주도하여 독립적으로 수행한다. 

 

2. 읽기 사이클 (bus read)

DMA Controller가 버스를 통해 Source Memory 또는 주변기기에 접근하여 데이터를 읽어온다.

목적지로 데이터를 한 번에 쏘는 것이 아니라 읽어온 데이터를 우선 DMA Controller 내부에 있는 임시 버퍼(FIFO)에 저장하여 타이밍과 데이터 폭을 맞춘다.

 

3. 쓰기 사이클 (bus write)

내부 FIFO에 데이터가 준비되면, DMA Controller는 다시 버스를 통해 Destination Memory에 접근하여 데이터를 기록한다.

이 Read-Write 사이클을 CPU가 처음에 설정해 둔 데이터 사이즈만큼 반복 수행하며 전송을 마친다. 

 


이번엔 실제 주소 값 기준으로 동작을 보면

 

SOURCE = 0x1000_0200, DEST = 0x1000_1200
BNUM = 16, GO = 1

 

" memory의 0x1000_0200에서 데이터를 읽은 뒤, 0x1000_1200에 값을 쓰고, 총 16bytes를 복사해라. " 라는 의미를 가진다.

 

위 명령을 받으면 DMA는 

read : 0x1000_0200 => write 0x1000_1200
read : 0x1000_0204 => write 0x1000_1204
read : 0x1000_0208 => write 0x1000_1208
read : 0x1000_020C => write 0x1000_120C

SOURCE memory                    DEST memory
0x1000_0200 : DATA0     --->      0x1000_1200 : DATA0
0x1000_0204 : DATA1     --->      0x1000_1204 : DATA1
0x1000_0208 : DATA2     --->      0x1000_1208 : DATA2
0x1000_020C : DATA3     --->      0x1000_120C : DATA3

 

위 작업을 수행하게 된다.

 

[DMA Stand-alone Test]

 

다음과 같이 테스트 밴치를 작성하여 CPU가 명령을 주는 것처럼 구성한 뒤 DMA의 기본 동작을 검증했다.