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: Menguasai Struktur Data Multi-Dimensi

Deklarasi array dari net atau variabel dapat berupa scalar atau vector. Banyak dimensi dapat dibuat dengan menentukan rentang alamat setelah nama pengidentifikasi dan disebut multi-dimensional array. Array diizinkan dalam Verilog untuk tipe data reg, wire, integer dan real.

  reg y1 [11:0]; // y adalah array scalar dengan kedalaman=12, masing-masing lebar 1-bit wire [0:7] y2 [3:0] // y adalah net vektor 8-bit dengan kedalaman 4 reg [7:0] y3 [0:1][0:3]; // y adalah array 2D baris=2,kolom=4 masing-masing lebar 8-bit  

Sebuah indeks untuk setiap dimensi harus ditentukan untuk mengakses elemen tertentu dari array dan dapat berupa ekspresi dari variabel lain. Array dapat dibentuk untuk salah satu dari tipe data yang berbeda yang didukung dalam Verilog.

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

Penugasan

  y1 = 0; // Ilegal - Semua elemen tidak dapat ditugaskan sekaligus y2[0] = 8'ha2; // Tetapkan 0xa2 ke indeks=0 y2[2] = 8'h1c; // Tetapkan 0x1c ke indeks=2 y3[1][2] = 8'hdd; // Tetapkan 0xdd ke baris=1 kolom=2 y3[0][0] = 8'haa; // Tetapkan 0xaa ke baris=0 kolom=0  

Contoh

Kode yang ditunjukkan di bawah ini hanya menunjukkan bagaimana berbagai array dapat dimodelkan, ditugaskan, 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-variabel ini ditugaskan nilai berbeda dan dicetak.

  module des (); reg [7:0] mem1; // reg vektor lebar 8-bit reg [7:0] mem2 [0:3]; // array vektor lebar 8-bit dengan kedalaman=4 reg [15:0] mem3 [0:3][0:1]; // array 2D vektor lebar 16-bit dengan baris=4,kolom=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  
Simulation Log
 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: Simulasi selesai. 

Memori

Memori adalah elemen penyimpanan digital yang membantu menyimpan data dan informasi dalam sirkuit digital. RAM dan ROM adalah contoh yang baik dari elemen memori semacam itu. Elemen penyimpanan dapat dimodelkan menggunakan array satu dimensi tipe reg dan disebut memori. Setiap elemen dalam memori mungkin mewakili kata dan direferensi menggunakan satu indeks array.

Register Vector

Vektor Verilog dideklarasikan menggunakan rentang ukuran di sisi kiri nama variabel dan ini direalisasikan menjadi flop yang cocok dengan ukuran variabel. Dalam kode yang ditunjukkan di bawah ini, modul desain menerima clock, 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 penulisan dan mengembalikan nilai saat ini selama pembacaan. 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 hardware menunjukkan bahwa flop 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 lebar 16-bit. Modul desain menerima sinyal input tambahan yang disebut addr untuk mengakses indeks tertentu dalam array.

  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 hardware bahwa setiap indeks array adalah flop 16-bit dan alamat input digunakan untuk mengakses sekelompok flop tertentu.


Verilog

  1. Menguasai Array C#: Deklarasi, Inisialisasi, dan Operasi
  2. Memahami Hubungan Antara Array dan Pointer dalam C
  3. Teknik Salin Array Java: Panduan Lengkap
  4. Array C++ Dibongkar: Deklarasi, Inisialisasi, dan Teknik Pointer
  5. Menguasai Alokasi Array Dinamis C++: Panduan Praktis dengan Contoh Kode
  6. Tutorial Array Java: Deklarasi, Pembuatan, dan Inisialisasi – Kode Contoh
  7. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  8. Menguasai Konkatenasi Verilog: Panduan Praktis
  9. Memahami Penundaan Antar- dan Intra-Penugasan dalam Verilog
  10. MATLAB: Menguasai Array Multidimensi dan Khusus