2to1多路复用器的VHDL

时间:2019-05-09 23:01:44

标签: vhdl

这就是我要用VHDL代码编写的内容:

enter image description here

我还在学习,所以我不知道我写的内容是否正确。有人可以帮我这个多路复用器吗?

多路复用器

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
PACKAGE mux2to1_package IS
   COMPONENT mux2to1
        PORT (  s, w0, w1: IN   STD_LOGIC ;
            f       : OUT   STD_LOGIC ) ;
   END COMPONENT ;
END mux2to1_package ;

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY mux2to1 IS
PORT (  s, w0, w1   : IN    STD_LOGIC ;
        f   : OUT   STD_LOGIC ) ;
END mux4to1 ;

ARCHITECTURE Behavior OF mux2to1 IS 
BEGIN
   IF s='0' THEN
      f <= w0;
   ELSE
      f <= w1;
   END IF;
END Behavior ;

代码

ENTITY mux2 IS
PORT (  s, w    : IN    STD_LOGIC ;
    f   : OUT   STD_LOGIC ) ;
END mux2 ;

ARCHITECTURE structure OF mux2 IS   
   SIGNAL m : STD_LOGIC;
BEGIN
   mapping: mux2 PORT MAP ( w(0), w(1), s(0), m(0) ) ;
END Structure ;

我觉得映射部分根本不正确。

2 个答案:

答案 0 :(得分:2)

Multiplexer:

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;
PACKAGE mux2to1_package IS
   COMPONENT mux2to1
        PORT (  s, w0, w1: IN   STD_LOGIC ;
            f       : OUT   STD_LOGIC ) ;
   END COMPONENT ;
END mux2to1_package ;

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY mux2to1 IS
PORT (  s, w0, w1   : IN    STD_LOGIC ;
        f   : OUT   STD_LOGIC ) ;
END mux2to1;

ARCHITECTURE Behavior OF mux2to1 IS 
BEGIN
  PROCESS(s,w0,w1)
  BEGIN

     IF s='0' THEN
        f <= w0;
     ELSE
        f <= w1;
     END IF;

  END PROCESS;
END Behavior ;

测试平台代码:

library ieee;
use ieee.std_logic_1164.all;
use work.mux2to1_package.all;

ENTITY tb IS
END tb;

ARCHITECTURE arch OF tb IS
    SIGNAL s : std_logic := '0';
    SIGNAL w0, w1 : std_logic := '0';
    SIGNAL f : std_logic := '0';
BEGIN
    UUT : ENTITY work.mux2to1 port map(s => s, w0 => w0, w1 => w1, f => f);

    PROCESS
    BEGIN
        s <= 'X';
        w0 <= 'X';
        w1 <= 'X';
        wait for 1 ns;

        s <= '0';
        w0 <= '1';
        w1 <= '0';
        wait for 1 ns;

        s <= '1';
        w0 <= '0';
        w1 <= '1';
        wait for 1 ns;

        s <= '0';
        w0 <= '0';
        w1 <= '1';
        wait for 1 ns;

        assert false report "End of test";
        wait;
    END PROCESS;
END arch;

enter image description here

就像提到的user1155120一样,您在端口映射中为mapping进行信号关联时并不小心。在mux2to1实体中,您按此顺序列出了s,w0,w1和f。 在端口图中,您使用了位置关联,但未正确进行关联。如果要使用位置关联,则user1155120的处理方式是正确的。如果您想使用名称关联来执行此操作(如我在上面的代码中所做的那样),则无需按照信号在实体中列出的顺序列出信号(以相同的顺序列出,就意味着您要注意什么)由哪个信号完成)。使用名称关联时,可以执行以下操作:

UUT : ENTITY work.mux2to1 port map( f => f, w0 => w0, w1 => w1, s => s,);

您可以混合他们的订单。

也在您的 Code 部分中,在端口映射期间,您似乎正在尝试使用向量,但是它们之前未设置任何向量,因此您无法真正使用它们。

正如Juergen所说,您正在使用没有 process 的if语句,该语句已在上面的代码中得到纠正。

关于使用包的快速说明:当像我一样编写测试台时,或在其他任何VHDL设计中使用该包时,以下行是必需的:

use work.mux2to1_package.all;

同样值得称赞的是,您使用的是 package 结构,但是在这个级别上,我真的没有必要。您可以简单地声明 ENTITY

答案 1 :(得分:1)

您还可以使用“时间”,它可以在流程之外并且不需要敏感列表:

ARCHITECTURE Behavior OF mux2to1 IS 
BEGIN
   f <= w0 WHEN s='0' ELSE w1;
END Behavior;