Saya membangun penghitung mod-16, dan hasil keluarannya adalah INTEGER (semua contoh yang saya lihat menggunakan INTEGER).
Saya membuat dekoder hex-to-7-segment-display, dan inputnya adalah STD_LOGIC_VECTOR (tulis seperti itu karena mudah untuk memetakan tabel kebenaran).
Saya ingin menghubungkan output dari penghitung ke input decoder, tapi saya mendapatkan kesalahan 'ketik ketidakcocokan' ketika mencoba mengkompilasi di QuartusII.
Apakah ada cara untuk mengkonversi dari tipe INTEGER ke tipe STD_LOGIC_VECTOR dalam daftar VHDL?
Katakanlah penghitung 4-bit Anda memiliki output INTEGER SOME_INTEGER, dan Anda ingin mengubahnya menjadi STD_LOGIC_VECTOR 4-bit
Anda juga dapat menggunakan ini untuk menginisialisasi vektor dengan angka yang bermakna
Saya pikir Anda mungkin perlu menambahkan "gunakan IEEE.STD_LOGIC_ARITH.ALL;" dan / atau STD_LOGIC_UNSIGNED.
Operasi pelengkap adalah conv_integer (vektor). Saya suka menggunakan ini ketika saya melakukan perbandingan. Jadi saya mungkin menyatakan
Dan kemudian, nanti, saya bisa menggunakan ini dalam pernyataan if
EDIT: Anda tidak perlu mendeklarasikan variabel sebagai Integer. Coba ubah deklarasi menjadi std_logic_vector sebagai gantinya. Operator + dan - bekerja pada std_logic_vectors.
sumber
Anda mungkin tertarik menggunakan jenis
unsigned
dansigned
dariieee.numeric_std
. Mereka kompatibel denganstd_logic_vector
, tetapi memiliki interpretasi numerik (biner atau 2-komplemen). Ada juga opsi untuk menempatkan interpretasi seperti itustd_logic_vector
, tetapi ini tidak dianjurkan .sumber
Seperti jawaban utama mengatakan, metode yang disarankan adalah sebagai berikut:
Namun, saya ingin menguraikan tentang mengapa ini direkomendasikan, dan mengapa VHDL memiliki cara yang tampaknya berbelit-belit untuk mengubah bilangan bulat menjadi std_logic_vectors.
Turun ke bagaimana jenis ini dilihat oleh alat.
Standard_logic_vector secara harfiah adalah sekelompok 1s atau 0s. Saya punya 10001. Nomor apa ini? Yah, itu tergantung. Apakah ditandatangani atau tidak ditandatangani? SLV tidak tahu atau tidak peduli. Berapa banyak bit? Nah, berapa lama SLV Anda?
Integer ditandatangani, dan biasanya 32 bit (jika saya ingat dengan benar).
Tahap 1: Buat bilangan bulat saya lebih pendek, dan tidak ditandatangani. Itu bagian ini:
Tahap 2: Lalu, ambil bit-bit itu dan gunakan untuk menggerakkan my_slv.
(Catatan tentang terminologi.
A <= B
Dalam VHDL dibaca keras-keras karena "A digerakkan oleh B")Gabungan, ini membuat Anda:
Ketika datang dari latar belakang pemrograman tradisional, sangat mudah terjebak dalam cara berpikir pemrograman. Tetapi dalam VHDL kode yang Anda tulis memiliki implikasi fisik dalam perangkat keras. Mengetahui mengapa metode ini bekerja dan direkomendasikan adalah satu langkah lebih dekat untuk memikirkan apa yang Anda tulis dalam istilah perangkat keras.
Kiat bonus: fungsi yang diawali oleh to_ adalah fungsi yang mempersingkat / mengubah operan. Mereka membuat mereka tanpa tanda tangan atau panjang tertentu atau keduanya. Inilah sebabnya mengapa to_unsigned mengharuskan Anda menentukan panjangnya. Fungsi tanpa to_ (std_logic_vector lurus (...) dalam contoh ini) digunakan ketika jenis sudah langsung kompatibel. "Ambil bit-bit ini dan masukkan mereka dalam tipe ini, tidak perlu modifikasi". Ini tidak memiliki argumen panjang karena kedua belah pihak sudah sama. Jadi ketika membangun hal-hal seperti ini, saya tidak perlu mencarinya, saya hanya berpikir tentang bagaimana saya mengubah data.
sumber
Untuk mengonversi integer ke std_logic_vector Anda memiliki beberapa opsi. Menggunakan numeric_std:
atau
Menggunakan std_logic_arith:
std_logic_arith bukan merupakan standar ieee, tetapi sebagian besar alat mengkompilasinya ke perpustakaan IEEE dan banyak digunakan.
sumber