在VHDL中将STD_LOGIC连接到测试平台内的STD_LOGIC_VECTOR

时间:2017-09-23 15:28:37

标签: vector logic vhdl

enter image description here

这是我简单的4到1 MUX原理图。我将LOGIC连接到LOGIC_VECTOR ......

时遇到问题

这是我的测试平台代码。我只想显示所有可能输入的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;

2 个答案:

答案 0 :(得分:1)

正如Brian所说,对X(和我)的分配是不正确的。

还有一种情况是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;

在循环语句中使用迭代方案的while循环。 Brian建议分配X的元素扩展到I,并且只提供了一个赋值,消除了多个驱动程序。

使包中的声明ieee.numeric_std可见的use子句被移动到允许分析原始体系结构的体系结构(并且它的use子句允许在Synopsys包中找到的声明ieee.std_logic_unsigned被移动到它的体系结构声明性区域)

for循环迭代器是在循环语句迭代方案中隐式声明的变量,并从它们的默认类型整数转换为unsigned X和I.

unsigned X和I的元素与mux_sche的std_logic形式端口具有相同的基本类型,可以用作实际值(如Brian建议的那样)。

要提供Minimal, Complete and Verifiable example兼容的mux_sche,必须提供:

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;

当在测试平台和测试平台进行分析,详细阐述和模拟之前进行分析时,我们最终得到:

changed.png

不显示X并增加X和I。

此testbench版本依赖于自然范围整数的numeric_std包to_unsigned转换,注意到X和I具有在循环迭代方案隐式声明中指定的范围。

是否可以使用原始测试平台?不适用于j和k的阈值测试。将会发生的是k将经历8次迭代,然后j将经历4次迭代:

enter image description here

使用带有信号迭代器的while循环比使用带有可变迭代器的for循环有点困难。

答案 1 :(得分:0)

您的代码中存在两个问题:首先,X <= X3 & X2 & X1 & X0;X3连接到X0并将结果分配给X。在tb过程中,您再次分配给X,创建通常称为&#34;多个驱动程序&#34;,即。代码的多个部分驱动(可能是不同的)值到同一信号。在编写良好的VHDL代码中,这很少是你想要的。

VHDL通过使用分辨率函数处理多个驱动程序:函数应用于驱动信号的所有值,然后将其输出写入信号;有关使用的分辨率表,请参阅this

我强烈建议不要使用std_logicstd_logic_vector等已解析的类型,并查看未解析的吊坠std_ulogicstd_ulogic_vector(注意{{1} }});如果您已经使用过那些,那么您的错误将在详细说明中被捕获。

其次,正如评论中所述,从uX3永远不会分配任何值,只留下X0