Isim 模拟中未显示信号



我正在研究一个应该做很多 functionalities.my 代码的VHDL代码,而且我的测试台工作正常。 但在模拟中,没有初始化任何内容。 而且我真的不明白为什么以及我的错误到底在哪里。如果有人帮助我解决问题,我将不胜感激。 "当 enable 是 '1' 并且在 rising_edge clk 中时,代码应该工作,并且对于不同的 S 值,它应该做不同的事情。

我的模拟错误是:

错误:在 0 ps 时:延迟 20000 fs 不大于目标信号 a 分配的先前波形元素延迟 20000 fs 错误: 进程中 MyProject_tb.vhd:34

我的代码是:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.NUMERIC_STD.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ALU IS
port(
A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
enable : IN STD_LOGIC;
clk : IN STD_LOGIC;
s : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
carry : OUT STD_LOGIC;
c : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0)   
);
END ALU;

ARCHITECTURE Project of ALU is
signal mult : STD_LOGIC_VECTOR(7 DOWNTO 0);
signal temp : std_logic_vector(3 DOWNTO 0);
begin
p1: PROCESS(enable, clk, s)
BEGIN
IF (enable = '1' AND (clk'EVENT AND clk = '1') AND s = "00") THEN
-- cyclic shift on B
carry <= '0';
c(0) <= B(3);
l1: FOR i IN 1 TO 3 LOOP
c(i) <= B(i-1);
END LOOP;
END IF;
END PROCESS;

p2 : PROCESS(enable, clk, s)
BEGIN
IF (enable = '1') THEN
IF (clk'EVENT AND clk = '1') THEN
IF (s = "01") THEN
--Multiply A and B  
c <= "0000";                      
carry <= '0';
mult <= std_logic_vector(unsigned(A) * unsigned(B));
c <= ("0000" & c);
c <= mult;
END IF;
END IF;
END IF;
END PROCESS;
p3: PROCESS(enable, clk, s)
BEGIN
IF (enable = '1') THEN
IF (clk'EVENT AND clk = '1') THEN
IF (s = "10") THEN
--Two's Compliment of A
carry <= '0';
temp <= not A;
c <= std_logic_vector(unsigned(temp) + 1);
END IF;
END IF;
END IF;
END PROCESS;
p4: PROCESS(A , B, enable, clk, s)
BEGIN
IF (enable = '1') THEN
IF (clk'EVENT AND clk = '1') THEN
IF (s = "11") THEN
--4-bit Comparator
c <= "0011";
IF (unsigned(A) > unsigned(B)) THEN
c <= "1111";
elsif (unsigned(A) < unsigned(B)) THEN
c <= "0000";
END IF;
END IF;
END IF;
END IF;
END PROCESS;
end Project;

还有我的测试台:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.NUMERIC_STD.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY alu_test IS
END alu_test;
ARCHITECTURE test of alu_test IS
COMPONENT ALU IS
port(
A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
enable : IN STD_LOGIC;
clk : IN STD_LOGIC;
s : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
carry : OUT STD_LOGIC;
c : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0)   
);
END COMPONENT;

SIGNAL a : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL b : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL c : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL s : STD_LOGIC_VECTOR(1 downto 0) := "00";
SIGNAL en : STD_LOGIC := '1';
SIGNAL cl : STD_LOGIC := '1';
SIGNAL car : STD_LOGIC;

BEGIN
uut : ALU PORT MAP(a, b ,en, cl, s , car, c);
en <= '1';
cl <= not cl AFTER 20 NS;
a <= "0001" , "1101" AFTER 20 NS, "1110" AFTER 20 NS;
b <= "1101" , "0101" AFTER 20 NS, "1111" AFTER 20 NS;
s <= "01" , "00" AFTER 20 NS, "10" AFTER 20 NS;

END test;

以及我的模拟的样子: 在此处输入图像描述

a <= "0001" , "1101" AFTER 20 NS, "1110" AFTER 20 NS;
b <= "1101" , "0101" AFTER 20 NS, "1111" AFTER 20 NS;
s <= "01" , "00" AFTER 20 NS, "10" AFTER 20 NS;

不要做你最有可能期望他们做的事情。

您很可能想要一个"0001"、"1101"和"1110"序列,用于信号a,中间有20 ns。否则(如错误消息所示),您将同时(20 ns后)将"1101"和"1110"分配给a,这是不可能的。因此,请将您的行重新格式化为:

a <= "0001" , "1101" AFTER 20 NS, "1110" AFTER 40 NS;

不过,我更喜欢使用wait语句(在流程内)来摆动刺激信号,例如:

process
begin
a <= "0001";
wait for 20 ns;
a <= "1101";
-- and so on...

在此之后,您的设计(ALU)中发现了一些错误,但修复它们将是另一个问题......

最新更新