Контроллер DMA

Библиотека: Компоненты SoC
Появился в версии: 4.1

Поведение

Контроллер DMA представляет собой простой контроллер прямого доступа к памяти для линейного копирования данных. Он копирует данные из исходного адреса (адреса источника) в целевой адрес (адрес назначения) настраиваемыми пакетами (bursts) по тактовому сигналу. Этот компонент в первую очередь предназначен для использования совместно с компонентом экрана VGA для эффективного копирования данных изображения в кадровый буфер VGA, но может применяться для любых операций передачи данных между областями памяти.

Контроллер DMA поддерживает три независимых подключения к шине: одно для доступа к управляющим регистрам (где DMA выступает в роли ведомого устройства — slave), одно для чтения из источника (только в роли ведущего — master) и одно для записи в назначение (только в роли ведущего — master). Это позволяет маршрутизировать передачу данных между различными шинами SoC. Если шина источника или шина назначения не настроены явно, в качестве резервной используется управляющая шина.

Процесс передачи

Передача инициируется записью значений в регистры адреса источника, адреса назначения и длины, после чего в регистр управления записывается бит START. После запуска контроллер DMA копирует по пакету данных (burst size) 32-разрядных слов за каждый такт, пока не будут переданы все байты. По завершении передачи устанавливается бит статуса DONE, и при необходимости генерируется прерывание, если в регистре управления был установлен бит IRQ_EN.

Пока выполняется передача (BUSY=1), попытки записи в регистры SRC_ADDR, DST_ADDR и LENGTH игнорируются.

Производительность

При размере пакета по умолчанию (16 слов за такт) контроллер DMA передает данные примерно в 80 раз быстрее, чем выполняемый процессором цикл memcpy (который требует около 5 тактов на одно слово из-за накладных расходов на выборку, декодирование и выполнение инструкций).

Контакты

На левой стороне компонента DMA:

На правой стороне компонента DMA:

Карта MMIO-регистров

Смещение Регистр Доступ Описание
0x00 SRC_ADDR R/W Адрес источника (должен быть выровнен по границе слова). Запись игнорируется, когда BUSY.
0x04 DST_ADDR R/W Адрес назначения (должен быть выровнен по границе слова). Запись игнорируется, когда BUSY.
0x08 LENGTH R/W Длина передачи в байтах (должна быть кратна 4). Запись игнорируется, когда BUSY.
0x0C CONTROL R/W бит 0 (START): запись 1 запускает новую передачу (игнорируется при BUSY или LENGTH=0).
бит 1 (IRQ_EN): разрешение генерации прерывания по завершении передачи.
0x10 STATUS R/W1C бит 0 (BUSY): только для чтения. Принимает значение 1 во время передачи.
бит 1 (DONE): сброс записью единицы (W1C). Устанавливается при завершении передачи. Запись 1 в этот бит очищает его и снимает сигнал на выходе IRQ.
0x14 BYTES_DONE RO Количество переданных байт на данный момент. Сбрасывается в 0 при запуске новой передачи.

Атрибуты

Использование с VGA-экраном

Для использования контроллера DMA для копирования изображения в кадровый буфер VGA:

  1. Разместите на одной схеме шину SoC, имитационную модель памяти, экран VGA и контроллер DMA.
  2. Подключите все компоненты к одной шине (или настройте раздельные шины источника и назначения при необходимости).
  3. Убедитесь, что компонент VGA зарегистрирован в качестве прослушивателя (sniffer) шины, на которую пишет DMA, чтобы он мог отслеживать транзакции записи и обновлять экран в реальном времени.
  4. Из вашей программы для CPU: запишите адрес исходного изображения в SRC_ADDR (0x00), адрес буфера VGA в DST_ADDR (0x04), размер передачи в LENGTH (0x08), затем запишите START|IRQ_EN в CONTROL (0x0C) для запуска передачи.
  5. Опрашивайте регистр STATUS или ожидайте прерывания IRQ, чтобы узнать о завершении передачи.

Примечание: Транзакции записи DMA видны прослушивателям шины (таким как компонент VGA), благодаря чему изображение обновляется в реальном времени во время передачи. Транзакции чтения DMA скрыты из трассировки шины для уменьшения шума.

Назад к Библиотеке SoC