HyperRAM: использование микросхемы с интерфейсом памяти HyperBus
Продолжаем знакомить читателей Хабра с «нестандартными» типами памяти для разработки электроники. В прошлый раз мы рассказывали о гибридном кубе памяти (HMC) и его подключении к FPGA, а в этой статье сфокусируемся на микросхемах памяти с интерфейсом HyperBus от Cypress, которые появились на рынке относительно недавно, в 2014 году.
Сейчас доступно две разновидности устройств: HyperRAM и HyperFLASH. HyperRAM — это псевдо-статическая память (DRAM + схема перезаряда в одном чипе), а HyperFLASH — это NOR-флэш-память с интерфейсом HyperBUS. Также доступны комбинированные чипы 2 в 1: HyperFLASH 512Mb + HyperRAM 64Mb. Ценность современных решений заключается в малом числе сигналов, мелком футпринте, достаточно большой скорости работы и адекватной цене.
Например, вот как компания Cypress (основной продвиженец HyperBUS) видит следующее поколение этих чипов памяти в автомобильной электронике в главе со своим контроллером:
То есть Cypress предлагает всю внешнюю память заменять одним чипом. И в целом это предложение не безосновательное, особенно для проектов с жесткими требования к размерам плат.
Несмотря на ряд преимуществ по сравнению с SRAM, DRAM и обычными FLASH, широкого внедрения HyperBUS решений пока не произошло, так как еще недавно — прошлом году — такие устройства поддерживались только одним микроконтроллером от Cypress (ну и FPGA, конечно). Сейчас дело движется вперед и всё больше микроконтроллеров обеспечивает его поддержку.
Две недели назад, 5 декабря 2017 года, компания Cypress анонсировала включение интерфейса памяти HyperBus в стандарт xSPI (eXpanded SPI), разработку которого координирует JEDEC, комитет инженерной стандартизации полупроводниковой продукции. Стандарт xSPI определяет требования к совместимости высокопроизводительных последовательных интерфейсов, чтобы производители контроллеров и чипсетов могли разрабатывать универсальный контроллер памяти. Включение интерфейса HyperBus в стандарт JEDEC xSPI должно упростить проектирование памяти на основе HyperBus и обеспечить большую гибкость в реализации функций мгновенного включения (insant on) при разработке электроники для автомобилей, промавтоматики и интернета вещей (IoT).
Микросхемы с интерфейсом памяти HyperBus очень перспективные, и мы спешим поделиться опытом их применения в одном из наших проектов.
Описание задачи
Прежде чем переходить к рассказу об интерфейсе поясним, в какой задаче он был применен. В очередной разработке мы должны были обеспечить вывод данных на внешнее устройство с минимальной латентностью и достаточно большой пропускной способностью. При этом места на плате не то чтобы нет, его совсем нет. На платку размером со спичечный коробок требовалось уместить процессор с Линуксом на борту, плюс соответствующую обвязку, USB-контроллер, ПЛИС, который собственно обращается к памяти и выдает данные наружу, и еще кое-какую специфическую начинку. Естественно, все компоненты проходили жесткий отбор.
В результате выбор микросхемы памяти пал на HyperRAM. Параметры: количество сигналов для подключения к FPGA — 12; максимальная латентность — 36 нс; пропускная способность — 333 MБ/с; объем — 8 МБ; корпус —6×8x1.2 mm TF-BGA.
Для сравнения: SRAM аналогичного объема потребует 35 линий, а SDRAM — и того больше. При этом SRAM будет стоить на порядок больше, чем HyperRAM, а SDRAM потребует титанических усилий трассировщика и приведет к существенному удорожанию печатной платы.
Требование к минимизации латентности не позволяло воспользоваться высокоуровневыми IP-модулями сторонних разработчиков (типа AVALON<->HyperBus с конвейеризацией и шедулингом). В итоге наша задача сводилась к разработке специализированного IP-модуля для работы с HyperRAM.
Разработка модуля проводилась на отладочной плате HyperMAX от devboards. Плата содержит два интересных устройства: HyperRAM и HyperFLASH от ISSI. Помимо этого плата напичкана разными плюшками, ориентированными на применение в автомобильной электронике.
Cтоит отметить, что имеющиеся на рынке IP-модули поддерживают работу с HyperBUS по интерфейсам AXI4 и AVALON, а также декларируют возможность исполнения программ софтварных процессоров непосредственно с HyperFLASH [например, www.cypress.com/documentation/software-and-drivers/hyperbus-master-interface-controller-ip-intellectual-property].
Дальше опишем работу с микросхемой HyperRAM. Взаимодействие с HyperFLASH организовано аналогичным образом, но с некоторыми упрощениями.
Память HyperRAM
Микросхема HyperRAM — это высокоскоростная DRAM-CMOS-память, работающая по интерфейсу HyperBUS со встроенным механизмом перезарядки. Схема перезаряда работает, когда не осуществляется операций чтения/записи. В результате с точки зрения хоста, память выглядит статической и называется псевдо-статической памятью (PSRAM).
HyperBus — это DDR-интерфейс, который позволяет добиться высокой скорости чтения/записи при использовании малого числа сигналов. Данные передаются по 8-битной шине 16-битными словами за один такт. Все линии LV-CMOS-совместимы. Устройства выпускаются двух модификациях напряжения питания: 1,8 В и 3,0 В.
Согласно спецификации, интерфейс HyperBUS содержит обязательные и опциональные сигналы.
Основные сигналы интерфейса HyperBUS
В нашем случае использовались только обязательные (см. рисунок выше):
- CS# — сигнал выбора устройства. Наличие сигнала выбора микросхемы позволяет объединять несколько устройств одной шиной с архитектурой мастер-слэйв.
- CK/CK# — синхросигнал. Устройства питаемые напряжением 3 В синхронизируются по одной линии CK на частотах не более 100 МГц, с питанием 1,8 В — дифференциальной парой CK/CK# на частотах до 166 МГц.
- DQ[7:0] — двунаправленная шина данных.
- RWDS — многофункциональный двунаправленный сигнал (Read Write Data Strobe).
Сигнал RWDS выполняет следующие функции:
- В начале транзакции драйвится памятью и указывает на требуемую латентность перед выдачей/запись данных: 0 — однократная задержка; 1 — двукратная задержка (initial read/write latency).
- В транзакциях записи в процессе выдачи данных драйвится хостом и маскирует байты, которые не должны быть изменены.
- В транзакциях чтения в процессе выдачи данных драйвится памятью и синхронизирует данные (source syncronous read data strobe).
О латентности и синхронизации будет сказано ниже.
Обмен данными с устройством происходит в виде транзакций: мастер ассертит чип-селект, подает синхросигнал, выдает управляющие байты, ожидает несколько тактов, обменивается данными, останавливает синхронизацию, деассертит чип-селект.
В первых трех тактах хост передает 6 управляющих байт транзакции (COMMAND-ADRESS или CA). Не вдаваясь в подробности, просто перечислим параметры:
- Тип транзакции: чтение или запись.
- Адресное пространство: память или управляющие регистры.
- Тип последовательности записи/чтения: линейная (linear) или пакетная (burst).
- Адрес начала обращения к памяти в столбцах и строках.
Поскольку ячейки памяти не могут быть перезаряжены в ходе транзакции обмена данными, накладываются ограничения на длительность одной транзакции (transaction duration) и задержки между ними (initial latency).
Одновременно с передачей CA память выставляет на линии RWDS индикатор латентности: сколько тактов нужно выждать, прежде чем выдать данные на запись, или получить данные на чтение. О значении количества тактов узнаем из управляющего регистра. Это значение определяется памятью самостоятельно в зависимости от частоты тактирования. Если RWDS в »0» ожидаем требуемое количество тактов один раз, если в »1» — два раза. Настройками регистров устройства можно установить, чтобы память всегда работала по двойному интервалу задержки, и задать количество тактов отличное от значения по умолчанию (но это значение не должно быть меньше исходного).
В транзакции записи после ожидания необходимого числа тактов хост выставляет на шину записываемые данные:
Транзакция записи
Данные захватываются памятью по обоим фронтам синхросигнала, соответственно выставление данных в выходной DDR-регистр происходит по клоку, сдвинутому на 270 градусов. Сигнал RWDS в процессе передачи данных маскирует байты, которые не должны изменяться памятью в процессе записи. При записи слова в управляющие регистры его необходимо выдавать сразу после СА без какой либо задержки.
В транзакции чтения данные выставляются памятью:
Транзакция чтения
Изменение данных на шине синхронизируются обоими фронтами сигнала RWDS. Также следует не забывать, что выдаваемые памятью данные синхронизированы сигналом RWDS по фронту. В результате, для корректного чтения следует сдвигать RWDS на 90 градусов:
Задержка сигнала RWDS относительно сигнала данных
Запись/чтение данных начинается с адреса, указанного в CA. Адрес с каждым принятым/выданным словом инкрементируется на 2. Транзакция завершается после останова синхросигнала и деассерта чип-селекта.
Отметим несколько особенностей работы. Первое: при переходе адреса через максимальное значение, данные начинают выдаваться/записываться неопределенным образом. Поэтому не стоит обращаться к памяти транзакциями, которые переполняют счетчик адреса. Второе: микросхема ограничивает длительность транзакции, поскольку требуется периодическая перезарядка элементов памяти. Максимальные длительности зависят от температуры и приведены в спецификации. В самом жестком случае за одну транзакцию на скорости 166МГц можно прочитать/записать чуть более 300 байт.
Устройство имеет два регистра: информационный и конфигурационный. Информационный регистр дает нам информацию о производителе и типе устройства (HyperRAM/HyperFLASH), количестве строк, столбцов и кристаллов устройства. Конфигурационный регистр позволяет конфигурировать выходной импеданс, длину пакета в режиме пакетного обращения к данным, тип латентности (постоянная/переменная), а также позволяет задать значение задержки и перевести устройство в режим низкого энергопотребления (Deep Power Down).
С первого взгляда может возникнуть вопрос:, а как мне прочитать значение конфигурационного регистра с информацией о задержке, если эта задержка на момент чтения неизвестна? Для этого необходимо принять во внимание, что выдача данных синхронизируется памятью по линии RWDS. И, по сути, фактическое значение задержки нигде не учитывается, так как схема захвата данных — source-synchronous. А в транзакции записи, напротив, мы должны считать такты перед выдачей данных в зависимости от значения латентности и состояния сигнала RWDS.
Вот пример разбора значений конфигурационных регистров:
Выводы
В целом, память с интерфейсом HyperBUS оставила только приятные впечатления. На FPGA работа с ней ведется достаточно просто и разработанный модуль совсем не ресурсоемкий. Единственный на текущий момент недостаток — это ограниченный круг микроконтроллеров с HyperBUS. Так что будем ждать поддержки интерфейса большим количеством вендоров и однозначно внедрять его в наших (и в ваших :-) будущих проектах.