![]() |
![]() |
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).
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.
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.
This section contains VHDL examples that infer the following types of three-state drivers.
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 |
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 |
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 |
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
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
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