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 也是,即使一些工具可能会正确解释一个自然的。
我开始学习 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 也是,即使一些工具可能会正确解释一个自然的。