Menyederhana Kod VHDL: Jenis Data Std_Logic_Vector

Dark theme | Backstage at YouTube (Julai 2019).

$config[ads_text] not found
Anonim

Menyederhana Kod VHDL: Jenis Data Std_Logic_Vector


Artikel ini akan menyemak jenis data "std_logic_vector" yang merupakan salah satu jenis data yang paling biasa dalam VHDL.

Dalam artikel sebelumnya mengenai bahasa perincian perkakasan VHDL, kami membincangkan struktur asas kod VHDL melalui beberapa contoh pengenalan. Artikel ini akan meninjau salah satu jenis data yang paling biasa dalam VHDL, iaitu, jenis data "std_logic_vector".

Pertama kita akan membincangkan fakta bahawa vektor membolehkan kita mempunyai penerangan VHDL yang lebih padat dan boleh dibaca, terutamanya apabila berurusan dengan litar besar. Kemudian, setelah meninjau beberapa ciri penting jenis data "std_logic_vector", kami akan meninjau beberapa gaya pengkodan yang dapat membantu kami mengelakkan kesilapan apabila menggunakan vektor.

Mengapa Kami Memerlukan Jenis Data Vektor "/ / www.allaboutcircuits.com/technical-articles/hardware-description-langauge-getting-started-vhdl-digital-circuit-design/" target = "_ blank"> article.

Rajah 1. Litar digital mudah.

Berikut adalah kod VHDL untuk litar ini:

 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity circuit_1 is 4 Port ( a : in STD_LOGIC; 5 b : in STD_LOGIC; 6 out1 : out STD_LOGIC); 7 end circuit_1; ----------------------------------------------------- 8 architecture Behavioral of circuit_1 is 9 begin 10 out1 <= ( a and b ); 11 end Behavioral; 

Sekarang, ingatkan bahawa kita perlu menulis kod VHDL untuk litar dalam Rajah 2.

Rajah 2.

Kita boleh melanjutkan kod sebelumnya untuk mendapatkan gambaran VHDL Rajah 2 sebagai

 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity circuit_2 is 4 Port ( a0 : in STD_LOGIC; 5 a1 : in STD_LOGIC; 6 a2 : in STD_LOGIC; 7 b0 : in STD_LOGIC; 8 b1 : in STD_LOGIC; 9 b2 : in STD_LOGIC; 10 out0 : out STD_LOGIC; 11 out1 : out STD_LOGIC; 12 out2 : out STD_LOGIC); 13 end circuit_2; ----------------------------------------------------- 14 architecture Behavioral of circuit_2 is 15 begin 16 out0 <= ( a0 and b0 ); 17 out1 <= ( a1 and b1 ); 18 out2 <= ( a2 and b2 ); 19 end Behavioral; 

Kod di atas betul; Walau bagaimanapun, kita akan melihat bahawa mungkin untuk mempunyai keterangan VHDL yang lebih ringkas dan boleh dibaca untuk litar ini. Kelemahan kepada kod di atas adalah bahawa ia membentangkan setiap pelabuhan input / output sebagai isyarat individu dan tidak mewujudkan sebarang hubungan di antara mereka.

Mari kita pertimbangkan cara alternatif untuk menggambarkan litar dalam Rajah 2.

Rajah 3.

Rajah 3 menunjukkan bahawa kita boleh mempertimbangkan a0, a1, dan a2 sebagai port input tiga bit yang dipanggil, sebagai contoh, a_vec . Begitu juga, pelabuhan input b0, b1, dan b2 boleh dikumpulkan sebagai pelabuhan input tiga bit yang dipanggil b_vec . Apakah litar itu adalah DAN satu elemen a_vec dengan elemen yang sepadan dengan b_vec . Ini mungkin kelihatan seperti idea yang mudah, tetapi kita akan lihat dalam sekejap bagaimana cara pemikiran ini menjadikan kod tersebut lebih mudah dibaca.

Jenis Data "Std_Logic_Vector"

Untuk mewakili kumpulan isyarat, VHDL menggunakan jenis data vektor. Untuk mengakses elemen vektor, kita perlu menentukan indeks. Sebagai contoh, anggap bahawa, seperti yang ditunjukkan dalam Rajah 4, kita menggunakan vektor panjang tiga, a_vec, untuk mewakili tiga nilai: val_0, val_1, dan val_2 . Untuk mengakses nilai elemen dari vektor ini, kita boleh menggunakan nombor indeks. Sebagai contoh, a_vec (2) akan memberikan nilai elemen paling kanan vektor dalam Rajah 4, iaitu val_2 .

Rajah 4. vektor tiga elemen a_vec.

Kata kunci VHDL "std_logic_vector" mentakrifkan vektor unsur-unsur jenis std_logic. Sebagai contoh, std_logic_vector (0 hingga 2) mewakili vektor tiga-elemen jenis data std_logic, dengan julat indeks yang meluaskan dari 0 hingga 2.

Mari kita gunakan jenis data "std_logic_vector" untuk menerangkan litar dalam Rajah 3. Kita akan menggunakan tiga vektor a_vec, b_vec, dan out_vec untuk mewakili pelabuhan biru, merah dan hitam pada Rajah 3. Dengan penamaan baharu untuk pelabuhan, kami memperoleh angka berikut.

Rajah 5.

Kod VHDL bagi Rajah 5 diberikan di bawah.

 1 library ieee; 2 use ieee.std_logic_1164.all; 3 entity circuit_2 is 4 Port ( a_vec : in STD_LOGIC_VECTOR(0 to 2); 5 b_vec : in STD_LOGIC_VECTOR(0 to 2); 6 out_vec : out STD_LOGIC_VECTOR(0 to 2)); 7 end circuit_2; ----------------------------------------------------- 8 architecture Behavioral of circuit_2 is 9 begin 10 out_vec <= ( a_vec and b_vec ); 11 end Behavioral; 

Talian 4 hingga 6 kod ini menggunakan jenis data "std_logic_vector" untuk port input / output litar. Perhatikan bahawa operasi AND dalam baris 10 akan digunakan pada unsur-unsur yang bersamaan dari dua vektor a_vec dan b_vec, iaitu, a_vec (0) adalah ANDed dengan b_vec (0) dan keputusan ditugaskan untuk out_vec (0), dan seterusnya . Membandingkannya dengan kod sebelumnya, kita amati bahawa penggunaan jenis data "std_logic_vector" membolehkan kita mempunyai kod yang lebih padat dan boleh dibaca. Keuntungan ini menjadi sangat jelas apabila berurusan dengan litar besar; bayangkan betapa sukarnya kod itu jika kita menggunakan penyataan isyarat individu untuk DAN unsur-unsur dua vektor 32-bit.

Satu simulasi ISE kod di atas ditunjukkan dalam Rajah 6.

Rajah 6. ISE simulasi litar yang ditunjukkan dalam Rajah 5.

Mentafsirkan Data Std_Logic_Vector

Terdapat satu perkara penting yang memerlukan perhatian lanjut: Seperti yang ditunjukkan dalam contoh di atas, jenis data "std_logic_vector" adalah satu cara untuk mewakili kumpulan isyarat atau bas data. Ia hanya satu rentetan dan angka nol, dan tidak ada tafsiran lain untuk rentetan dan angka nol ini. Dengan kata lain, jika kita menetapkan "011" ke a_vec, ini tidak bermakna bahawa a_vec adalah sama dengan 3 (bersamaan perpuluhan "011").

Kita tidak boleh menganggap berat bagi kedudukan bit yang berlainan bagi isyarat "std_logic_vector". Walau bagaimanapun, kita boleh menggunakan fungsi penukaran jenis dan menaip pemutus untuk mentafsirkan rentetan dan angka pada isyarat "std_logic_vector" yang diberi sebagai nombor. Penukaran jenis akan dibincangkan dalam artikel masa depan.

Julat Indeks Menurun atau Menurun?

Setakat ini, kami telah menggunakan jenis data "std_logic_vector" apabila menentukan pelabuhan input / output. Begitu juga, kita boleh menentukan isyarat jenis "std_logic_vector". Sebagai contoh, pertimbangkan baris kod berikut:

 signal a: std_logic_vector(0 to 3); … a <= “0010” 

Di sini, baris pertama mentakrifkan sebagai isyarat jenis "std_logic_vector". Indeksnya berkisar antara 0 hingga 3. Kemudian, "0010" ditugaskan kepada a . Dengan tugasan ini, seperti yang ditunjukkan dalam Rajah 7, kita akan mempunyai (0) = 0, a (1) = 0, a (2) = 1, dan a (3) = 0 .

Rajah 7.

Gaya pengindeksan vektor ini, yang menggunakan kata kunci "ke", dipanggil menaik. Kita juga boleh menggunakan kata kunci "downto" (bukan "kepada") apabila kita mahu pelbagai indeks menurun:

 signal a: std_logic_vector(3 downto 0); … a <= “0010” 

Dalam kes ini, seperti yang ditunjukkan dalam Rajah 8, kita akan mempunyai (3) = 0, a (2) = 0, a (1) = 1, dan a (0) = 0 .

Rajah 8.

Pilihan antara pesanan menaik dan menurun sering menjadi persoalan keinginan pereka, walaupun ia mungkin ditangani oleh garis panduan pengekodan yang digunakan oleh organisasi tertentu. Perkara yang paling penting ialah memilih satu gaya dan kemudiannya mengikutinya secara konsisten; mencampurkan dua gaya yang berbeza dalam satu projek dengan mudah boleh membawa kepada masalah.

Sebagai contoh, pertimbangkan jadual kebenaran untuk encoder keutamaan 4-ke-2, seperti yang diberikan di bawah. Dengan encoder keutamaan, kita biasanya mempertimbangkan bit paling kiri vektor masukan untuk mempunyai keutamaan tertinggi. Sebagai contoh, dalam jadual kebenaran berikut, apabila bit input paling kiri, x (3), tinggi, kita tidak peduli dengan keadaan tiga bit masukan yang lain dan menegaskan output y dan v, iaitu y = " 11 " dan v = '1' .

Kami melihat bahawa jadual kebenaran ini mengandaikan vektor input x untuk mempunyai julat indeks menurun kerana elemen dengan indeks tertinggi diletakkan di kedudukan paling kiri. Sekarang, anggap bahawa walaupun memilih julat indeks menurun dalam jadual kebenaran, kita menggunakan julat indeks menaik apabila mengisytiharkan vektor input x dan menetapkan "0001" ke x . Dalam erti kata lain, kita mempunyai:

 signal x: std_logic_vector(0 to 3); … x <= “0001” 

Oleh kerana bit paling tinggi x adalah tinggi, memandangkan definisi umum untuk pengekodkan keutamaan, kami menjangkakan output y dan v menjadi "00" dan '1', masing-masing. Walau bagaimanapun, dengan kod di atas x (3) adalah tinggi dan, berdasarkan jadual kebenaran di atas, output akan menjadi y = "11" dan v = '1' . Untuk mengelakkan masalah sedemikian, kita perlu menggunakan julat indeks turun secara konsisten sepanjang kod.

Ringkasan

  • Jenis data "std_logic_vector" membolehkan kita mempunyai kod yang lebih kompak dan boleh dibaca. Jenis data ini memberikan kita cara untuk mewakili sekumpulan isyarat atau bas data.
  • Kita tidak boleh menganggap berat bagi kedudukan bit yang berlainan bagi isyarat "std_logic_vector". Walau bagaimanapun, kita boleh menggunakan fungsi penukaran jenis dan menaip pemutus untuk mentafsirkan rentetan dan angka pada isyarat "std_logic_vector" yang diberi sebagai nombor.
  • Julat indeks yang digunakan dalam deklarasi "std_logic_vector" boleh sama ada menaik atau menurun. Yang pertama menggunakan kata kunci "to", dan yang terakhir menggunakan kata kunci "downto".
  • Pilihan antara pesanan menaik dan menurun sering merupakan persoalan gaya, tetapi penting untuk menerapkan pilihan ini secara konsisten sepanjang satu projek tertentu.

Untuk melihat senarai lengkap artikel saya, sila lawati halaman ini.

Ciri-ciri imej yang disukai daripada Altera.