Векторы
Часть раздела Основы путешествия по Verilog на Coddy — урок 9 из 90.
Вектор — это многобитный wire или reg. Вместо single bit векторы позволяют работать с шинами data. Это коллекция bits, сгруппированных вместе.
Примечание: Вектор — это не отдельный тип данных. Это просто многобитная версия wire или reg.
wire single; // Одиночный бит
wire [7:0] bus; // 8-битный вектор (биты с 7 по 0)Чтобы объявить vector, используется синтаксис [MSB:LSB], где MSB — это старший bit, а LSB — младший.
wire [3:0] a; // 4-битный wire вектор
reg [7:0] data; // 8-битный reg вектор
wire [15:0] addr; // 16-битный wire векторДоступ к bits
Когда вы обращаетесь к отдельным bits или срезам vector, вы используете десятичные числа для позиций bit (индексов) и binary значения (0 или 1) для присваиваний.
Это связано с тем, что позиция bit — это местоположение (как адрес), которое естественно выражается десятичным числом, в то время как значение, хранящееся в этом bit, может быть только 0 или 1 — это binary выбор.
Например, data[0] означает «бит номер ноль», а = 1 означает «установить его в высокий уровень». Присвоение десятичного числа, такого как 75, одиночному биту не сохраняет 75 — Verilog незаметно оставляет только его младший бит — поэтому всегда пишите 0 или 1 явно.
reg [7:0] data;
data = 170;
data[0] = 1; // Установить LSB в 1
data[7] = 0; // Установить MSB в 0
data[3:1] = 3'b101; // Set bits 3,2,1 to 101 (binary remains)Порядок битов
Порядок битов имеет значение:
wire [3:0] a; // a[3] — MSB, a[0] — LSB
wire [0:3] b; // b[0] — MSB, b[3] — LSB (менее распространено)[MSB:LSB] с MSB слева.Присваивание значений
reg [3:0] a;
a = 10;
a = 5;
a = 3; Срезы векторов
Вы можете обращаться к диапазону битов:
reg [15:0] word;
word[15:8] = 255; // Присвоить старший байт (8'hFF = 255)
word[7:0] = 0; // Присвоить младший байт (8'h00 = 0)
word[3:1] = 3'b101; // Assign a slice Задание
Для module ниже требуются объявления vector.
Что нужно сделать:
- Измените каждый input и output, чтобы они стали 8-bit vector.
Попробуйте сами
module vector_example(
input a, // Изменить на 8-битный вектор [7:0]
input b, // Изменить на 8-битный вектор [7:0]
output c // Изменить на 8-битный вектор [7:0]
);
assign c = a & b;
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial