Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

Array dan Memori Verilog

Sebuah array deklarasi jaring atau variabel dapat berupa skalar atau vektor. Sejumlah dimensi dapat dibuat dengan menentukan rentang alamat setelah nama pengenal dan disebut array multi-dimensi. Array diperbolehkan di Verilog untuk reg , wire , integer dan real tipe data.

  
  
	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

  

Indeks untuk setiap dimensi harus ditentukan untuk mengakses elemen tertentu dari array dan dapat menjadi ekspresi dari variabel lain. Sebuah array dapat dibentuk untuk setiap tipe data berbeda yang didukung di Verilog.

Perhatikan bahwa memori n 1-bit reg tidak sama dengan n-bit vector reg.

Tugas

  
  
	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

  

Contoh

Kode yang ditunjukkan di bawah ini hanya menunjukkan bagaimana array yang berbeda dapat dimodelkan, ditetapkan dan diakses. mem1 adalah vektor 8-bit, mem2 adalah array 8-bit dengan kedalaman 4 (ditentukan oleh rentang [0:3]) dan mem3 adalah array 2D vektor 16-bit dengan 4 baris dan 2 kolom. Variabel ini diberi nilai yang berbeda dan dicetak.

  
  
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

  
Log Simulasi
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.

Kenangan

Memori adalah elemen penyimpanan digital yang membantu menyimpan data dan informasi dalam sirkuit digital. RAM dan ROM adalah contoh yang baik dari elemen memori tersebut. Elemen penyimpanan dapat dimodelkan menggunakan array satu dimensi dengan tipe reg dan disebut memori . Setiap elemen dalam memori dapat mewakili sebuah kata dan direferensikan menggunakan indeks array tunggal.

memory array in verilog

Daftar Vektor

Vektor Verilog dideklarasikan menggunakan rentang ukuran di sisi kiri nama variabel dan ini diwujudkan menjadi jepit yang sesuai dengan ukuran variabel. Dalam kode yang ditunjukkan di bawah ini, modul desain menerima jam, reset dan beberapa sinyal kontrol untuk membaca dan menulis ke dalam blok.

Ini berisi elemen penyimpanan 16-bit yang disebut register yang hanya diperbarui selama menulis dan mengembalikan nilai saat ini selama membaca. Register ditulis ketika sel dan wr tinggi pada tepi jam yang sama. Ini mengembalikan data saat ini ketika sel tinggi dan wr rendah.

  
  
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

  

Skema perangkat keras menunjukkan bahwa kegagalan 16-bit diperbarui ketika logika kontrol untuk penulisan aktif dan nilai saat ini dikembalikan ketika logika kontrol dikonfigurasi untuk pembacaan.

Array

Dalam contoh ini, register adalah array yang memiliki empat lokasi dengan masing-masing memiliki lebar 16-bit. Modul desain menerima sinyal input tambahan yang disebut addr untuk mengakses indeks tertentu dalam larik.

  
  
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

  

Dapat dilihat dalam skema perangkat keras bahwa setiap indeks array adalah kegagalan 16-bit dan alamat input digunakan untuk mengakses kumpulan kegagalan tertentu.


Verilog

  1. C# Array
  2. Hubungan Antara Array dan Pointer
  3. Java Salin Array
  4. Array di C++ | Nyatakan | Inisialisasi | Contoh Pointer ke Array
  5. C++ Alokasi Dinamis Array dengan Contoh
  6. Tutorial Java Array:Deklarasi, Buat, Inisialisasi [Contoh]
  7. Tutorial Verilog
  8. Rangkaian Verilog
  9. Penundaan Penugasan Inter dan Intra Verilog
  10. MATLAB - Array