Vector 在VHDL测试台中将STD_逻辑连接到STD_逻辑向量

Vector 在VHDL测试台中将STD_逻辑连接到STD_逻辑向量,vector,logic,vhdl,Vector,Logic,Vhdl,这是我的4到1多路复用器的简单示意图。我很难将逻辑连接到逻辑向量 这是我的测试台代码。我只想展示所有可能输入的MUX性能。它编译得很好,但并不像我预期的那样工作。 我猜新声明的向量“X”和“I”与原理图的实际输入没有联系 LIBRARY ieee; USE ieee.std_logic_1164.ALL; use ieee.std_logic_unsigned.all; USE ieee.numeric_std.ALL; LIBRARY UNISIM; USE UNISIM.Vcomponent

这是我的4到1多路复用器的简单示意图。我很难将逻辑连接到逻辑向量

这是我的测试台代码。我只想展示所有可能输入的MUX性能。它编译得很好,但并不像我预期的那样工作。 我猜新声明的向量“X”和“I”与原理图的实际输入没有联系

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
LIBRARY UNISIM;
USE UNISIM.Vcomponents.ALL;
ENTITY MUX_SCHE_MUX_SCHE_sch_tb IS
END MUX_SCHE_MUX_SCHE_sch_tb;
ARCHITECTURE behavioral OF MUX_SCHE_MUX_SCHE_sch_tb IS 

   COMPONENT MUX_SCHE
   PORT( X3 :   IN  STD_LOGIC; 
          X2    :   IN  STD_LOGIC; 
          X1    :   IN  STD_LOGIC; 
          X0    :   IN  STD_LOGIC; 
          I0    :   IN  STD_LOGIC; 
          I1    :   IN  STD_LOGIC; 
          Y :   OUT STD_LOGIC);
   END COMPONENT;

   SIGNAL X3    :   STD_LOGIC := '0';
   SIGNAL X2    :   STD_LOGIC := '0';
   SIGNAL X1    :   STD_LOGIC := '0';
   SIGNAL X0    :   STD_LOGIC := '0';
   SIGNAL I0    :   STD_LOGIC := '0';
   SIGNAL I1    :   STD_LOGIC := '0';
   SIGNAL Y : STD_LOGIC;

    ---------- New Variable ----------
    SIGNAL X : STD_LOGIC_VECTOR(3 downto 0);
    SIGNAL I : STD_LOGIC_VECTOR(1 downto 0);
    SIGNAL j : integer := 0;
    SIGNAL k : integer := 0;

BEGIN

    X <= X3 & X2 & X1 & X0;
    I <= I1 & I0;
    UUT: MUX_SCHE PORT MAP(
        X3 => X3, 
        X2 => X2, 
        X1 => X1, 
        X0 => X0, 
        I0 => I0, 
        I1 => I1, 
        Y => Y
   );

-- *** Test Bench - User Defined Section ***
   tb : PROCESS
   BEGIN
    X <= "0000";
    I <= "00";
        while(j<4) loop
            while(k<8) loop
                X <= X + '1'; WAIT FOR 10 NS;
            end loop;
            I <= I + '1'; WAIT FOR 10 NS;
       end loop;

   END PROCESS;
-- *** End Test Bench - User Defined Section ***

END;
ieee库;
使用ieee.std_logic_1164.ALL;
使用ieee.std_logic_unsigned.all;
使用ieee.numeric_std.ALL;
UNISIM图书馆;
使用UNISIM.Vcomponents.ALL;
实体MUX_SCHE_MUX_SCHE_sch_tb是
结束MUX_SCHE_MUX_SCHE_sch_tb;
MUX_SCHE_MUX_SCHE_sch_tb的架构行为是
组件多路复用器
端口(X3:标准_逻辑中;
X2:标准逻辑中;
X1:标准逻辑中;
X0:在标准逻辑中;
I0:标准逻辑中;
I1:标准逻辑中;
Y:输出标准(U逻辑);
端部元件;
信号X3:STD_逻辑:='0';
信号X2:STD_逻辑:='0';
信号X1:STD_逻辑:='0';
信号X0:STD_逻辑:='0';
信号I0:STD_逻辑:='0';
信号I1:STD_逻辑:='0';
信号Y:STD_逻辑;
----------新变量----------
信号X:STD_逻辑_向量(3到0);
信号I:标准逻辑向量(1到0);
信号j:整数:=0;
信号k:整数:=0;
开始
X X2,
X1=>X1,
X0=>X0,
I0=>I0,
I1=>I1,
Y=>Y
);
--***试验台-用户定义部分***
tb:过程
开始

在你的代码中有两个问题:第一,
X,因为Brian指出给X(和I)的赋值是不正确的

还有一种情况是,X始终都是“X”,有两个驱动程序。对X的并发信号分配和未标记进程中的分配。此外,未标记的进程将无法成功初始化X,因为在第一次分配到“0000”和内部while循环中的第一次分配之间没有进程的中断

您还可以注意到,没有为j和k赋值,这意味着您永远无法完成内部while循环,并提供不同的I值

克服当前测试台中的问题还包括简化:

library ieee;
use ieee.std_logic_1164.all;

entity mux_sche_tb is
end entity mux_sche_tb;

architecture foo of mux_sche_tb is 
    use ieee.numeric_std.all;
    component mux_sche
        port ( 
           x3:   in  std_logic; 
           x2:   in  std_logic; 
           x1:   in  std_logic; 
           x0:   in  std_logic; 
           i0:   in  std_logic; 
           i1:   in  std_logic; 
           y:    out std_logic
        );
    end component;

   -- signal x3:       std_logic := '0';
   -- signal x2:       std_logic := '0';
   -- signal x1:       std_logic := '0';
   -- signal x0:       std_logic := '0';
   -- signal i0:       std_logic := '0';
   -- signal i1:       std_logic := '0';
    signal y:  std_logic;

    -- ---------- new variable ----------
    signal x:  unsigned(3 downto 0);
    signal i:  unsigned(1 downto 0);
    -- signal j:  integer := 0;
    -- signal k:  integer := 0;

begin

    -- x <= x3 & x2 & x1 & x0;
    -- i <= i1 & i0;

uut: 
    mux_sche 
        port map (
            x3 => x(3), 
            x2 => x(2), 
            x1 => x(1), 
            x0 => x(0), 
            i0 => i(0), 
            i1 => i(1), 
            y => y
        );

tb:  
   process
   begin
    -- x <= "0000";
    -- i <= "00";
        wait for 10 ns; -- show initial state
        for j in 0 to 3 loop
            I <= to_unsigned(j, 2);
            for k in 0 to 15 loop
                X <= to_unsigned(k, 4);
                wait for 10 ns;
            end loop;
        end loop;
        wait;
       --  while(j < 4) loop
       --      while(k < 8) loop
       --          x <= x + '1';
       --          wait for 10 ns;
       --      end loop;
       --      i <= i + '1';
       --      wait for 10 ns;
       -- end loop;

   end process;
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体mux_sche_tb是
终端实体mux_sche_tb;
mux_sche_tb的体系结构foo是
使用ieee.numeric_std.all;
组件多路复用器
港口(
x3:标准逻辑中;
x2:标准逻辑中;
x1:标准逻辑中;
x0:在标准逻辑中;
i0:标准逻辑中;
i1:标准逻辑中;
y:输出标准逻辑
);
端部元件;
--信号x3:std_逻辑:='0';
--信号x2:std_逻辑:='0';
--信号x1:std_逻辑:='0';
--信号x0:std_逻辑:='0';
--信号i0:std_逻辑:='0';
--信号i1:std_逻辑:='0';
信号y:std_逻辑;
---------新变量----------
信号x:无符号(3到0);
信号i:无符号(1到0);
--信号j:整数:=0;
--信号k:整数:=0;
开始
--x(2),,
x1=>x(1),
x0=>x(0),
i0=>i(0),
i1=>i(1),
y=>y
);
结核病:
过程
开始

--x您对x和I的分配似乎是错误的,使DUT端口没有值。只需删除信号X3等,并将端口映射为
X=>X(3),
etc。
library ieee;
use ieee.std_logic_1164.all;

entity mux_sche is
    port (
        X3: in  std_logic;
        X2: in  std_logic;
        X1: in  std_logic;
        X0: in  std_logic;
        I0: in  std_logic;
        I1: in  std_logic;
        Y:  out std_logic
    );
end entity;

architecture foo of mux_sche is

begin
    process (X3, X2, X1, X0, I0, I1)
    variable I: std_logic_vector (1 downto 0);
    begin
        I := TO_X01(I1 & I0);
        case I is
            when "00" =>
                Y <= TO_X01(X0);
            when "01" =>
                Y <= TO_X01(X1);
            when "10" =>
                Y <= TO_X01(X2);
            when "11" =>
                Y <= TO_X01(X3);
            when others =>
                Y <= 'X';
        end case;
    end process;
end architecture;