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