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

Menguasai Tipe Signed vs. Unsigned dalam VHDL: Wawasan Praktis

Desainer digital bergantung pada aritmatika yang tepat di dalam FPGA dan ASIC. Konsep inti adalah perbedaan antara tipe data signed dan unsigned dalam VHDL.

Kedua tipe didefinisikan dalam paket numeric_std dari perpustakaan IEEE. Sementara banyak desainer masih menggunakan std_logic_arith, paket ini bukan standar IEEE dan tidak direkomendasikan untuk desain produksi.

Dalam VHDL, sinyal signed ditafsirkan sebagai bilangan two’s-complement, yang memungkinkan nilai positif dan negatif. Sinyal unsigned mewakili hanya nilai non-negatif. Secara internal, FPGA selalu menggunakan two’s-complement untuk semua bit-vector, terlepas dari tipe yang Anda deklarasikan.

BitsNilai UnsignedNilai Signed
01133
01022
00111
00000
1117-1
1106-2
1015-3
1004-4

Pada pandangan pertama pemetaan ini mungkin terlihat kontraintuitif, tetapi setelah Anda memahami two’s-complement, perilaku dapat diprediksi.

Penting untuk dicatat bahwa hasil biner dari operasi aritmatika identik terlepas dari apakah operand dideklarasikan signed atau unsigned. Yang berubah adalah interpretasi hasilnya.

Misalnya, menambahkan dua vektor 5-bit:

 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end signed_unsigned; architecture behave of signed_unsigned is signal rs_SUM_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUM_RESULT : unsigned(4 downto 0) := (others => '0'); signal rs_SUB_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUB_RESULT : unsigned(4 downto 0) := (others => '0'); begin p_SUM : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUM_RESULT <= (others => '0'); ru_SUM_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUM_RESULT <= unsigned(i_a) + unsigned(i_b); rs_SUM_RESULT <= signed(i_a) + signed(i_b); end if; end process p_SUM; p_SUB : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUB_RESULT <= (others => '0'); ru_SUB_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUB_RESULT <= unsigned(i_a) - unsigned(i_b); rs_SUB_RESULT <= signed(i_a) - signed(i_b); end if; end process p_SUB; end behave; 

Testbench

 library ieee; use ieee.std_logic_1164.all; entity example_signed_unsigned_tb is end example_signed_unsigned_tb; architecture behave of example_signed_unsigned_tb is signal r_CLK : std_logic := '0'; signal r_RST_L : std_logic := '0'; signal r_A : natural := 0; signal r_B : natural := 0; signal r_A_SLV : std_logic_vector(4 downto 0) := (others => '0'); signal r_B_SLV : std_logic_vector(4 downto 0) := (others => '0'); constant c_CLK_PERIOD : time := 10 ns; component example_signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end component example_signed_unsigned; begin i_DUT: example_signed_unsigned port map ( i_rst_l => r_RST_L, i_clk => r_CLK, i_a => r_A_SLV, i_b => r_B_SLV ); clk_gen : process is begin r_CLK <= '0' after c_CLK_PERIOD/2, '1' after c_CLK_PERIOD; wait for c_CLK_PERIOD; end process clk_gen; process begin r_RST_L <= '0'; wait for 20 ns; r_RST_L <= '1'; wait for 20 ns; r_A_SLV <= "01001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00010"; wait for 20 ns; r_A_SLV <= "11111"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "00000"; r_B_SLV <= "00001"; wait for 20 ns; wait; end process; end behave; 
Menguasai Tipe Signed vs. Unsigned dalam VHDL: Wawasan Praktis

Modelsim simulation wave – Hex values

Menguasai Tipe Signed vs. Unsigned dalam VHDL: Wawasan Praktis

Modelsim simulation wave – Decimal values

Dua tangkapan layar menunjukkan bahwa hasil biner yang mendasari identik terlepas dari tipe. Perbedaan hanya muncul ketika simulator menampilkan nilai: dalam hex pola bit yang sama muncul, sementara hasil signed dalam desimal mungkin tampak negatif. Penanganan tipe yang hati-hati esensial saat merancang logika FPGA.

Jika bagian dari topik ini masih kurang jelas, silakan email kami melalui tautan kontak di sidebar. Kami senang membantu Anda menguasai aritmatika signed dan unsigned.

Halaman Nandland yang Paling Populer

VHDL

  1. Pengantar VHDL: Membuat AND Gate Pertama Anda
  2. Panduan Lengkap Konversi Tipe VHDL dengan Numeric_Std dan Std_Logic_Arith
  3. Contoh Prosedur VHDL: Meningkatkan Vektor Logika Standar
  4. Memanfaatkan Rekaman VHDL untuk Antarmuka FIFO Bersih dan Reusable
  5. Variabel VHDL Dijelaskan: Contoh Praktis & Aturan untuk Desain Terpercaya
  6. Sistem Sinyal Arus: Penjelasan Loop 4-20 mA
  7. Lampu Lalu Lintas: Rekayasa, Sejarah, dan Inovasi Masa Depan
  8. Lokasi LoRa: Mengapa Geolokasi Asli Lebih Kompleks Dari Tampilannya
  9. Membuat Daftar String dalam VHDL: Praktik Terbaik & Contoh
  10. Memastikan Integritas Sinyal dalam Desain PCB Kecepatan Tinggi