DMA(Direct Memory Access)

DMA란?
Direct memory access의 줄임말로 date transfer시 CPU의 방해를 줄여 전체적인 속도를 증가시키는 가속기의 일종이다. CPU 대신 데이터의 처리를 해주기에 CPU의 대기시간을 줄여줄 수 있다.
기존의 Programmed I/O 방식은 CPU를 거쳐간다. 시간도 시간이지만 CPU가 "대기" 해야한다. 하지만 DMA를 활용한다면 CPU는 단지 제어 신호만 보낼 뿐 실질적 I/O와 Memory간의 데이터 전송은 DMA가 처리해주기 때문에 CPU의 사이클 방해를 하지 않는다. 전송속도는 자연스레 올라가고 CPU는 그 사이 다른 일을 할 수 있다.
○ DMA controller

Data 처리시 필요한 Address, Data bus가 있다. (Buffer가 추가될 수 있다.)
Control logic을 보면 CPU에서 DMA에 Bus 권한을 넘겨주는 것과 관련된 control 신호들이 있다.

- DMA 활성화
CPU는 Data, Address bus를 통해 DMA와 통신한다.
DMA는 CPU에서 자신의 Address를 받으면 DMA select, Register select를 통해 DMA register를 선택한다.
Address register에 접근할 주소를 저장하고 저장한 Address는 buffer를 통해 Address bus로 전송된다. 자동으로 다음 Address로 넘어간다
Word count register에 전송할 word수를 저장한다. 참고로 1 word는 1 data size이다. Address register와 반대로 1씩 감소한다.
○ DMA 동작방식
※signal을 보낸다는 건 enable 시킨다는 것을 의미한다.
- 주변 I/O에서 DMA request signal
- CPU에서 Data bus를 통해 DMA 초기화 (peripheral I/O에 대한 정보를 전송)
- DMA는 CPU에 Bus request signal을 보내고 이에 따라 CPU는 DMA에 Bus grant signal을 보낸다.
(여기서 부터 Bus의 권한은 DMA가 가지게 된다.)
- DMA가 Address값을 bus에 출력, Read/Write 활성화로 Peripheral에 승락 통보 및 데이터 전송
- 1 word의 data transfer이 끝나면 iunterrupt 신호를 CPU에게 보내 Data 전송이 끝났음을 알린다.
- Bus의 권한은 넘어가고 address register의 값은 1 증가, counter 의 값이 1 감소한다.
- Counter의 값이 0이 될 때 까지 이 과정을 반복한다.
BG=0 이면 CPU <-> DMA(내부 레지스터) 통신 // RD,WD는 양방향 라인인데 여기선 입력라인이 됨
BG=1이면 DMA <-> Memory 간의 통신을 지정함 // 출력라인
DMA에는 2가지 data 전송 방식이 있다.
1. Cycle stealing
한번에 1word 단위 data transfer만 이루어 지고 다시 Bus의 권한을 넘겨준다. CPU가 다음 clk cycle을 사용한다. 처리해야할 데이터의 양이 작을 시 사용된다.
2. Burst mode
대량의 데이터 처리시 block단위로 데이터가 처리된다. DMA가 CPU에 Bus 권한을 넘기지 않고 계속 가지고 있는다. High speed I/O transfer시 사용한다.
ref) Vivado의 example을 보면 DMA polling mode, interrupt mode가 있는데
polling : CPU가 수시로 peripheral의 요구를 확인하기에 CPU의 시간낭비가 있고 효율이 감소된다.
interrupt : peripheral에서 CPU로 들어오는 신호에만 반응하기에 CPU의 효율이 증가한다.