【发布时间】:2019-11-22 19:14:41
【问题描述】:
我开始学习 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;
【问题讨论】:
-
你不应该使用类型位,而只能使用 std_logic 和 std_logic_vector。然后您可以将 y 设置为“z”。但是,如果您的目标是 FPGA,您也不应该使用三态逻辑。除了实例化一个外部焊盘...
-
成功了!谢谢!我使用了这个符号:
y <= x WHEN ena='1' ELSE 'Z' WHEN ena='0';可以吗? -
不客气!实际上,您甚至不需要第二个。只是其他'z'很好
-
只要你不要对 ena 做疯狂的事情,比如将其设置为 'x' 或 'z'
-
你最好避免使用 x 作为信号名称,因为 'x' 是一个信号值...