Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

Cara menggunakan Signed dan Unsigned di VHDL

Tipe yang ditandatangani dan tidak ditandatangani dalam VHDL adalah vektor bit, sama seperti tipe std_logic_vector. Perbedaannya adalah meskipun std_logic_vector sangat bagus untuk mengimplementasikan bus data, std_logic_vector tidak berguna untuk melakukan operasi aritmatika.

Jika Anda mencoba menambahkan nomor apa pun ke jenis std_logic_vector, ModelSim akan menghasilkan kesalahan kompilasi:Tidak ada entri yang layak untuk operator infix “+”. Ini karena kompiler tidak tahu bagaimana menafsirkan kumpulan bit yang merupakan vektor ini.

Pos blog ini adalah bagian dari seri Tutorial VHDL Dasar.

Kita harus mendeklarasikan vektor kita sebagai ditandatangani atau tidak ditandatangani agar kompilator memperlakukannya sebagai angka.

Sintaks untuk mendeklarasikan sinyal yang ditandatangani dan tidak ditandatangani adalah:
signal <name> : signed(<N-bits> downto 0) := <initial_value>;
signal <name> : unsigned(<N-bits> downto 0) := <initial_value>;

Sama seperti std_logic_vector, rentangnya bisa to atau downto rentang apapun. Tetapi mendeklarasikan sinyal dengan rentang selain downto 0 sangat jarang, sehingga menghabiskan lebih banyak waktu pada subjek hanya akan membingungkan kita. Nilai awal adalah opsional, secara default adalah 'U' untuk semua bit.

Kami telah menggunakan integer ketik untuk operasi aritmatika di tutorial sebelumnya. Jadi mengapa kita membutuhkan tipe yang ditandatangani dan tidak ditandatangani? Bagi sebagian besar, desainer digital ingin memiliki kontrol lebih besar terhadap jumlah bit yang sebenarnya digunakan oleh sinyal.

Selain itu, nilai yang ditandatangani dan tidak ditandatangani membungkus, sementara simulator akan memunculkan kesalahan run-time jika integer bertambah melampaui batas. Akhirnya, ditandatangani dan tidak ditandatangani dapat memiliki nilai lain seperti 'U' dan 'X' , sedangkan bilangan bulat hanya dapat memiliki nilai bilangan. Meta-nilai ini dapat membantu kami menemukan kesalahan dalam desain kami.

Olahraga

Dalam video ini kita mempelajari bagaimana sinyal yang ditandatangani dan tidak ditandatangani berperilaku sama, dan bagaimana mereka berperilaku berbeda:

Kode terakhir yang kita buat dalam tutorial ini:

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;

Jendela bentuk gelombang di ModelSim, memperbesar bagian yang menarik:

Analisis

Radix dari semua sinyal dalam bentuk gelombang disetel ke heksadesimal sehingga kita dapat membandingkannya secara merata.

Dalam contoh penghitung pembungkus, kita melihat bahwa sinyal yang ditandatangani dan tidak ditandatangani berperilaku dengan cara yang persis sama. Keduanya UnsCnt dan SigCnt mulai dari 0, dan bertambah satu per satu hingga FF. Hex FF (desimal 255) adalah nilai terbesar yang dapat dimiliki oleh sinyal 8-bit kami. Oleh karena itu, kenaikan berikutnya membungkus keduanya kembali ke 0.

Kami membuat dua sinyal 4-bit Uns4 dan Sig4 , dan memberi mereka berdua nilai awal "1000". Kita dapat melihat dari bentuk gelombang bahwa keduanya hanya hex 8 (biner 1000).

Dua sinyal 8-bit terakhir yang kami buat adalah Uns8 dan Sig8 . Kita dapat melihat dari bentuk gelombang bahwa nilai awalnya adalah 0, seperti yang diharapkan. Tapi dari sana, mereka berperilaku berbeda! Rupanya, jenis yang ditandatangani dan tidak ditandatangani membuat perbedaan saat menambahkan dua sinyal dengan panjang yang berbeda.

Ini karena sesuatu yang dikenal sebagai ekstensi tanda . Menambahkan bilangan positif atau negatif yang disimpan dalam vektor dengan panjang yang sama, adalah operasi yang sama dalam logika digital. Ini karena cara kerja komplemen dua. Jika vektor memiliki panjang yang berbeda, vektor terpendek harus diperpanjang.

Bilangan biner 4-bit bertanda “1000” adalah desimal 8, sedangkan bilangan 4-bit bertanda “1000” adalah desimal -8. Angka “1” di tempat paling kiri dari angka yang ditandatangani menunjukkan bahwa ini adalah angka negatif. Oleh karena itu, dua sinyal 4-bit diperpanjang tandanya secara berbeda oleh kompilator.

Ini adalah visualisasi bagaimana ekstensi tanda membuat nilai yang berbeda untuk Uns8 dan Sig8 sinyal:

Bawa Pulang

Pergi ke tutorial berikutnya »


VHDL

  1. Ditandatangani vs. Tidak Ditandatangani di VHDL
  2. Cara menggunakan Prosedur dalam Proses di VHDL
  3. Cara menggunakan Fungsi Tidak Murni di VHDL
  4. Cara menggunakan Fungsi di VHDL
  5. Cara menggunakan Prosedur di VHDL
  6. Cara menggunakan Konstanta dan Peta Generik di VHDL
  7. Cara menggunakan instantiasi Port Map di VHDL
  8. Cara memasang simulator dan editor VHDL secara gratis
  9. Mikrokontroler PIC18:Apa Itu dan Bagaimana Cara Menggunakannya
  10. Apa Itu Penanda Referensi Dan Bagaimana Kami Menggunakannya Dalam Perakitan?