If Statement
Used In
- Process
- Function
- Procedure
Reference Manual
VHDL-93:- Section 8.6
Syntax
if condition1 then
-- sequential statements
elsif condition2 then
-- sequential statements
else
-- sequential statements
end if;
Rules and Examples
Conditions may overlap - only the statements after the first “true” condition are executed.
if (X = 5) and (Y = 9) then
Z <= A;
elsif (X >= 5) then
Z <= B;
else
Z < C;
end if;
The elsif and else clauses are optional. This process models a transparent latch:
process (EN, D)
begin
if (EN = '1') then
Q <= D;
end if;
end process;
A condition can be any boolean expression:
process (ALARM_TIME, CURRENT_TIME)
variable AL_EQ_CUR: boolean;
begin
AL_EQ_CUR := (ALARM_TIME = CURRENT_TIME);
if AL_EQ_CUR then
SOUND_ALARM <= '1';
else
SOUND_ALARM <= '0';
end if;
end process;
An if statement may be used to infer edge-triggered registers in a process sensitive to a clock signal. Asynchronous reset may also be modeled:
process(CLK, RESET)
begin
if RESET = '1' then
COUNT <= 0;
elseif CLK'event and CLK='1' then
if (COUNT >= 9) then
COUNT <= 0;
else
COUNT <= COUNT + 1;
end if;
end if
end process;
If statements may be used to specify conditional assignments or state transitions in a finite state machine:
case READ_CPU_STATE is
when WAITING =>
if CPU_DATA_VALID = '1' then
CPU_DATA_READ <= '1';
READ_CPU_STATE <= DATA1;
end if;
when DATA1 =>
-- other branches of the case statement
end case;
The if
may have an optional label:
label: if condition then
-- etc
end if label
Synthesis Issues
The if statement is generally synthesizable. Where an if statement is used to detect the clock edge in a “clocked process”, certain conventions must be obeyed. Using an if statement without an else clause in a “combinational process” can result in latches being inferred, unless all signals driven by the process are given unconditional default assignments. For more details see Process.