Найти тему
IT. Как это работает?

RAM память в языке Verilog

Оглавление

Видео в конце...

Сегодня рассмотрим один из важнейших вопросов разработки аппаратного обеспечения. Разговор будет о памяти с произвольным доступом. В такой памяти можно обратиться к произвольной ячейке при помощи специальной шины, задающей адрес ячейки памяти.

Устройство памяти

Основу памяти составляют двоичные слова и схема их выбора. Двоичное слово еще называют ячейкой памяти. По состоянию шины адреса происходит активация той или иной ячейки памяти и в зависимости от состояния линии разрешения можно считать или записать данные в ячейку.

Устройство строки памяти
Устройство строки памяти

Самый простой модуль памяти имеет шину данных. Для выборки нужной ячейки необходима шина адреса (A). При помощи линии разрешения записи (WE) можно произвести сохранение информации в память. Для общей синхронизации всех процессов в проекте необходим вход тактовых сигналов (CLK).

Устройство RAM память
Устройство RAM память

Поведенческий стиль описания позволит сэкономить массу времени и сделать меньше ошибок. Давайте посмотрим насколько это будет просто. Для удобства сделаем модуль памяти параметризированным. В качестве параметров выделим ширину адресной шины (ADDR_WIDTH ). Пусть в ней будут 4 линии. Также будет удобным определить ширину шины данных (DATA_WIDTH) . И так называемую глубину (DEPTH). Глубина это количество ячеек памяти. Разумеется, между количеством линий адресной шины и глубиной есть связь, но давайте для простоты и наглядности не будем городить функции. Количество ячеек 16.

С параметрами закончили. Описываем входы и выходы. Обязателен вход для тактовых сигналов. Шина адреса. Шина данных на входе и выходе. Линия разрешения записи.

Самый важный момент во всем модуле это описание хранилища данных.

reg [DATA_WIDTH-1:0] mem [DEPTH-1:0];

Эта запись означает массив регистров. Количество бит в регистре слева от его имени. Количество элементов массива справа. Количество лучше всего задавать через диапазон, как мы это делали с шинами. Компилятор среды разработки может и пропустить обыкновенное число, но среда моделирования потребовала исправить.

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

Выход модуля памяти data_o соединен с ячейкой, адрес которой выставлен на шине адреса mem[addr]. Посмотрим как работает этот модуль. Сразу создадим тестовый стенд.

Моделирование памяти

Посмотрим временные диаграммы. Все работает как нужно.

Временные диаграммы при моделировании памяти
Временные диаграммы при моделировании памяти

Довольно часто в проектах приходится хранить двоичные слова как некоторые константы. Для таких случаев применяют упрощенную конструкцию памяти. Поскольку запись в такую память не предусмотрена, то удаляется все что с этим связано. Это линия разрешения записи и даже сам тактовый сигнал не нужен. Остается адрес на входе и двоичное слово на выходе. При начальной установке описывается содержимое ячеек памяти.

При помощи этого содержимого можно преобразовать двоичное число в код, предназначенный для семисегментного индикатора.

Устройство семисегментного индикатора
Устройство семисегментного индикатора

Он состоит из полупроводниковых материалов, способных светиться при подаче напряжения между катодом и анодом. Строго говоря, принцип свечения может быть различным. Отдельными сегментами можно отображать арабские цифры, что гораздо удобнее для восприятия пользователем. Сегменты нумеруются сверху по часовой стрелке от A до центральной перекладины G.

Создаем проект с использованием памяти

Создадим модуль, использующий память. В нем позволим пользователю вводить двоичный код числа, а на индикаторе будет отображаться его привычный вид. Четыре бита под код bin, одна линия для активации индикатора на отладочном комплекте seg_select , одна для деактивации матрицы индикаторов matrix_select , три бита под код позиции position, где будет отображена цифра и семь линий для сегментов цифры. Сейчас не обращайте внимание на количество линий, это особенности изделия.
Вписываем в главный модуль созданный блок памяти и соединяем его с нужными шинами. Задаем позицию для числа, активируем и деактивируем компоненты на отладочном комплекте.

-6

Осталось разобраться с одним небольшим, но очень важным моментом. Какие ресурсы ПЛИС использует модуль памяти. Смотрим отчет о синтезе и отмечаем, что задействовано 7 логических ячеек. При этом блочной памяти не задействовано нисколько. Это сейчас кажется, что не страшно и никакой проблемы в этом нет. Но это только пока проекты небольшие. А потом сложность наших проектов возрастет и будем работать на пределе ресурсов ПЛИС. Вот тогда какие ресурсы использованы будет очень важным. Стоит увеличить количество слов в памяти до нескольких килобайт, ресурсы ПЛИС растают прямо на глазах.

Использование ресурсов блочной памяти

Сейчас в описании памяти появилась новая линия cs. Она служит для ее активации. Если память не активирована, то на ее выходах появляются состояния высокого сопротивления, что будет означать физическое рассоединение с остальным проектом. Еще одна особенность. Это регистр для временного хранения содержимого ячейки памяти tmp_data.

Запись в память проходит как обычно, а вот чтение происходит во временный регистр tmp_data. Выход модуля связан не с ячейкой памяти, а с этим временным регистром, причем особым образом.

Это условное присвоение. Слева от вопросительного знака условие, которое может быть истинным или ложным, справа варианты при истинном и ложном значении условия. До двоеточия при истине, после при ложном значении. Все это означает, что на выход модуля пойдет содержимое вр+еменного регистра или на выходах появится высокоомное Z — состояние. Содержимое временного регистра отправится на выход только когда одновременно будет единица на линии активности модуля и ноль на линии записи.

Отчет о синтезе показывает, что теперь блочная память используется.

-7

Так решил компилятор. Что же такое произошло, что данные поместились в совсем другой ресурс? Дополнительная линия активации модуля тут совершенно ни при чем. Это просто удобная штука, позволяющая многим устройствам быть подключенным к единой шине. Просто в один момент времени подключено что-то одно, а остальные устройства при этом в состоянии высокого сопротивления. Быть может это дополнительный временный регистр или разрядность шины данных? Строго говоря, при поведенческом стиле описания модулей единственной гарантией использования ресурсов блочной памяти является отчет о синтезе. Прямое управление ресурсами будет рассмотрено позже

Видео-обзор с канала YouTube

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.