VHDL Sequential Statements
These statements are for use in Processes, Procedures and Functions.
The signal assignment statement has unique properties when used sequentially.
wait statement
assertion statement
report statement
signal assignment statement
variable assignment statement
procedure call statement
if statement
case statement
loop statement
next statement
exit statement
return statement
null statement
Cause execution of sequential statements to wait.
[ label: ] wait [ sensitivity clause ] [ condition clause ] ;
wait for 10 ns; -- timeout clause, specific time delay.
wait until clk='1'; -- condition clause, Boolean condition
wait until A>B and S1 or S2; -- condition clause, Boolean condition
wait on sig1, sig2; -- sensitivity clause, any event on any
-- signal terminates wait
Used for internal consistency check or error message generation.
[ label: ] assert boolean_condition [ report string ] [ severity name ] ;
assert a=(b or c);
assert j<i report "internal error, tell someone";
assert clk='1' report "clock not up" severity WARNING;
predefined severity names are: NOTE, WARNING, ERROR, FAILURE
default severity for assert is ERROR
Used to output messages.
[ label: ] report string [ severity name ] ;
report "finished pass1"; -- default severity name is NOTE
report "Inconsistent data." severity FAILURE;
The signal assignment statement is typically considered a concurrent
statement rather than a sequential statement. It can be used as
a sequential statement but has the side effect of obeying the
general rules for when the target actually gets updated.
In particular, a signal can not be declared within a process or
subprogram but must be declared is some other appropriate scope.
Thus the target is updated in the scope where the target is declared
when the sequential code reaches its end or encounters a 'wait'
or other event that triggers the update.
[ label: ] target <= [ delay_mechanism ] waveform ;
delay_mechanism
transport
reject time_expression
inertial
waveform
waveform_element [, waveform_element]
unaffected
waveform_element
value_expression [ after time_expression ]
null [ after time_expression ]
sig1 <= sig2;
Sig <= Sa and Sb or Sc nand Sd nor Se xor Sf xnor Sg;
sig1 <= sig2 after 10 ns;
clk <= '1' , '0' after TimePeriod/2 ;
sig3 <= transport sig4 after 3 ns;
sig4 <= reject 2 ns sig5 after 3 ns; -- increasing time order
sig6 <= inertial '1' after 2 ns, '0' after 3 ns , '1' after 7 ns;
Note: omitting [ after time_expression ] is equivalent
to after 0 fs;
More information in Concurrent Statements signal assignment statement.
Assign the value of an expression to a target variable.
[ label: ] target := expression ;
A := -B + C * D / E mod F rem G abs H;
Sig := Sa and Sb or Sc nand Sd nor Se xor Sf xnor Sg;
Call a procedure.
[ label: ] procedure-name [ ( actual parameters ) ] ;
do_it; -- no actual parameters
compute(stuff, A=>a, B=>c+d); -- positional association first,
-- then named association of
-- formal parameters to actual parameters
Conditional structure.
[ label: ] if condition1 then
sequence-of-statements
elsif condition2 then \_ optional
sequence-of-statements /
elsif condition3 then \_ optional
sequence-of-statements /
...
else \_ optional
sequence-of-statements /
end if [ label ] ;
if a=b then
c:=a;
elsif b<c then
d:=b;
b:=c;
else
do_it;
end if;
Execute one specific case of an expression equal to a choice.
The choices must be constants of the same discrete type as the expression.
[ label: ] case expression is
when choice1 =>
sequence-of-statements
when choice2 => \_ optional
sequence-of-statements /
...
when others => \_ optional if all choices covered
sequence-of-statements /
end case [ label ] ;
case my_val is
when 1 =>
a:=b;
when 3 =>
c:=d;
do_it;
when others =>
null;
end case;
Three kinds of iteration statements.
[ label: ] loop
sequence-of-statements -- use exit statement to get out
end loop [ label ] ;
[ label: ] for variable in range loop
sequence-of-statements
end loop [ label ] ;
[ label: ] while condition loop
sequence-of-statements
end loop [ label ] ;
loop
input_something;
exit when end_file;
end loop;
for I in 1 to 10 loop
AA(I) := 0;
end loop;
while not end_file loop
input_something;
end loop;
all kinds of the loops may contain the 'next' and 'exit' statements.
A statement that may be used in a loop to cause the next iteration.
[ label: ] next [ label2 ] [ when condition ] ;
next;
next outer_loop;
next when A>B;
next this_loop when C=D or done; -- done is a Boolean variable
A statement that may be used in a loop to immediately exit the loop.
[ label: ] exit [ label2 ] [ when condition ] ;
exit;
exit outer_loop;
exit when A>B;
exit this_loop when C=D or done; -- done is a Boolean variable
Required statement in a function, optional in a procedure.
[ label: ] return [ expression ] ;
return; -- from somewhere in a procedure
return a+b; -- returned value in a function
Used when a statement is needed but there is nothing to do.
[ label: ] null ;
null;