Answers Database


Foundation XVHDL: How to use Bidirectional I/O


Record #1374

Product Family: Software

Product Line: Metamor

Product Part: Foundation XVHDL

Problem Title:
Foundation XVHDL: How to use Bidirectional I/O


Problem Description:
Urgency: Standard

General Description:

Bidirectional I/O signals can be described behaviorally in
the VHDL code by using an 'inout' port in the entity and with
the output described as tri-statable in the architecture.
XVHDL will infer the appropriate types of I/O components.

Please note that with the XVHDL compiler, you must describe the
entire bidirectional pin, including output tristate, in the
top-level VHDL file. For more information on this topic,
please see (Xilinx Solution 2591).


Solution 1:

--Example of behavioral description of bidirectional I/O
--Note that in this example the output is both tri-stated
--and registered. An output flip-flop with tri-state enable
--(OFDT) will be inferred.

library IEEE;
use IEEE.std_logic_1164.all;

entity BIDIR is
    port (DATA: inout std_logic;
      NOT_DATA: out std_logic;
      CLK, A, B: in std_logic;
      ENABLE: in std_logic);
end BIDIR;

architecture INVERT of BIDIR is
    signal IN1: std_logic;
    signal OUT1: std_logic;
begin
    IN1 <= A and B;

    process (CLK)
    begin
       if CLK'event and CLK='1' then --CLK rising edge
       OUT1 <= IN1;
       end if;
    end process;

--Tri-state buffer
    DATA <= (OUT1) when ENABLE='1' else 'Z';
    NOT_DATA <= not DATA;

end INVERT;



-- This example describes 4-bit wide tri-stated I/O bus.

library IEEE;
use IEEE.std_logic_1164.all;

entity BIDIR2 is
    port (DATA: inout std_logic_vector (3 downto 0);
      NOT_DATA: out std_logic_vector (3 downto 0);
      A, B : in std_logic_vector (3 downto 0);
      CLK : in std_logic;
      ENABLE: in std_logic);
end BIDIR2;

architecture bidi_bus of BIDIR2 is
    signal IN1: std_logic_vector (3 downto 0);
    signal OUT1: std_logic_vector (3 downto 0);
begin
    IN1 <= A and B;

    process (CLK)
    begin
       if CLK'event and CLK='1' then --CLK rising edge
       OUT1 <= IN1;
       end if;
    end process;

--Tri-state buffer
    DATA <= (OUT1) when ENABLE='1' else "ZZZZ";
    NOT_DATA <= not DATA;

end bidi_bus;




End of Record #1374 - Last Modified: 01/03/00 10:55

For the latest news, design tips, and patch information on the Xilinx design environment, check out the Technical Tips!