Видео в конце...
Сегодня рассмотрим один из важнейших вопросов разработки аппаратного обеспечения. Разговор будет о памяти с произвольным доступом. В такой памяти можно обратиться к произвольной ячейке при помощи специальной шины, задающей адрес ячейки памяти.
Устройство памяти
Основу памяти составляют двоичные слова и схема их выбора. Двоичное слово еще называют ячейкой памяти. По состоянию шины адреса происходит активация той или иной ячейки памяти и в зависимости от состояния линии разрешения можно считать или записать данные в ячейку.
Самый простой модуль памяти имеет шину данных. Для выборки нужной ячейки необходима шина адреса (A). При помощи линии разрешения записи (WE) можно произвести сохранение информации в память. Для общей синхронизации всех процессов в проекте необходим вход тактовых сигналов (CLK).
Поведенческий стиль описания позволит сэкономить массу времени и сделать меньше ошибок. Давайте посмотрим насколько это будет просто. Для удобства сделаем модуль памяти параметризированным. В качестве параметров выделим ширину адресной шины (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, где будет отображена цифра и семь линий для сегментов цифры. Сейчас не обращайте внимание на количество линий, это особенности изделия.
Вписываем в главный модуль созданный блок памяти и соединяем его с нужными шинами. Задаем позицию для числа, активируем и деактивируем компоненты на отладочном комплекте.
Осталось разобраться с одним небольшим, но очень важным моментом. Какие ресурсы ПЛИС использует модуль памяти. Смотрим отчет о синтезе и отмечаем, что задействовано 7 логических ячеек. При этом блочной памяти не задействовано нисколько. Это сейчас кажется, что не страшно и никакой проблемы в этом нет. Но это только пока проекты небольшие. А потом сложность наших проектов возрастет и будем работать на пределе ресурсов ПЛИС. Вот тогда какие ресурсы использованы будет очень важным. Стоит увеличить количество слов в памяти до нескольких килобайт, ресурсы ПЛИС растают прямо на глазах.
Использование ресурсов блочной памяти
Сейчас в описании памяти появилась новая линия cs. Она служит для ее активации. Если память не активирована, то на ее выходах появляются состояния высокого сопротивления, что будет означать физическое рассоединение с остальным проектом. Еще одна особенность. Это регистр для временного хранения содержимого ячейки памяти tmp_data.
Запись в память проходит как обычно, а вот чтение происходит во временный регистр tmp_data. Выход модуля связан не с ячейкой памяти, а с этим временным регистром, причем особым образом.
Это условное присвоение. Слева от вопросительного знака условие, которое может быть истинным или ложным, справа варианты при истинном и ложном значении условия. До двоеточия при истине, после при ложном значении. Все это означает, что на выход модуля пойдет содержимое вр+еменного регистра или на выходах появится высокоомное Z — состояние. Содержимое временного регистра отправится на выход только когда одновременно будет единица на линии активности модуля и ноль на линии записи.
Отчет о синтезе показывает, что теперь блочная память используется.
Так решил компилятор. Что же такое произошло, что данные поместились в совсем другой ресурс? Дополнительная линия активации модуля тут совершенно ни при чем. Это просто удобная штука, позволяющая многим устройствам быть подключенным к единой шине. Просто в один момент времени подключено что-то одно, а остальные устройства при этом в состоянии высокого сопротивления. Быть может это дополнительный временный регистр или разрядность шины данных? Строго говоря, при поведенческом стиле описания модулей единственной гарантией использования ресурсов блочной памяти является отчет о синтезе. Прямое управление ресурсами будет рассмотрено позже
Видео-обзор с канала YouTube
Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.