Menguasai Tipe Signed dan Unsigned dalam VHDL: Panduan Praktis
Dalam VHDL, signed dan unsigned adalah vektor bit khusus yang memungkinkan Anda melakukan aritmetika pada bus data. Tidak seperti std_logic_vector, yang ideal untuk merutekan sinyal tetapi tidak untuk perhitungan, tipe ini ditafsirkan sebagai nilai numerik oleh kompiler.
Mencoba menambahkan std_logic_vector akan memicu kesalahan kompilasi: No feasible entries for infix operator "+", karena alat tidak dapat menentukan cara memperlakukan pola bit mentah sebagai angka.
Bagian dari seri Tutorial VHDL Dasar.
Untuk mengaktifkan aritmetika, deklarasikan vektor sebagai signed atau unsigned:
signal <name> : signed(<N-1> downto 0) := <initial_value>; signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
Rentang dapat menggunakan to atau downto, tetapi downto 0 adalah yang paling umum. Nilai awal opsional; jika dihilangkan, semua bit default ke 'U'.
Mengapa memilih signed/unsigned daripada integer tradisional? Desainer digital sering membutuhkan kontrol yang tepat atas lebar bit. Tipe vektor ini membungkus pada overflow, sedangkan integer akan memicu kesalahan waktu eksekusi jika nilai melebihi batasnya. Selain itu, vektor dapat berisi metanilai seperti 'U' dan 'X', yang membantu mengungkap bug desain lebih awal.
Demonstrasi Video
Dalam video pendamping, kita menjelajahi bagaimana sinyal signed dan unsigned berperilaku serupa dan di mana mereka berbeda.
Kode Contoh
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T12_SignedUnsignedTb is end entity; architecture sim of T12_SignedUnsignedTb is signal UnsCnt : unsigned(7 downto 0) := (others => '0'); signal SigCnt : signed(7 downto 0) := (others => '0'); signal Uns4 : unsigned(3 downto 0) := "1000"; signal Sig4 : signed(3 downto 0) := "1000"; signal Uns8 : unsigned(7 downto 0) := (others => '0'); signal Sig8 : signed(7 downto 0) := (others => '0'); begin process is begin wait for 10 ns; -- Wrapping counter UnsCnt <= UnsCnt + 1; SigCnt <= SigCnt + 1; -- Adding signals Uns8 <= Uns8 + Uns4; Sig8 <= Sig8 + Sig4; end process; end architecture;
Analisis Gelombang
Gelombang ModelSim, diperbesar pada peristiwa kunci, menampilkan semua nilai dalam heksadesimal untuk keterangannya:
Dalam contoh penghitung, baik UnsCnt maupun SigCnt dimulai dari 0, bertambah hingga FF (desimal 255), lalu kembali ke 0—menunjukkan perilaku membungkus yang sama.
Sinyal 4-bit Uns4 dan Sig4 keduanya menahan nilai biner 1000, yang adalah desimal 8 untuk unsigned dan –8 untuk signed (two's complement).
Saat menambahkan bilangan 4-bit ini ke akumulasi 8-bit, perpanjangan tanda masuk ke dalam perhitungan. Bilangan unsigned diperlengkapi dengan nol, sedangkan bilangan signed diperlengkapi dengan bit tanda. Hasilnya adalah Uns8 bertambah 8, sedangkan Sig8 berkurang 8.
Memvisualisasikan proses perpanjangan tanda menjelaskan perbedaannya:
Hal Utama yang Perlu Diingat
Kedua signed dan unsigned adalah tipe vektor yang mendukung operasi aritmetika.
Overflow bersilang; nilai membungkus sesuai dengan lebar bit.
Perpanjangan tanda dapat menghasilkan hasil yang berbeda saat menambahan operand dengan panjang yang tidak sama.
Lanjutkan ke tutorial berikutnya untuk wawasan yang lebih dalam.