Menu
Coddy logo textTech

Массивы

Часть раздела Основы путешествия по 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)
  • Для аппаратной памяти используйте специальные примитивы памяти
challenge icon

Задание

Дополните приведенный ниже код, чтобы создать массив, в котором хранятся 4 тестовых значения.

Что нужно сделать: 

  1. Объявите массив с именем test_data
    1. Используйте тип данных reg (поскольку он хранит значения в тестбенче)
    2. Каждый элемент должен иметь ширину 8 бит ([7:0])
    3. Массив должен содержать 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы