Массивы и память Verilog
массив объявление сети или переменной может быть либо скалярным, либо векторным. Любое количество измерений может быть создано путем указания диапазона адресов после имени идентификатора и называется многомерным массивом. Массивы разрешены в Verilog для reg
, wire
, integer
и real
типы данных.
reg y1 [11:0]; // y is an scalar reg array of depth=12, each 1-bit wide
wire [0:7] y2 [3:0] // y is an 8-bit vector net with a depth of 4
reg [7:0] y3 [0:1][0:3]; // y is a 2D array rows=2,cols=4 each 8-bit wide
Индекс для каждого измерения должен быть указан для доступа к определенному элементу массива и может быть выражением других переменных. Массив может быть сформирован для любого из различных типов данных, поддерживаемых в Verilog.
Обратите внимание, что память n 1-битных регистров — это не то же самое, что n-битные векторные регистры.
Назначение
y1 = 0; // Illegal - All elements can't be assigned in a single go
y2[0] = 8'ha2; // Assign 0xa2 to index=0
y2[2] = 8'h1c; // Assign 0x1c to index=2
y3[1][2] = 8'hdd; // Assign 0xdd to rows=1 cols=2
y3[0][0] = 8'haa; // Assign 0xaa to rows=0 cols=0
Пример
Код, показанный ниже, просто показывает, как можно моделировать, назначать и получать доступ к различным массивам. mem1 — это 8-битный вектор, mem2 — это 8-битный массив с глубиной 4 (указывается диапазоном [0:3]), а mem3 — это 16-битный векторный двумерный массив с 4 строками и 2 столбцами. Этим переменным присваиваются разные значения и они печатаются.
module des ();
reg [7:0] mem1; // reg vector 8-bit wide
reg [7:0] mem2 [0:3]; // 8-bit wide vector array with depth=4
reg [15:0] mem3 [0:3][0:1]; // 16-bit wide vector 2D array with rows=4,cols=2
initial begin
int i;
mem1 = 8'ha9;
$display ("mem1 = 0x%0h", mem1);
mem2[0] = 8'haa;
mem2[1] = 8'hbb;
mem2[2] = 8'hcc;
mem2[3] = 8'hdd;
for(i = 0; i < 4; i = i+1) begin
$display("mem2[%0d] = 0x%0h", i, mem2[i]);
end
for(int i = 0; i < 4; i += 1) begin
for(int j = 0; j < 2; j += 1) begin
mem3[i][j] = i + j;
$display("mem3[%0d][%0d] = 0x%0h", i, j, mem3[i][j]);
end
end
end
endmodule
Журнал моделирования ncsim> run mem1 = 0xa9 mem2[0] = 0xaa mem2[1] = 0xbb mem2[2] = 0xcc mem2[3] = 0xdd mem3[0][0] = 0x0 mem3[0][1] = 0x1 mem3[1][0] = 0x1 mem3[1][1] = 0x2 mem3[2][0] = 0x2 mem3[2][1] = 0x3 mem3[3][0] = 0x3 mem3[3][1] = 0x4 ncsim: *W,RNQUIE: Simulation is complete.
Воспоминания
Память - это цифровые элементы хранения, которые помогают хранить данные и информацию в цифровых схемах. RAM и ROM являются хорошими примерами таких элементов памяти. Элементы хранилища можно моделировать с помощью одномерных массивов типа reg
. и называется памятью . Каждый элемент в памяти может представлять собой слово, и на него можно ссылаться с помощью одного индекса массива.
Зарегистрировать вектор
Векторы Verilog объявляются с использованием диапазона размеров в левой части имени переменной, и они реализуются во флопах, соответствующих размеру переменной. В коде, показанном ниже, модуль проектирования принимает часы, сброс и некоторые управляющие сигналы для чтения и записи в блок.
Он содержит 16-битный элемент хранения, называемый регистром, который просто обновляется во время записи и возвращает текущее значение во время чтения. Регистр записывается, когда sel и wr имеют высокий уровень на одном фронте тактового сигнала. Он возвращает текущие данные, когда sel имеет высокое значение, а wr низкое.
module des ( input clk,
input rstn,
input wr,
input sel,
input [15:0] wdata,
output [15:0] rdata);
reg [15:0] register;
always @ (posedge clk) begin
if (!rstn)
register <= 0;
else begin
if (sel & wr)
register <= wdata;
else
register <= register;
end
end
assign rdata = (sel & ~wr) ? register : 0;
endmodule
На аппаратной схеме показано, что 16-битный флоп обновляется, когда логика управления для записи активна, и текущее значение возвращается, когда логика управления настроена для чтения.
Массив
В этом примере регистр представляет собой массив из четырех ячеек, каждая из которых имеет ширину 16 бит. Модуль дизайна принимает дополнительный входной сигнал, который называется addr, для доступа к определенному индексу в массиве.
module des ( input clk,
input rstn,
input [1:0] addr,
input wr,
input sel,
input [15:0] wdata,
output [15:0] rdata);
reg [15:0] register [0:3];
integer i;
always @ (posedge clk) begin
if (!rstn) begin
for (i = 0; i < 4; i = i+1) begin
register[i] <= 0;
end
end else begin
if (sel & wr)
register[addr] <= wdata;
else
register[addr] <= register[addr];
end
end
assign rdata = (sel & ~wr) ? register[addr] : 0;
endmodule
На аппаратной схеме видно, что каждый индекс массива представляет собой 16-битный флоп, а входной адрес используется для доступа к определенному набору флопов.
Verilog
- С# Массивы
- Связь между массивами и указателями
- Массивы копирования Java
- Массивы в C++ | Объявить | Инициализировать | Указатель на примеры массивов
- C++ динамическое выделение массивов с примером
- Учебное пособие по массивам Java:объявление, создание, инициализация [пример]
- Учебник Verilog
- Конкатенация Verilog
- Verilog Inter и внутренняя задержка назначения
- MATLAB — Массивы