Контроллер 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:
- Reset: вход сброса с активным высоким уровнем. При подаче высокого уровня все регистры DMA очищаются, а любая выполняющаяся передача отменяется.
- Clock: тактовый вход. На каждом фронте тактового сигнала контроллер DMA передает до размера пакета (burst size) слов, если выполняется передача.
На правой стороне компонента DMA:
- IRQ: выход прерывания с активным высоким уровнем. Устанавливается при завершении передачи, если в регистре CONTROL задано разрешение прерываний IRQ_EN. Сбрасывается записью единицы в бит DONE регистра STATUS.
Карта 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 при запуске новой передачи. |
Атрибуты
- Базовый адрес (Base address): начальный адрес области MMIO-регистров (6 регистров, всего 24 байта). Должен быть выровнен по границе слова.
- Размер пакета (Burst size): количество 32-разрядных слов, передаваемых за один такт. Должно быть степенью двойки (1, 2, 4, 8, 16, 32, 64, 128 или 256). По умолчанию 16.
- Метка (Label): имя компонента.
- Шрифт метки (Label font): шрифт для отображения метки.
- Отображение метки (Label visible): определяет, будет ли метка видна на схеме.
- Подключенная шина (Connected bus): шина, по которой управляющие регистры DMA доступны в режиме slave. Нажмите, чтобы выбрать компонент шины.
- Шина источника (Source bus): шина, используемая для операций чтения данных. Если не настроена, используется управляющая шина.
- Шина назначения (Destination bus): шина, используемая для операций записи данных. Если не настроена, используется управляющая шина.
Использование с VGA-экраном
Для использования контроллера DMA для копирования изображения в кадровый буфер VGA:
- Разместите на одной схеме шину SoC, имитационную модель памяти, экран VGA и контроллер DMA.
- Подключите все компоненты к одной шине (или настройте раздельные шины источника и назначения при необходимости).
- Убедитесь, что компонент VGA зарегистрирован в качестве прослушивателя (sniffer) шины, на которую пишет DMA, чтобы он мог отслеживать транзакции записи и обновлять экран в реальном времени.
- Из вашей программы для CPU: запишите адрес исходного изображения в SRC_ADDR (0x00), адрес буфера VGA в DST_ADDR (0x04), размер передачи в LENGTH (0x08), затем запишите START|IRQ_EN в CONTROL (0x0C) для запуска передачи.
- Опрашивайте регистр STATUS или ожидайте прерывания IRQ, чтобы узнать о завершении передачи.
Примечание: Транзакции записи DMA видны прослушивателям шины (таким как компонент VGA), благодаря чему изображение обновляется в реальном времени во время передачи. Транзакции чтения DMA скрыты из трассировки шины для уменьшения шума.