Vectors
Часть раздела Основы путешествия по Verilog на Coddy. Урок 9 из 90.
vector — это многобитный провод или reg. Вместо одного бита vector позволяет работать с bus данных. Это набор битов, сгруппированных вместе.
Примечание: vector — это не отдельный тип данных. Это просто многобитная версия 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Доступ к битам
При обращении к отдельным битам или срезам vector вы используете десятичные числа для позиций битов (индексов) и двоичные значения (0 или 1) для присваиваний.
Это связано с тем, что позиция bit — это местоположение (например, адрес), которое естественно выражать десятичным числом, тогда как значение, хранящееся в этом bit, может быть только 0 или 1: бинарный выбор.
Например, data[0] означает «bit номер ноль», а = 1 означает «установить его в высокий уровень». Присваивание десятичного числа, например 75, одному bit не сохраняет 75: Verilog молча оставляет только его младший bit, поэтому всегда явно записывай 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 Задание
Модулю ниже нужны объявления vector.
Что нужно сделать:
- Измените каждый input и output на 8-битовые 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Введение
Что такое VerilogАппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog