在 Modelsim 中使用 2to1 mux 制作的 4to1 mux 的输出存在问题

A problem with the output of a 4to1 mux made using 2to1 mux's in Modelsim

在使用 Modelsim 成功编译和模拟下面的代码后,这只是一个使用两个 2to1 多路复用器构建的简单 4to1 多路复用器,我 运行 进行波形测试以查看它的输出无论输入值如何,都一直处于 U 状态,这里是代码和结果:

a. 2to1 mux 的代码:

entity mux2_1 is
port( a,b:in std_logic_vector(2 downto 0);
s:in std_logic;
e:out std_logic_vector(2 downto 0));
end mux2_1;


architecture wx of mux2_1 is

begin

process

begin
if(s='0') then
e<=a;
else
e<=b;
end if;
wait;

end process;
end wx;

b. 4to1 mux 的代码:


entity mux4_1 is

port( a,b,c,d:in std_logic_vector(2 downto 0);
       s1,s0:in std_logic;
       e :out std_logic_vector (2 downto 0));

end mux4_1;


architecture nj of mux4_1 is

signal t1,t2:std_logic_vector (2 downto 0);


begin

k1: entity work.mux2_1 port map (a,b,s0,t1);
k2: entity work.mux2_1 port map (c,d,s0,t2);
k3: entity work.mux2_1 port map (t1,t2,s1,e);

end nj;

这是模拟后的控制台报告:

最后是输出不一致的波形:

首先我建议你去读一些别人的VHDL代码,试着理解他们在做什么。您拥有的是可以执行某些操作的代码,但不一定是您希望它执行的操作。人们在开始 VHDL 编码时犯的一个大错误是认为它是软件并且可以像软件一样进行编程;它不是。要擅长它,您必须从硬件的角度考虑,以及为您的代码声明的逻辑。

等待语句有问题。唯一应该使用等待语句的地方是在测试台中,因为它们不能映射到逻辑单元。所以你想要做的是删除等待语句并制作一个进程敏感性列表(在这种情况下你真的不需要它,但这是一个很好的做法)。

p_MUX_2x1 : process (a, b, s)
begin
   if (s = '0') then
      e <= a;
   else
      e <= b;
   end if;
end process p_MUX_2x1;

我认为错误是由于 2:1 mux 中的 'wait' 语句造成的。请删除它。

附注:仅在测试台中尽可能多地使用等待语句。由于等待时间为 non-synthesizable,您会遇到一些错误。

谢谢