VHDL Data Types and Operators
VHDL is a strongly typed language. This means that you cannot perform operations between different types without explicit conversion. This rigor helps catch design errors early in the process.
The std_logic System
Defined in the IEEE.STD_LOGIC_1164 package, std_logic is the standard type for modeling digital signals. Unlike a simple bit (0 or 1), std_logic can have 9 different values, representing various hardware states:
‘U’: Uninitialized
‘X’: Forcing Unknown (Conflict)
‘0’: Forcing Low
‘1’: Forcing High
‘Z’: High Impedance (Tri-state)
‘W’: Weak Unknown
‘L’: Weak Low
‘H’: Weak High
‘-’: Don’t care
For synthesis, ‘0’, ‘1’, and ‘Z’ are the most critical.
Common Scalar Types
`std_logic`: A single wire/signal.
`boolean`: Can be true or false.
`integer`: A whole number. Standard integers are 32-bit.
`bit`: A single bit (0 or 1), but less flexible than std_logic.
Vector Types (Arrays)
`std_logic_vector`: An array of std_logic elements. Used for buses and registers.
signal data_bus : std_logic_vector(7 downto 0); -- 8-bit bus
`signed` / `unsigned`: Vectors used for arithmetic. Defined in IEEE.NUMERIC_STD.
signal count : unsigned(3 downto 0); -- 4-bit counter
Operators
VHDL provides a variety of operators:
Logical: and, or, nand, nor, xor, xnor, not.
Relational: =, /=, <, <=, >, >=.
Arithmetic: +, -, *, /, mod, rem. (Note: /, mod, rem are often not synthesizable for arbitrary values).
Shift: sll, srl, sla, sra, rol, ror.
Concatenation: & (Used to combine signals into a vector).
combined_sig <= bit_a & bit_b & bus_c;
Type Casting
Because of strong typing, you must often cast between types, especially when using numeric_std:
-- Convert unsigned to std_logic_vector
output_bus <= std_logic_vector(my_unsigned_sig);
-- Convert integer to unsigned
my_unsigned_sig <= to_unsigned(15, 4); -- Value 15, width 4
Next, we will look at Sequential Logic and the process statement.