Освоение std_logic_vector: создание сигнальных векторов в VHDL
Тип std_logic_vector — это стандарт VHDL для определения сигнальных шин. В то время как std_logic моделирует состояние одного провода, std_logic_vector расширяет это до массива проводов, позволяя представлять многобитные шины.
В отличие от однобитового std_logic, std_logic_vector — это составной тип — индексированная коллекция элементов std_logic. Он может содержать произвольное количество бит, делая его идеальным для соединения компонентов, обменивающихся многобитными данными.
Эта статья является частью серии базовых уроков VHDL.
Объявите сигнал std_logic_vector со следующим синтаксисом:signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
илиsignal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
где <name> — выбранный пользователем идентификатор, а <initial_value> опционален. <lsb> и <msb> обозначают индексы наименее и наиболее значимых бит соответственно.
Ключевое слово to или downto указывает направление диапазона (т.е. эндианность). Обе формы работают, но большинство дизайнеров предпочитают downto для ясности. Я рекомендую последовательно использовать downto при объявлении битовых векторов, чтобы избежать путаницы.
VHDL-код для байтового вектора:
signal MySlv : std_logic_vector(7 downto 0);
VHDL-код для одно-битового вектора:
signal MySlv : std_logic_vector(0 downto 0);
VHDL-код для пустого диапазона (ноль бит):
signal MySlv : std_logic_vector(-1 downto 0);
Упражнение
В этом видео-уроке мы научимся объявлять сигналы std_logic_vector и давать им начальные значения. Мы также научимся итерироваться по битам вектора с помощью For-Loop для создания сдвигового регистра:
Итоговый код, который мы создали в этом уроке:
library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Shift register process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture;
Окно волновой формы в ModelSim после нажатия run и увеличения временной шкалы:
Анализ
В этом упражнении мы объявили шесть шин std_logic_vector, каждая длиной восемь бит (один байт).
Сигнал Slv1 был объявлен без начального значения. Шина появляется как XX на скриншоте волновой формы, потому что шестнадцатеричный дисплей не может представить неизвестные значения. Ближе взгляд показывает, что отдельные биты на самом деле U.
Сигнал Slv2 использует агрегатное присваивание (others => '0') для установки всех бит в ноль. Этот лаконичный синтаксис гарантирует, что каждый элемент получает указанное значение независимо от ширины вектора.
Сигнал Slv3 использует ту же агрегатную технику для инициализации каждого бита в единицу, что отображается как FF (hex для восьми единиц).
Сигнал Slv4 демонстрирует шестнадцатеричный инициализатор: AA. Поскольку каждая шестнадцатеричная цифра отображается на четыре бита, две цифры покрывают 8-битный вектор.
Сигнал Slv5 содержит идентичное значение, но выраженное в двоичном виде (10101010). Оба Slv4 и Slv5 отображаются как AA на волновой форме.
Сигнал Slv6 начинается со всеми нулями, кроме наименее значимого бита, установленного в 1. Процесс реализует левый сдвиговый регистр, который циклически перемещает 1 через вектор каждые 10 нс.
Процесс использует атрибуты 'left и 'right для сохранения кода общего; изменение размера вектора не требует изменений кода.
Существуют дополнительные атрибуты, но они выходят за рамки этого вводного урока.
Выводы
- N-битные векторы должны быть объявлены с использованием
std_logic_vector(N-1 downto 0). - Вектор может быть назначен целиком или к отдельным битам можно обращаться по индексу.
- Все биты могут быть обнулены агрегатным присваиванием
(others => '0'). - Использование атрибутов вроде
'leftи'rightделает код общим и поддерживаемым.
Пройдите базовый тест VHDL — часть 2 »
или
Переходите к следующему уроку »
VHDL
- Полное руководство по преобразованию типов в VHDL с Numeric_Std и Std_Logic_Arith
- Освоение знаковых и беззнаковых типов в VHDL: практические инсайты
- Создание списков строк в VHDL: лучшие практики и пример
- Создание Tcl-управляемого тестбенча для VHDL-модуля кодового замка
- Корректное завершение симуляции VHDL-тестбенча
- Реализация PWM-контроллера в VHDL: проектирование, симуляция и FPGA-демо
- Генерация случайных чисел в VHDL: от Uniform к OSVVM
- Проектирование надежного кольцевого буфера FIFO на VHDL в блочной ОЗУ
- Как создать самопроверяющийся тестбенч в VHDL — практическое руководство
- Реализация динамического связного списка в VHDL с защищенными типами и указателями доступа