这是我简单的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;
答案 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;
当在测试平台和测试平台进行分析,详细阐述和模拟之前进行分析时,我们最终得到:
不显示X
并增加X和I。
此testbench版本依赖于自然范围整数的numeric_std包to_unsigned转换,注意到X和I具有在循环迭代方案隐式声明中指定的范围。
是否可以使用原始测试平台?不适用于j和k的阈值测试。将会发生的是k将经历8次迭代,然后j将经历4次迭代:
使用带有信号迭代器的while循环比使用带有可变迭代器的for循环有点困难。
答案 1 :(得分:0)
您的代码中存在两个问题:首先,X <= X3 & X2 & X1 & X0;
将X3
连接到X0
并将结果分配给X
。在tb
过程中,您再次分配给X
,创建通常称为&#34;多个驱动程序&#34;,即。代码的多个部分驱动(可能是不同的)值到同一信号。在编写良好的VHDL代码中,这很少是你想要的。
VHDL通过使用分辨率函数处理多个驱动程序:函数应用于驱动信号的所有值,然后将其输出写入信号;有关使用的分辨率表,请参阅this。
我强烈建议不要使用std_logic
或std_logic_vector
等已解析的类型,并查看未解析的吊坠std_ulogic
和std_ulogic_vector
(注意{{1} }});如果您已经使用过那些,那么您的错误将在详细说明中被捕获。
其次,正如评论中所述,从u
到X3
永远不会分配任何值,只留下X0
。