VHDL - 高阻抗的使用

VHDL - Usage of high impedance

我开始学习 VHDL,目前我正在按照一本建议使用带缓冲区的 4 到 8 多路复用器的书籍说明进行操作。所以我决定构建一个 4x1 MUX。但是我不知道如何将单个输出设置为高阻抗。

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 

ENTITY buffered_mux_4x1 IS 
    PORT (a, b, c, d: IN BIT;
        sel: IN NATURAL RANGE 0 TO 3;
        ena: IN BIT;
        y: OUT BIT);
END buffered_mux_4x1;

ARCHITECTURE myarch OF buffered_mux_4x1 IS
    SIGNAL x: BIT;
BEGIN
    x <= a WHEN sel=0 ELSE --MUX
         b WHEN sel=1 ELSE
         c WHEN sel=2 ELSE
         d;
    y <= x WHEN ena='1' ELSE -- Tristate buffer
          ???
END myarch;

这是在启用设置为“0”时将输出设置为高阻抗的原始代码:

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 

ENTITY buffered_mux IS 
    PORT (a, b, c, d: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
        sel: IN NATURAL RANGE 0 TO 3;
        ena: IN STD_LOGIC;
        y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END buffered_mux;

ARCHITECTURE myarch OF buffered_mux IS
    SIGNAL x: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
    x <= a WHEN sel=0 ELSE --MUX
         b WHEN sel=1 ELSE
         c WHEN sel=2 ELSE
         d;
    y <= x WHEN ena='1' ELSE -- Tristate buffer
        (OTHERS => 'Z');
END myarch;

问题来了:

y: OUT std_logic);

你可以使用

y <= x WHEN ena='1' ELSE 'z';

编辑:
正如我和另一位用户所评论的那样,即使语法正确,(即使不是全部)FPGA 内部也不支持高阻抗。它应该在焊盘上使用特定于供应商的块来实现。
您应该忘记 BIT 类型,并且永远不要使用它。 std_logic(_vector)、signed 和 unsigned 是用于综合的正常逻辑值。还有一些其他类型,例如总线大小的整数。
所以确实 a、b、c、d、ena 和 x 也应该是 std_logic(_vector)。取决于它来自哪里(它只是一个内部信号吗?),sel 也是,即使一些工具可能会正确解释一个自然的。