Return to previous page Advance to next page
VHDL Reference Guide
Chapter 7: Register and Three-State Inference

Three-State Inference

Foundation Express infers a three-state driver when you assign the value of Z to a variable. The Z value represents the high-impedance state. Foundation Express infers one three-state driver per process. You can assign high-impedance values to single-bit or bused signals (or variables).

Reporting Three-State Inference

The following example shows a three-state inference report.

Three-State Device Name
Type
MB
OUT1_tri
Three-State Buffer
N

The first column of the report indicates the name of the inferred three-state device. The second column of the report indicates the type of three-state device that Foundation Express inferred. The third column indicates whether the three-state device has multiple bits.

Controlling Three-State Inference

Foundation Express always infers a three-state driver when you assign the value of Z to a signal or variable. Foundation Express does not provide any means of controlling the inference.

Inferring Three-State Drivers

This section contains VHDL examples that infer the following types of three-state drivers.

Inferring a Simple Three-State Driver

This section provides a template for a simple three-state driver. In addition, this section supplies examples of how allocating high-impedance assignments to different processes affects three-state inference.

The following example provides the VHDL template for a simple three-state driver. Foundation Express generates the inference report shown following the example for a simple three-state driver. The figure “Three-State Driver” shows the inferred three-state driver.

library IEEE, synopsys;
use IEEE.std_logic_1164.all;
entity three_state is
port(IN1, ENABLE : in std_logic;
OUT1 : out std_logic );
end;

architecture rtl of three_state is
begin

process (IN1, ENABLE) begin
if (ENABLE = '1') then
OUT1 <= IN1;
else
OUT1 <= 'Z'; -- assigns high-impedance state
end if;
end process;

end rtl;

The following example shows an inference report for a simple three-state driver.

Three-State Device Name
Type
MB
OUT1_tri
Three-State Buffer
N

Figure 7.25 Simple Three-State Driver

Inferring One Three-State Driver from a Single Process

The following example shows how to place all high-impedance assignments in a single process. In this case, the data is gated and Foundation Express infers a single three-state driver. An inference report for a single process follows the example. The figure “Inferring One Three-State Driver” shows the schematic the code generates.

library IEEE;
use IEEE.std_logic_1164.all;

entity three_state is
port ( A, B, SELA, SELB : in std_logic ;
T : out std_logic );
end three_state;

architecture rtl of three_state is
begin
infer : process (SELA, A, SELB, B) begin
T <= 'Z';
if (SELA = '1') then
T <= A;
elsif (SELB = '1') then
T <= B;
end if;
end process infer;

end rtl;

The following example shows a single block inference report.

Three-State Device Name
Type
MB
T_tri
Three-State Buffer
N

Figure 7.26 Inferring One Three-State Driver

Inferring Three-State Drivers from Separate Processes

The following example shows how to place each high-impedance assignment in a separate process. In this case, Foundation Express infers multiple three-state drivers.

The inference report for two three-state drivers follows the example. The figure “Inferring Two Three-State Drivers” shows the schematic the code generates.

library IEEE;
use IEEE.std_logic_1164.all;

entity three_state is
port ( A, B, SELA, SELB : in std_logic ;
T : out std_logic );
end three_state;

architecture rtl of three_state is
begin
infer1 : process (SELA, A) begin
if (SELA = '1') then
T <= A;
else
T <= 'Z';
end if;
end process infer1;

infer2 : process (SELB, B) begin
if (SELB = '1') then
T <= B;
else
T <= 'Z';
end if;
end process infer2;

end rtl;

The following example shows an inference report for two three-state drivers from separate processes.

Three-State Device Name
Type
MB
T_tri
Three-State Buffer
N



Three-State Device Name
Type
MB
T_tri2
Three-State Buffer
N

Figure 7.27 Inferring Two Three-State Drivers

Three-State Driver with Registered Enable

When a variable, such as THREE_STATE in the following example, is assigned to a register and defined as a three-state gate within the same process, Foundation Express also registers the enable pin of the three-state gate.

The following example shows this type of code, and the inference report for a three-state driver with registered enable follows the example. The figure “Three-State Driver with Registered Enable” shows the schematic the code generates, a three-state gate with a register on its enable pin.

library IEEE;
use IEEE.std_logic_1164.all;

entity three_state is
port ( DATA, CLK, THREE_STATE : in std_logic ;
OUT1 : out std_logic );
end three_state;

architecture rtl of three_state is
begin
infer : process (THREE_STATE, CLK) begin
if (THREE_STATE = '0') then
OUT1 <= 'Z';
elsif (CLK'event and CLK = '1') then
OUT1 <= DATA;
end if;
end process infer;

end rtl;

The following example shows an inference report for a three-state driver with registered enable.

Register Name
Type
Width
Bus
MB
AR
AS
SR
SS
ST
OUT1_reg
Flip-flop
1
-
-
N
N
N
N
N

Three-State Device Name
Type
MB
OUT1_tri
OUT1_tr_enable_reg
Three-State Buffer
Flip-Flop (width 1)
N
N

OUT1_reg
   set/reset/toggle: none

Figure 7.28 Three-State Driver with Registered Enable

Three-State Driver Without Registered Enable

The following example uses two processes to instantiate a three-state gate with a flip-flop on the input. The inference report for a three-state driver without registered enable follows the example. The figure “Three-State Driver without Registered Enable” shows the schematic the code generates.

library IEEE;
use IEEE.std_logic_1164.all;

entity ff_3state2 is
port ( DATA, CLK, THREE_STATE : in std_logic ;
OUT1 : out std_logic );
end ff_3state2;

architecture rtl of ff_3state2 is
signal TEMP : std_logic;
begin

process (CLK) begin
if (CLK'event and CLK = '1') then
TEMP <= DATA;
end if;
end process;

process (THREE_STATE, TEMP) begin
if (THREE_STATE = '0') then
OUT1 <= 'Z';
else
OUT1 <= TEMP;
end if;
end process;

end rtl;

The following example shows an inference report for a three-state driver without registered enable.

Register Name
Type
Width
Bus
MB
AR
AS
SR
SS
ST
TEMP_reg
Flip-flop
1
-
-
N
N
N
N
N

.

Three-State Device Name
Type
MB
OUT1_tri
Three-State Buffer
N

TEMP_reg
   set/reset/toggle: none

Figure 7.29 Three-State Driver without Registered Enable

Understanding the Limitations of Three-State Inference

You can use the Z value in the following ways.

You cannot use the Z value in an expression, except for comparison with Z. Be careful when using expressions that compare with the Z value. Foundation Express always evaluates these expressions to FALSE, and the pre- and post-synthesis simulation results might differ. For this reason, Foundation Express issues a warning when it synthesizes such comparisons.

The following example shows the incorrect use of the Z value in an expression.

OUT_VAL = (1'bz && IN_VAL);

The following example shows the correct use of the Z value in an expression.

if (IN_VAL == 1'bz) then