4. 简单译码器

任务目标

使用VHDL实现一个2-4译码器:输入为2位二进制选择信号sel,输出为4位独热编码信号y,当sel取值为0~3时,对应y的某一位为'1',其余为'0'。通过仿真验证输出选择逻辑正确。

实现方案

采用with-select并行语句实现组合逻辑译码,这是VHDL中描述译码器最直接的方式。实体包含1个2位输入端口和1个4位输出端口,无时钟信号,属于纯组合逻辑电路。

完整代码

-- 2-4译码器
library ieee;
use ieee.std_logic_1164.all;

entity decoder_2to4 is
    port (
        sel : in  std_logic_vector(1 downto 0);  -- 2位选择输入
        y   : out std_logic_vector(3 downto 0)   -- 4位独热输出
    );
end entity;

architecture behavior of decoder_2to4 is
begin
    with sel select
        y <= "0001" when "00",
             "0010" when "01",
             "0100" when "10",
             "1000" when "11",
             "0000" when others;  -- 覆盖未定义情况
end architecture;

仿真测试平台

library ieee;
use ieee.std_logic_1164.all;

entity tb_decoder is
end entity;

architecture sim of tb_decoder is
    signal sel : std_logic_vector(1 downto 0);
    signal y   : std_logic_vector(3 downto 0);
begin
    dut: entity work.decoder_2to4
        port map (sel => sel, y => y);

    process
    begin
        -- 遍历全部4种输入组合
        sel <= "00"; wait for 10 ns;
        assert y = "0001" report "sel=00 输出错误" severity error;

        sel <= "01"; wait for 10 ns;
        assert y = "0010" report "sel=01 输出错误" severity error;

        sel <= "10"; wait for 10 ns;
        assert y = "0100" report "sel=10 输出错误" severity error;

        sel <= "11"; wait for 10 ns;
        assert y = "1000" report "sel=11 输出错误" severity error;

        report "测试完成" severity note;
        wait;
    end process;
end architecture;

运行与验证

环境要求:ModelSim、GHDL或Quartus等支持VHDL-93及以上标准的仿真工具。

仿真步骤:

  1. 将译码器代码保存为decoder_2to4.vhdl,测试平台保存为tb_decoder.vhdl。
  2. 在仿真工具中编译两个文件,然后将tb_decoder设为顶层进行仿真。
  3. 运行仿真,观察sel与y的波形。

通过条件:

  • 仿真过程中无assert错误报告,控制台输出"测试完成"。
  • 波形图中,当sel分别为00、01、10、11时,y依次为0001、0010、0100、1000,且输出相对输入无延迟(组合逻辑)。

预期输出真值表

sely
000001
010010
100100
111000
2-4译码器 sel(0) sel(1) y(0) y(1) y(2) y(3) 输入sel=00→y(0)=1, sel=01→y(1)=1, sel=10→y(2)=1, sel=11→y(3)=1