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及以上标准的仿真工具。
仿真步骤:
- 将译码器代码保存为
decoder_2to4.vhdl,测试平台保存为tb_decoder.vhdl。 - 在仿真工具中编译两个文件,然后将
tb_decoder设为顶层进行仿真。 - 运行仿真,观察
sel与y的波形。
通过条件:
- 仿真过程中无
assert错误报告,控制台输出"测试完成"。 - 波形图中,当
sel分别为00、01、10、11时,y依次为0001、0010、0100、1000,且输出相对输入无延迟(组合逻辑)。
预期输出真值表
| sel | y |
|---|---|
| 00 | 0001 |
| 01 | 0010 |
| 10 | 0100 |
| 11 | 1000 |