Menguasai std_logic_vector: Membuat Sinyal Vektor dalam VHDL
Tipe std_logic_vector adalah standar VHDL untuk mendefinisikan bus sinyal. Sementara std_logic memodelkan keadaan satu kawat, std_logic_vector memperluasnya menjadi serangkaian kawat, memungkinkan representasi bus multi-bit.
Tidak seperti std_logic tunggal, std_logic_vector adalah tipe komposit—koleksi terindeks dari elemen std_logic. Ini dapat menahan sejumlah bit yang sama sekali, membuatnya ideal untuk menghubungkan komponen yang bertukar data multi-bit.
Postingan blog ini adalah bagian dari seri Tutorial VHDL Dasar.
Deklarasikan sinyal std_logic_vector dengan sintaks berikut: signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>; atau signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>; di mana <name> adalah pengenal yang dipilih pengguna dan <initial_value> opsional. <lsb> dan <msb> menunjukkan indeks bit paling tidak signifikan dan paling signifikan, masing-masing.
Kata kunci to atau downto menentukan arah rentang (yaitu, endianness). Keduanya bekerja, tetapi sebagian besar desainer memilih downto untuk kejelasan. Saya merekomendasikan penggunaan downto secara konsisten saat mendeklarasikan vektor bit untuk menghindari kebingungan.
Kode VHDL untuk vektor ukuran byte adalah:
signal MySlv : std_logic_vector(7 downto 0);
Kode VHDL untuk vektor satu bit adalah:
signal MySlv : std_logic_vector(0 downto 0);
Kode VHDL untuk rentang kosong (nol bit) adalah:
signal MySlv : std_logic_vector(-1 downto 0);
Latihan
Dalam tutorial video ini kita akan mempelajari cara mendeklarasikan sinyal std_logic_vector dan memberikan nilai awal kepada mereka. Kita juga mempelajari cara mengulangi bit dalam vektor menggunakan For-Loop untuk membuat shift register:
Kode akhir yang kita buat dalam tutorial ini:
library ieee; use ieee.std_logic_1164.all; entity T11_StdLogicVectorTb is end entity; architecture sim of T11_StdLogicVectorTb is signal Slv1 : std_logic_vector(7 downto 0); signal Slv2 : std_logic_vector(7 downto 0) := (others => '0'); signal Slv3 : std_logic_vector(7 downto 0) := (others => '1'); signal Slv4 : std_logic_vector(7 downto 0) := x"AA"; signal Slv5 : std_logic_vector(0 to 7) := "10101010"; signal Slv6 : std_logic_vector(7 downto 0) := "00000001"; begin -- Shift register process is begin wait for 10 ns; for i in Slv6'left downto Slv6'right + 1 loop Slv6(i) <= Slv6(i-1); end loop; Slv6(Slv6'right) <= Slv6(Slv6'left); end process; end architecture;
Jendela gelombang di ModelSim setelah menekan run, dan memperbesar timeline:
Analisis
Dalam latihan ini kita mendeklarasikan enam bus std_logic_vector, masing-masing delapan bit panjang (satu byte).
Sinyal Slv1 dideklarasikan tanpa nilai awal. Bus muncul sebagai XX dalam tangkapan layar gelombang karena tampilan heksadesimal tidak dapat mewakili nilai yang tidak diketahui. Penelitian yang lebih dekat menunjukkan bahwa bit individual sebenarnya adalah U.
Sinyal Slv2 menggunakan penugasan agregat (others => '0') untuk mengatur semua bit ke nol. Sintaks ringkas ini memastikan setiap elemen menerima nilai yang ditentukan terlepas dari lebar vektor.
Sinyal Slv3 menggunakan teknik agregat yang sama untuk menginisialisasi setiap bit ke satu, yang ditampilkan sebagai FF (heksadesimal untuk delapan 1).
Sinyal Slv4 menunjukkan inisialisasi heksadesimal: AA. Karena setiap digit heksadesimal memetakan ke empat bit, dua digit mencakup vektor 8-bit.
Sinyal Slv5 berisi nilai yang sama, tetapi diekspresikan dalam biner (10101010). Keduanya Slv4 dan Slv5 dirender sebagai AA dalam gelombang.
Sinyal Slv6 dimulai dengan semua nol kecuali bit paling tidak signifikan diatur ke 1. Sebuah proses mengimplementasikan register geser kiri yang mencycarkan 1 melalui vektor setiap 10 ns.
Proses memanfaatkan atribut left dan right untuk menjaga kode tetap generik; mengubah ukuran vektor tidak memerlukan perubahan kode.
Ada atribut tambahan, tetapi mereka di luar cakupan tutorial pengantar ini.
Kesimpulan
Vektor N-bit harus dideklarasikan menggunakan std_logic_vector(N-1 downto 0).
Vektor dapat ditugaskan sebagai keseluruhan atau bit individual dapat diakses.
Semua bit dapat dikosongkan dengan penugasan agregat (others => '0').
Menggunakan atribut seperti 'left dan 'right membuat kode generik dan dapat dipelihara.
Ikuti Kuis VHDL Dasar – bagian 2 » atau Lanjutkan ke tutorial berikutnya »