MPU обращается к занятой памяти

Я не знал, разместить ли этот вопрос здесь или в stackoverflow, но, наконец, решил опубликовать его здесь.

Я хочу построить простую систему, которая могла бы работать с базовой периферией (UART, клавиатура, монитор VGA). Я хотел бы использовать MPU вместо MCU в качестве «основного блока», чтобы было больше памяти для обработки данных. Этот «основной» чип будет использовать одну SDRAM для хранения своих данных.

Для выхода VGA я хочу использовать чип Atmel AVR, который будет запрашивать данные из другой памяти, которая будет содержать данные экрана в 8-битном формате RGBS. Вот где я добираюсь до проблем.

Мне не нужно много памяти VGA (менее 512 КБ), поэтому я хочу использовать память SRAM, доступ к которой также прост по сравнению с SDRAM. Разрешение VGA, которое я выбрал, использует пиксельную тактовую частоту 25 МГц, а это означает, что у меня есть всего ~ 40 нс времени для извлечения одного пикселя из SRAM в ЦАП. Это хорошо, так как большинство памяти, которые соответствуют моему вводу поиска (> = 4 Мбит памяти, < 40 нс время доступа), могут это сделать.

Возвращаясь к памяти MPU, я хотел бы задать свой первый вопрос: когда необходимо отправить команду обновления в SDRAM? Должен ли я это делать, или можно получить память, для обновления которой потребуется какая-то внешняя магия?

Теперь я перехожу к проблеме, как получить доступ к этой памяти SRAM VGA из основного чипа, поскольку к ней почти всегда обращается мой контроллер VGA (не говоря уже о том, что мне нужен еще один чип для красивого отображения этой памяти в адресное пространство MPU). Я подумал о том, чтобы зарезервировать некоторые контакты контроллера VGA для запросов MPU на доступ к SRAM, что означало бы, что некоторые видеокадры пришлось бы пропускать, оставляя эту SRAM доступной для MPU без перерывов.

Я застрял здесь. Я мог думать только об этих возможных решениях:

  1. Я могу использовать SDRAM на чипе VGA вместо SRAM, но мне также понадобится лучший контроллер для видеовыхода. Эта SDRAM будет совместима с той, что на MPU, и мне нужно будет продумать особую тактику кражи часов, при которой я мог бы получить доступ к видеопамяти одновременно с видеоконтроллера и основного процессора.
  2. Могу добавить еще одну микросхему, которая будет использовать время, когда видеопамять не обращается (синхроимпульсы, порчи и т.п.) для копирования блоков данных из основной памяти в видеопамять.
  3. Я могу использовать только одну память SDRAM и запрашивать доступ к ней у MPU каждый раз, когда VGA требуется еще один пиксель. Это замедлило бы всю систему, но было бы проще.

Что ты думаешь об этом? Какие еще способы (хитрости, конструкции?) тут есть, чтобы иметь два блока (основной и блок видеообработки), из которых один управляется другим?

Спасибо.

Спасибо за ваши идеи. Я предполагаю, что для доступа к памяти с чередованием требуется SDRAM, не так ли?
Не обязательно. Я сделал это с быстрой SRAM. С 2 чередующимися чипами у меня было более 2 окон доступа (думаю, может быть 4). Кстати, это гораздо проще сделать с ПЛИС.

Ответы (1)

Одна вещь, которая раньше была общей для графических видеоконтроллеров, — это видеопамять или видеопамять .

VRAM имеет два набора контактов вывода данных и, следовательно, два порта, которые можно использовать одновременно. Доступ к первому порту, порту DRAM, осуществляется хост-компьютером способом, очень похожим на традиционную DRAM. Второй порт, видеопорт, обычно доступен только для чтения и предназначен для обеспечения канала сериализованных данных с высокой пропускной способностью для графического набора микросхем.

Внутри VRAM считывает всю строку DRAM и последовательно перемещает ее в видеосхему. Это оставляет DRAM доступной для использования MPU. VRAM в значительной степени была заменена использованием SDRAM, «хотя она является только однопортовой и требует больших накладных расходов».


Техника, которую я использовал в прошлом, заключается в использовании чередующегося доступа к памяти. Это немного сложно объяснить (дьявол кроется в деталях), но я изложу основы:

В основном MPU обращается к видеопамяти в промежутках между обращениями видеоконтроллера к пикселям. Если это время становится слишком жестким, есть пара вещей, которые вы можете сделать, чтобы значительно сократить время (обычно требуется только 1 из них):

  1. Вы можете использовать 2 чипа RAM (или банка) и чередовать те, которые используют каждый чип для каждого второго пикселя. В вашем случае это эффективно замедлит ваши пиксельные часы до 80 нс на чип, позволяя доступу к MPU и видеоконтроллеру иметь окна по 40 нс каждый. Это может быть расширено до большего количества банков, чередующих больше пикселей, если это необходимо. Этот метод называется Interleaved Memory .
  2. Вы можете увеличить размер шины данных видеопамяти. Видеоконтроллер будет считывать несколько пикселей за один раз и использовать их последовательно. MPU либо будет иметь большую шину данных, каждый доступ будет направлен на соответствующий байт (или слово) и выбор байта будет использоваться в видеопамяти, либо для записи потребуется выполнить чтение-изменение-запись. к большему размеру данных. В вашем случае, вероятно, было бы проще всего увеличить шину данных видеопамяти до 16 или 32 бит (2 или 4 пикселя), а затем, возможно, использовать MPU с таким же размером шины.

Если вы чередуете доступ к видео, вы можете рассмотреть возможность использования FPGA или CPLD для вашего контроллера видеопамяти.


Другой метод состоит в том, чтобы иметь 2 отдельных видеопамяти и использовать выбор банка. MPU записывает данные в один банк, а другой используется видеоконтроллером для отображения. Когда MPU заканчивает запись, доступ к банку меняется местами (обычно во время синхроимпульса).