Signed and unsigned arithmetic lets you do math with numbers that can be positive or negative (signed) or only positive (unsigned). This helps your digital circuits handle numbers correctly.
signed and unsigned arithmetic in VHDL
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; signal a, b : signed(7 downto 0); signal c : unsigned(7 downto 0); signal result_signed : signed(7 downto 0); signal result_unsigned : unsigned(7 downto 0); -- Addition example: result_signed <= a + b; result_unsigned <= c + c;
Use signed type for numbers that can be negative.
Use unsigned type for numbers that are always zero or positive.
signal a : signed(3 downto 0) := "0110"; -- 6 in decimal signal b : signed(3 downto 0) := "1010"; -- -6 in decimal signal sum : signed(4 downto 0); sum <= a + b; -- result is 0
signal x : unsigned(3 downto 0) := "0101"; -- 5 in decimal signal y : unsigned(3 downto 0) := "0011"; -- 3 in decimal signal sum_unsigned : unsigned(4 downto 0); sum_unsigned <= x + y; -- result is 8
to_signed to assign negative and positive values, then adding them.signal a : signed(7 downto 0) := to_signed(-10, 8); signal b : signed(7 downto 0) := to_signed(20, 8); signal result : signed(7 downto 0); result <= a + b; -- result is 10
This program shows adding signed and unsigned numbers. It adds -15 and 10 as signed numbers, and 20 and 5 as unsigned numbers. Then it prints the results.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity signed_unsigned_example is end entity; architecture behavior of signed_unsigned_example is signal a : signed(7 downto 0) := to_signed(-15, 8); signal b : signed(7 downto 0) := to_signed(10, 8); signal c : unsigned(7 downto 0) := to_unsigned(20, 8); signal result_signed : signed(7 downto 0); signal result_unsigned : unsigned(7 downto 0); begin process begin result_signed <= a + b; -- -15 + 10 = -5 result_unsigned <= c + to_unsigned(5, 8); -- 20 + 5 = 25 wait for 10 ns; report "Signed result: " & integer'image(to_integer(result_signed)); report "Unsigned result: " & integer'image(to_integer(result_unsigned)); wait; end process; end architecture;
Always use ieee.numeric_std library for signed and unsigned types.
Mixing signed and unsigned types directly can cause errors; convert explicitly if needed.
Remember that signed numbers use two's complement representation internally.
Signed arithmetic handles positive and negative numbers.
Unsigned arithmetic handles only zero and positive numbers.
Use signed and unsigned types from numeric_std for correct math in VHDL.
Practice
Solution
Step 1: Understand number representation types
Signed types allow representation of both positive and negative numbers, unlike unsigned which only represent zero and positive numbers.Step 2: Identify correct VHDL type for negatives
In VHDL, thesignedtype fromnumeric_stdis used for signed arithmetic, supporting negative values.Final Answer:
signed -> Option BQuick Check:
Negative numbers need signed type [OK]
- Using unsigned for negative numbers
- Using std_logic_vector without conversion
- Confusing bit_vector with numeric types
Solution
Step 1: Identify the correct type for unsigned 4-bit signal
Theunsignedtype fromnumeric_stdis used for unsigned arithmetic and must have 4 bits indexed from 3 downto 0.Step 2: Check each option
signal data : signed(3 downto 0); uses signed type, which is for signed numbers. signal data : std_logic_vector(4 downto 0); has 5 bits (4 downto 0). signal data : bit_vector(3 downto 0); uses bit_vector, which is not numeric.Final Answer:
signal data : unsigned(3 downto 0); -> Option DQuick Check:
Unsigned 4-bit signal uses unsigned(3 downto 0) [OK]
- Using signed instead of unsigned
- Incorrect bit range (off by one)
- Using std_logic_vector without conversion
result after execution?signal a : signed(3 downto 0) := "1101"; -- -3 in decimal signal b : unsigned(3 downto 0) := "0011"; -- 3 in decimal signal result : signed(4 downto 0); result <= a + signed(resize(b, 5));
Solution
Step 1: Convert signals to decimal
ais signed "1101" which is -3 in decimal.bis unsigned "0011" which is 3 in decimal.Step 2: Resize and add values
bis resized to 5 bits and converted to signed, so 3 remains 3. Adding -3 + 3 = 0.Final Answer:
0 -> Option AQuick Check:
-3 + 3 = 0 [OK]
- Adding signed and unsigned directly without conversion
- Misinterpreting binary signed values
- Ignoring resize causing wrong bit width
signal x : signed(3 downto 0) := "0110"; signal y : unsigned(3 downto 0) := "0011"; signal z : signed(3 downto 0); z <= x + y;
Solution
Step 1: Check types in addition
In VHDL, you cannot add a signed and an unsigned type directly without converting one to the other's type.Step 2: Identify missing conversion
The code addssignedxandunsignedydirectly, which causes a type mismatch error.Final Answer:
Cannot add signed and unsigned directly without conversion -> Option AQuick Check:
Signed + unsigned needs conversion [OK]
- Adding signed and unsigned without conversion
- Assuming std_logic_vector works for arithmetic
- Ignoring type mismatch errors
b from a signed 5-bit number a in VHDL. Which is the correct way to perform this operation and store the result in a signed 6-bit signal result?Solution
Step 1: Understand type and size requirements
To subtract unsignedbfrom signeda, both must be the same type and size. The result signal is 6 bits signed.Step 2: Convert and resize operands properly
Resizeato 6 bits signed, convert and resizebto signed 6 bits, then subtract.Final Answer:
result <= resize(a, 6) - signed(resize(b, 6)); -> Option CQuick Check:
Resize and convert unsigned to signed before subtracting [OK]
- Subtracting without resizing operands
- Not converting unsigned to signed before subtraction
- Assigning result to smaller bit width
Ready to prove it?
Pass the test and this pattern moves unknown
