3. 三态缓冲器

三态缓冲器 学习卡片

任务目标

设计一个带使能端的三态缓冲器,当使能信号有效时,输出等于输入;当使能信号无效时,输出为高阻态(Z),并通过仿真验证高阻态行为。

实现方案

三态缓冲器在数字系统中用于总线驱动和多路复用场景。本设计采用数据流风格,使用VHDL标准库中的std_logic类型,其九值逻辑系统天然支持高阻态'Z'。核心逻辑为:当en = '1'时,y = a;否则y = 'Z'。

完整代码

-- 文件: tri_buf.vhd
library ieee;
use ieee.std_logic_1164.all;

entity tri_buf is
    port (
        a  : in  std_logic;  -- 数据输入
        en : in  std_logic;  -- 使能信号,高电平有效
        y  : out std_logic   -- 三态输出
    );
end entity;

architecture dataflow of tri_buf is
begin
    y <= a when (en = '1') else 'Z';
end architecture;

测试平台与验证

为验证高阻态输出,编写测试平台对四种输入组合进行仿真:使能无效时无论输入为何,输出均为高阻态;使能有效时输出跟随输入。

-- 文件: tri_buf_tb.vhd
library ieee;
use ieee.std_logic_1164.all;

entity tri_buf_tb is
end entity;

architecture sim of tri_buf_tb is
    signal a  : std_logic := '0';
    signal en : std_logic := '0';
    signal y  : std_logic;
begin
    dut: entity work.tri_buf
        port map (a => a, en => en, y => y);

    process
    begin
        -- 用例1: en=0, 输出应为高阻态
        a  <= '0'; en <= '0';
        wait for 10 ns;
        assert y = 'Z' report "用例1失败: en=0时输出应为Z" severity error;

        -- 用例2: en=0, 输入变化, 输出仍为高阻态
        a  <= '1'; en <= '0';
        wait for 10 ns;
        assert y = 'Z' report "用例2失败: en=0时输出应为Z" severity error;

        -- 用例3: en=1, 输出跟随输入
        a  <= '0'; en <= '1';
        wait for 10 ns;
        assert y = '0' report "用例3失败: en=1且a=0时输出应为0" severity error;

        -- 用例4: en=1, 输出跟随输入
        a  <= '1'; en <= '1';
        wait for 10 ns;
        assert y = '1' report "用例4失败: en=1且a=1时输出应为1" severity error;

        report "所有测试用例通过" severity note;
        wait;
    end process;
end architecture;

仿真运行与通过标准

运行环境:ModelSim、GHDL或Vivado等支持VHDL-93及以上标准的仿真器。

编译与仿真命令(以GHDL为例):

ghdl -a tri_buf.vhd tri_buf_tb.vhd
ghdl -r tri_buf_tb --vcd=tri_buf_tb.vcd
gtkwave tri_buf_tb.vcd

通过判定:仿真结束时控制台输出“所有测试用例通过”,且无severity error报告。在波形图中观察:当en=0时y信号线为高阻态(波形显示为中间水平线或Z标记);当en=1时y与a波形完全一致。

关键点说明

  • 使用std_logic而非bit类型是必要的,因为bit只有'0'/'1'两种状态,无法表达高阻态。
  • 条件信号赋值语句y <= a when (en = '1') else 'Z'是数据流风格的核心描述,综合时将映射为三态门电路。
  • 测试平台中的assert语句用于自动比对期望值与实际值,是验证高阻态行为的有效手段。