Массивы
Часть раздела Основы путешествия по Verilog на Coddy — урок 10 из 90.
Массив позволяет хранить несколько значений в одной переменной. К каждому элементу массива можно обратиться по его индексу.
Примечание: Массив не является отдельным типом данных. Это коллекция типов wire, reg, integer или real.
Объявление массивов
Синтаксис: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256 байт памяти (каждый по 8 бит)
reg data [0:7]; // 8 однобитных регистров
wire [3:0] bus [0:3]; // 4 шины, каждая шириной 4 бита
integer counters [0:9]; // 10 целых чиселЧисло в скобках [ ] — это размер массива, а не разрядность.
Доступ к элементам массива
reg [7:0] memory [0:3];
memory[0] = 165; // Десятичное 165
memory[1] = 90; // Десятичное 90
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]); // Выводит: 255Массивы очень полезны в тестбенчах для хранения тестовых данных.
Многомерные массивы
Вы можете создавать массивы с несколькими измерениями:
reg [7:0] matrix [0:3][0:3]; // 4x4 массив 8-битных значений
matrix[0][0] = 255; // 8'hFF = 255 в десятичной системе
matrix[2][1] = 85; // 8'h55 = 85 в десятичной системеМассив против вектора
| Вектор | Массив | |
|---|---|---|
| Что это такое | Многобитный провод или регистр | Коллекция из нескольких значений |
| Синтаксис | [MSB:LSB] | [size] |
| Пример | reg [7:0] data; | reg [7:0] mem [0:255]; |
| Доступ | data[3] (бит 3) | mem[3] (элемент 3) |
Вектор — это одно значение с несколькими битами.
Массив — это несколько значений, каждое со своими собственными битами.
Важные примечания
- Массивы не являются синтезируемыми во многих инструментах при использовании больших размеров
- Массивы в основном используются в тестбенчах (testbenches)
- Для аппаратной памяти используйте специальные примитивы памяти
Задание
Дополните приведенный ниже код, чтобы создать массив, в котором хранятся 4 тестовых значения.
Что нужно сделать:
- Объявите массив с именем
test_data- Используйте тип данных
reg(поскольку он хранит значения в тестбенче) - Каждый элемент должен иметь ширину 8 бит (
[7:0]) - Массив должен содержать 4 элемента (
[0:3])
- Используйте тип данных
Шпаргалка
Массивы хранят несколько значений в одной переменной, доступ к которым осуществляется по индексу. Массив представляет собой коллекцию типов wire, reg, integer или real.
Синтаксис объявления: <data_type> <name> [<size>];
reg [7:0] memory [0:255]; // 256 элементов, каждый шириной 8 бит
wire [3:0] bus [0:3]; // 4 элемента, каждый шириной 4 бита
integer counters [0:9]; // 10 целых чиселДоступ к элементам:
memory[0] = 165;
memory[2] = memory[0] + memory[1];
$display("%d", memory[2]);Многомерные массивы:
reg [7:0] matrix [0:3][0:3]; // Массив 4x4 из 8-битных значений
matrix[0][0] = 255;Массив против вектора:
- Вектор — одно значение с несколькими битами:
reg [7:0] data;—data[3]обращается к биту 3 - Массив — несколько значений, каждое со своими битами:
reg [7:0] mem [0:255];—mem[3]обращается к элементу 3
Массивы в основном используются в тестбенчах; для аппаратной памяти используйте специальные примитивы памяти.
Попробуйте сами
module arrays;
// Объявите массив с именем test_data
// Он должен содержать 4 элемента, каждый шириной 8 бит
// Используйте тип данных reg (так как он хранит значения в тестбенче)
integer i;
initial begin
test_data[0] = 170;
test_data[1] = 240;
test_data[2] = 204;
test_data[3] = 15;
for (i = 0; i < 4; i = i + 1) begin
$display("test_data[%0d] = %b", i, test_data[i]);
end
$finish;
end
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