VHDL Cheatsheet
VHDL Cheatsheet
must be of the type, or subtypes of the same base type. Operators include the following: std_logic_vector : array (natural range <>) of std_logic
VHDL Standard Packages
Logical: and , or , nand , nor , xor , not (for boolean or bit ops) Examples
To make TEXTIO visible: use std.textio.all;
Relational: = , /= , < , <= , > , >=
Arithmetic: + , - , * , / , mod , rem , ** (exponential), abs signal dbus: bit_vector(15 downto 0);
IEEE Standard 1164 Package Concatenate: &
dbus (7 downto 4) <= "0000"; (4-bit slice of dbus)
signal cnt: std_ulogic_vector(1 to 3);
This package contained in the ieee library supports multi-valued logic signals with type variable message: string(0 to 20);
Examples
declarations and functions. To make visible:
Example
VHDL IDENTIFIERS, NUMBERS, STRINGS, AND VHDL DATA TYPES
EXPRESSIONS type opcodes is (add, sub, jump, call);
signal instruc : opcodes;
-- Type with 4 values
-- Signal of this type
Each VHDL objects must be classified as being of a specific data type. VHDL includes a
number of predefined data types, and allows users to define custom data types as ...
Identifiers needed.
if instruc = add then -- test for value 'add'
Identifiers in VHDL must begin with a letter, and may comprise any combination of letters, ...
digits, and underscores. Note that VHDL internally converts all characters to UPPER CASE . Predefined Scalar Data Types (single objects)
Examples small delta delay from the current time. The signal change will occur in the next Concurrent statements are included within architecture definitions and within block
simulation cycle. statements, representing concurrent behavior within the modelled design unit. These
constant Vcc : signal := '1'; -- logic 1 constant statements are executed in an asynchronous manner, with no defined order, modeling the
constant zero4 : bit_vector(0 to 3) := ('0','0','0','0'); Examples behavior of independent hardware elements within a system.
(Assume current time is T)
Variables Concurrent Signal Assignment
clock <= not clock after 10ns; -- change at T + 10ns
A variable is declared within a blocks, process, procedure, or function, and is updated databus <= mem1 and mem2 after delay; -- change at T + delay A signal assignment statement represents a process that assigns values to signals. It has
immediately when an assignment statement is executed. A variable can be of any scalar or x <= '1'; -- change to '1' at time T + "delta"; three basic formats.
aggregate data type, and is utilized primarily in behavioral descriptions. It can optionally be
Element delay models may be specified as either inertial or transport. Inertial delay is the 1.
assigned initial values (done only once prior to simulation). The declaration syntax is:
default, and should be used in most cases.
A <= B;
Examples
Inertial delay: The addition to an event queue of an event scheduled at time T
process automatically cancels any events in the queue scheduled to occur prior to time T, 2.
variable count : integer := 0; i.e. any event shorter than the delay time is suppressed.
variable rega : bit_vector(7 downto 0); A <= B when <condition1> else
Transport delay: Each new event is simply inserted into the event queue,
begin C when <condition2> else
... i.e. behavior is that of a delay line. The keyword transport is used to indicate
D when <condition3> else E;
count := 7; -- assign values to variables transport delays.
rega := x"01";
... 3.
end;
Examples
with <expression> select A <=
B <= A after 5ns; -- inertial delay
B when choice1,
Signals C <= transport A after 5 ns; -- transport delay
C when choice2,
5______15 17_________30
D when choice3,
A _______| |_| |_____________
A signal is an object with a history of values (related to event times, i.e. times at which the E when others;
____________________
signal value changes). B ___________| |_________ (Inertial Delay)
_______ __________ For each of the above, waveforms (time-value pairs) can also be specified.
Signals are declared via signal declaration statements or entity port definitions, and may C ___________| |_| |_________ (Transport Delay)
be of any data type. The declaration syntax is: 10 20 22 35
Examples
Examples Where there are multiple drivers for one signal, a resolution function must be provided to
determine the value to be assigned to the signal from the values supplied by the multiple
signal clock : bit; drivers. This allows simulation of buses with multiple sources/drivers.
signal GND : bit := '0';
signal databus : std_ulogic_vector(15 downto 0); NOTE: The std_logic and std_logic_vector types from the ieee library have
signal addrbus : std_logic_vector(0 to 31);
predefined resolution functions:
Each signal has one or more drivers which determine the value and timing of changes to
Example
the signal. Each driver is a queue of events which indicate when and to what value a signal
is to be changed. Each signal assignment results in the corresponding event queue being signal data_line: std_logic;
modified to schedule the new event. begin
block1:
signal line x data_line <= '1'; -- one driver
...
block2:
10ns 0 Driver of
data_line <= 'Z'; -- 2nd driver
A <= B after 10ns when condition1 else
statement in the process. Syntax
C after 12ns when condition2 else
D after 11ns; assert (clear /= '1') or (preset /= '1')
Concurrent Procedure Call
report "Both preset and clear are set!"
-- 4-input multiplexer (Choice is a 2-bit vector) severity warning;
An externally defined procedure/subroutine can be invoked, with parameters passed to it
with Choice select Out <=
In0 after 2ns when "00", as necessary. This serves the same function and behaves in the same manner as a
In1 after 2ns when "01", process statement, with any signals in the passed parameters forming a sensitivity list. Generate statement
In2 after 2ns when "10",
In3 after 2ns when "11";
Example A generate statement is an iterative or conditional elaboration of a portion of a description.
-- 2-to-4 decoder (Y = 4-bit and A = 2-bit vectors) This provides a compact way to represent what would ordinarily be a group of statements.
Y <= "0001" after 2ns when A = "00" else ReadMemory (DataIn, DataOut, RW, Clk); -- (where the ReadMemory procedure is defined elsewhere
"0010" after 2ns when A = "01" else Example
"0100" after 2ns when A = "10" else
"1000" after 2ns;
Component instantiation Generate a 4-bit full adder from 1-bit full_adder stages:
Syntax Sequential statements are used to define algorithms to express the behavior of a design
The port list may be in either of two formats: entity. These statements appear in process statements and in subprograms (procedures
label: process (sensitivity list) and functions).
(1) Positional association: signals are connected to ports in the order listed in the
<local declarations>
begin component declaration.
<sequential statements> Example: A1: adder port map (v,w,x,y,z) (v,w, and y must be of type
Wait statement
end process label;
bit_vector , y and z of type bit ) Suspends process/subprogram execution until a signal changes, a condition becomes
(2) Named association: each signal-to-port connection is listed explicitly as true, or a defined time period has elapsed. Combinations of these can also be used.
Example signal => port .
Syntax
DFF: process (clock) Example
begin
if clock = '1' then wait [on <signal> {, <signal>}]
Q <= D after 5ns; A1: adder port map(a => v, b => w, s => y, cin => x, cout => z); [until condition]
QN <= not D after 5ns; [for time expression]
end if;
(The signal ordering is not important in this format)
end process DFF;
Example
The sequential statements in the process are executed in order, commencing with the Concurrent assertion Suspend execution until one of the two conditions becomes true, or for 25ns , whichever
beginning of simulation. After the last statement of a process has been executed, the occurs first.
A concurrent assertion statement checks a condition (occurrence of an event) and issues
process is repeated from the first statement, and continues to repeat until suspended. If
a report if the condition is not true. This can be used to check for timing violations, illegal
the optional sensitivity list is given, a wait on ... statement is inserted after the last wait until clock = '1' or enable /= '1' for 25ns;
conditions, etc. An optional severity level can be reported to indicate the nature of the
sequential statement, causing the process to be suspended at that point until there is an
detected condition.
event on one of the signals in the list, at which time processing resumes with the first
Signal assignment statement
Assign a waveform to one signal driver (edit the event queue). <label>: while <condition> loop -- Convert bit_vector to IEEE std_logic_vector format
<sequence of statements> -- (attributes LENGTH and RANGE are described below)
Example end loop <label>; function bv2slv (b : bit_vector) return std_logic_vector is
variable result : std_logic_vector(b'LENGTH-1 downto 0);
<label>: for <loop variable> in range loop begin
A <= B after 10ns;
<sequence of statements> for i in result'RANGE loop
C <= A after 10ns; -- value of C is current A value
end loop <label>; case b(i) is
when '0' => result(i) := '0';
when '1' => result(i) := '1';
Variable assignment statement NOTE: the label is optional. end case;
end loop;
Update a process/procedure/function variable with an expression. The update takes affect Loop termination statements: allow termination of one iteration, loop, or procedure. return result;
immediately. next [when condition]; : end current loop iteration end;
bit_vector or S'TRANSACTION : bit value which toggles each time signal S changes Array Indexes for an Array A (Nth index of array A)
To_StdULogicVector(bv) std_ulogic_vector
std_logic_vector
Examples A'LEFT(N) : left bound of index
bit , std_ulogic , or A'RIGHT(N) : right bound of index
To_X01(v) X01
std_logic if (clock'STABLE(0ns)) then -- change in clock? A'HIGH(N) : upper bound of index
... -- action if no clock edge
A'LOW(N) : lower bound of index
bit , std_ulogic , or else
To_X01Z(v) X01Z ... -- action on edge of clock A'LENGTH(N) : number of values in range of index
std_logic
end if; A'RANGE(N) : range: A'LEFT to A'RIGHT
bit , std_ulogic , or A'REVERSE_RANGE(N) : range A'LEFT downto A'RIGHT
To_UX01(v) UX01 if clock'EVENT and clock = '1' then
std_logic Q <= D after 5ns; -- set Q to D on rising edge of clock
end if; NOTE: For multi-dimensional array, Nth index must be indicated in the attribute
specifier. N may be omitted for a one-dimensional array.
Other ieee.std_logic_1164 functions
Data Type Bounds (Attributes of data type T) Examples
rising_edge(s) - true if rising edge on signal s ( std_ulogic )
falling_edge(s) - true if falling edge on signal s ( std_ulogic ) T'BASE : base type of T
for i in (<data bus>'RANGE) loop
T'LEFT : left bound of data type T ...
T'RIGHT : right bound for i in (d'LEFT(1) to d'RIGHT(1)) loop
OBJECT ATTRIBUTES T'HIGH : upper bound (may differ from left bound) ...