Программируем SSRAM на ПЛИС

Наконец решил и я вбросить свои 5 копеек в развитие столь интересной, но узко представленной здесь темы – программирование ПЛИС и периферии. В частности в этой статье я кратко опишу работу, довольно простого, но столь важного типа памяти как SSRAM и продемонстрирую свой простерший пример её контроля выполненного с среде Quartus II с использованием языка Verilog HDL.


Что такое SSRAM

SSRAM – синхронная статическая память произвольного доступа. В общих чертах это означает, что можно обращаться к данным расположенным в произвольной ячейке памяти, память – энергозависима (отключение питание приведет к потере всех данных), все операции производятся по положительному перепаду тактирующего сигнала.
Этот тип памяти очень быстродействующий, доступ к любой ячейке происходит с одинаковой скоростью, просто организован и его гораздо легче описать, чем DRAM. Но, конечно же, и минусы у неё есть: сложность устройства ячейки (6 элементов, в то время как в DRAM — 2), вследствие этого – маленькая плотность записи, высокое энергопотребление и высокая цена.
Если же говорить, про использование SSRAM – то лучший пример – это процессорный кэш.

Вместо вступления

Я использую отладочную плату Terasic DE2-70, в основе которой лежит кристалл Cyclone II. Вы, вправе использовать любую другую плис, просто изменив пины в проекте.
На приведенной рисунке показано изображение платы, расположение её основных элементов.

загрузить фото,загрузить картинку

В нашем распоряжении 2 Мб памяти, организованных как 512К х 36 bits.
Общее описание данной микросхемы памяти можно посмотреть в приведенном, в конце статьи, даташите, как и подробное описание функционирования. Я не буду на этом останавливаться.

От слов к делу

Для лучшего понимания стоит начать с описания готового устройства.
Органы управления:
1. 1 группа переключателей. Отвечает за установку адреса. 4 бита т.е. имеем 16 адресов.
Это младшие разряды адресной шины, остальные не меняются и установлены в “0”.
2. 2 группа переключателей. Отвечает за установку записываемого значения. Опять же 4 бита – 16 различных значений. Используется 1 младший разряд из каждой 8 разрядной шины данных, остальные игнорируются при чтении. Это сделано для большей показательности работы системы, и для более простого перехода к работе с большими значениями в дальнейшем.
3. Кнопка записи. При нажатии производится запись заданного значения в память по заданному адресу.
4. Переключатель вкл/выкл LCD дисплея.
5. Кнопка принудительного обновления дисплея. На всякий случай.

Дисплей разделен на 3 участка: адрес, находящееся по данному адресу значение и записываемое значение.
выложить фото
Наш чип памяти имеет двустороннюю шину данных, т.е. он использует одну и ту же шину как для записи, так и для чтения. Выполнен он следующим образом. Управляющий сигнал wr2 формируется в контроллере и отвечает за переключение направленности шины.

выложить фото

Теперь рассмотрим непосредственно сам контроллер

загрузить фото,загрузить картинку

Входной сигнал Clock подключается к кварцевому генератору, установленному на плате – 50МГц. Выходной сигнал out передается на дисплей.
Выходные сигналы c A по GW_n передаются непосредственно на микросхему памяти.
Я не буду вдаваться в описание работы кода, он довольно прост и желающие могут ознакомиться с ним взяв исходники, приведенные в конце статьи. Вместо этого рассмотрим поведение сигналов во времени.

хостинг изображений

При нажатии кнопки сигнал wr переключается в “0”. После этого мы видим последовательное изменение состояний управляющих сигналов: команда захвата адреса в регистр микросхемы, запись данных в память по данному адресу, снова команда захвата адреса и наконец, команда чтения по данному адресу. После этого контроллер остается в последнем состоянии. После этого, при изменении адреса, происходит его захват в регистр памяти и чтение. Наряду с эти контроллер формирует сигнал wr2, который равен “0” в момент команды записи и устанавливает направление двусторонней шины данных памяти на запись.
Команды записи и чтения одиночные, т.е. после команды захвата адреса внутренний контроллер микросхемы памяти воспримет только первую команду чтения, остальные же просто будет игнорировать. В виду этого допустимо использовать команду чтения в качестве пассивного состояния контроллера.
Записываемые и читаемые данные, а также адрес непрерывно передаются на контроллер LCD дисплея. Но это уже тема для отдельной статьи.

В завершение

Необходимо заметить, что приведенная схема, только простейший пример. Данная микросхема также поддерживает режим пакетной записи/чтения, возможность записи одной или нескольких 8-разрядных шин, не затрагивая при этом остальные, уже хранящиеся в памяти, имеет разные возможности реализации команд.

Конечно, это простой, с огрехами выполненный проект начинающего разработчика, с помощью которого я знакомился с основами работы с памятью. Но, надеюсь, он вызовет интерес публики, а может и даст кому-нибудь толчок начать изучать данное направление.

rghost.ru/20959811 — даташит отладочной платы
rghost.ru/20960231 — даташит микросхемы памяти
rghost.ru/20960351 — проект
  • +8
  • 11,3k
  • 3
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 3

    +1
    Читая первую половину текста, был уверен, что вы эмулируете память на FPGA. Только картинка внесла ясность. Как-то мутно написано…
      0
      1. Если пишете «с использованием языка Verilog HDL», так хоть бы привели здесь кусок кода контроллера с неким описанием «что здесь происходит».
      2. Блочный ввод уже давно архаичность — все можно написать на верилоге в 2 файлах (топ и ваш модуль) + пины.
      3. Зачем внешняя SRAM? Если хотели проиллюстрировать работу с памятью написали бы код работы с внутренним SRAM по двум портам (На Верилоге его можно инферить (7 строк кода), а не вставлять как модуль). Тогда бы и через SignalTap показали, что в результате в памяти сохранилось по результатам просто цикла.
      4. Внутренний симмулятор квартуса хорош на первых порах. Попробуйте использовать настоящие симуляторы (ModelSim и тп), особенно, с учетом того, что в последних версиях квартуса его убрали полностью.
        0
        Благодарю за конструктивную критику. Обязательно учту в следующий раз.
        У меня как раз сейчас тот этап, который и называется «на первых порах».
        Блочный ввод — архаизм. Да, я уже пришел к подобному выводу. В нынешнем моём проекте — только HDL.
        С симулятором не испытывал, честно говоря, проблем. Наверное неопытность сказывается.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое