在Modelsim中使用2to1多路复用器进行4to1多路复用器输出的问题

时间:2019-07-04 19:54:39

标签: vhdl modelsim

使用下面的代码的Modelsim成功编译和仿真之后,这只是一个使用两个2to1多路复用器构建的简单的4to1多路复用器,我运行了波形测试以查看其外观,输出一直处于U状态不管输入的值如何,这是代码和结果:

a。 2to1多路复用器的代码:

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多路复用器的代码:


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;

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

enter image description here

最后,波形与输出不一致:

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为该错误是由于您的2:1多路复用器中的“ wait”语句引起的。请删除它。

这里有一个附注:请尽可能在testbench中使用wait语句。由于等待是不可综合的,因此您会遇到一些错误。

谢谢

答案 1 :(得分:-1)

首先,我建议您从他人那里阅读一些VHDL代码,并尝试了解他们在做什么。您所拥有的是可以执行某些操作的代码,但不一定执行您想要执行的操作。人们开始VHDL编码时犯的一个大错误是认为它是软件,并且可以用与软件相同的方式进行编程。不是。为了做到这一点,您必须考虑硬件以及为代码声明的逻辑。

wait语句是一个问题。因为不能将它们映射到逻辑单元,所以只能在测试台中使用等待语句。因此,您要做的是删除wait语句并创建一个进程敏感性列表(在这种情况下,您甚至根本不需要它,但这是一个好习惯)。

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