Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Verilog

Массивы и память 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

  1. С# Массивы
  2. Связь между массивами и указателями
  3. Массивы копирования Java
  4. Массивы в C++ | Объявить | Инициализировать | Указатель на примеры массивов
  5. C++ динамическое выделение массивов с примером
  6. Учебное пособие по массивам Java:объявление, создание, инициализация [пример]
  7. Учебник Verilog
  8. Конкатенация Verilog
  9. Verilog Inter и внутренняя задержка назначения
  10. MATLAB — Массивы