【问题标题】:VHDL Adder Test BenchVHDL 加法器测试台
【发布时间】:2013-09-06 18:23:04
【问题描述】:

我是 VHDL 新手,我正在使用 4 个全加器制作一个 4 位加法器。我创建了一个测试台来查看加法器是否正常工作,并且在 ans 中我得到了 UUUU 的值。从我读到的是,该过程没有被执行。我不知道如何解决这个问题,任何帮助将不胜感激。

这里是测试台

ENTITY Adder4_Test IS
END Adder4_Test;

ARCHITECTURE behavior OF Adder4_Test IS 

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT Adder4
PORT(
     X : IN  STD_LOGIC_vector(3 downto 0);
     Y : IN  STD_LOGIC_vector(3 downto 0);
     Ans : OUT STD_LOGIC_VECTOR(3 downto 0);
     Cout : OUT STD_LOGIC
    );
END COMPONENT;


--Inputs
signal X : STD_LOGIC_vector(3 downto 0) := (others => '0');
signal Y : STD_LOGIC_vector(3 downto 0) := (others => '0');


--Outputs
signal Ans : STD_LOGIC_vector(3 downto 0);
signal Cout : STD_LOGIC;
-- No clocks detected in port list. Replace <clock> below with 
-- appropriate port name 

--constant <clock>_period : time := 10 ns;

BEGIN

-- Instantiate the Unit Under Test (UUT)
uut: Adder4 PORT MAP (
      X,
      Y, 
      Ans,
      Cout
    );

-- Clock process definitions
--<clock>_process :process
--begin
    --<clock> <= '0';
    --wait for <clock>_period/2;
    --<clock> <= '1';
    --wait for <clock>_period/2;
--end process;


-- Stimulus process
stim_proc: process
begin       
  -- hold reset state for 100 ns.
  --wait for 100 ns;    

  --wait for <clock>_period*10;

  -- insert stimulus here 

    -- Case 1 that we are testing.
        X <= "0000";
        Y <= "0000";
        wait for 10 ns;
        assert ( Ans = "0000" )report "Failed Case 1 - Ans" severity error;
        assert ( Cout = '0' )   report "Failed Case 1 - Cout" severity error;
        wait for 40 ns;

    -- Case 2 that we are testing.

        X <= "1111";
        Y <= "1111";
        wait for 10 ns;
        assert ( Ans = "1110" )report "Failed Case 2 - Ans" severity error;
        assert ( Cout = '1' )   report "Failed Case 2 - Cout" severity error;
        wait for 40 ns;



  wait;
 end process;

 END;

这是 Adder4

entity Adder4 is
Port ( X : in  STD_LOGIC_vector (3 DOWNTO 0);
       Y : in  STD_LOGIC_vector (3 DOWNTO 0);
       Ans: out  STD_LOGIC_vector (3 DOWNTO 0);
          Cout: out STD_LOGIC);
end Adder4;

architecture Structure of Adder4 is

component FullAdder is
Port ( X : in STD_LOGIC;
       Y : in STD_LOGIC;
       Cin : in STD_LOGIC;
          Sum : out STD_LOGIC;
          Cout : out STD_LOGIC);
end  component;

signal c0, c1, c2, c3: STD_LOGIC;

  begin
c0 <='0';
b_adder0: FullAdder port map (X(0), Y(0), c0, Ans(0), c1);
b_adder1: FullAdder port map (X(1), Y(1), c1, Ans(1), c2);
b_adder2: FullAdder port map (X(2), Y(2), c2, Ans(2), c3);
b_adder3: FullAdder port map (X(3), Y(3), c3, Ans(3), Cout);


 end Structure;

这里是全加器

entity FullAdder is
Port ( X : in  STD_LOGIC;
       Y : in  STD_LOGIC;
       Cin : in  STD_LOGIC;
       Sum : out  STD_LOGIC;
       Cout : out  STD_LOGIC);
end FullAdder;

 architecture Behavioral of FullAdder is

component Xor_Model is
Port ( A : in  STD_LOGIC;
       B : in  STD_LOGIC;
       C : in  STD_LOGIC;
       Z : out  STD_LOGIC);
end  component;



  begin

Cout <= ((X and Y) or (Y and Cin) or (X and Cin));
Sum <= (X AND (NOT Y) AND (NOT Cin)) OR ((NOT X) AND Y AND (NOT Cin)) OR
((NOT X) AND (NOT Y) AND Cin) OR (X AND Y AND Cin) after 5ns;
xorLabel: Xor_Model
    Port Map ( A => X, B => Y, C => Cin, Z => Sum);


 end Behavioral;

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    在添加了您未提供的上下文子句、将 5ns 分成 5ns 并确保以正确的顺序分析 Addr4 中所需的实体后,我尝试使用 ghdl 运行模拟,但我立即收到了错误消息”

    Adder4.vhdl:28:1:warning: component instance "xorlabel" is not bound
    Adder4.vhdl:12:15:warning: (in default configuration of fulladder(behavioral))
    

    这适用于 FullAdder。看到它是一个 3 输入 XOR,我添加了一个:

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity Xor_model is
        Port (A:    in  std_logic;
              B:    in  std_logic;
              C:    in  std_logic;
              Z:    out std_logic
        );
    end entity;
    
    architecture behavioral of Xor_model is
    begin
        Z <= A xor B xor C;
    end behavioral;
    

    从 FullAdder 中的 Sum 分配延迟开始,直到 5 ns 之前,'U's on ans。

    我在 50 ns 时得到了“X”,并在 5 ns 后从同一个延迟分配中清除。请注意,由于短路逻辑运算符,LSB 为“0”。

    将 FF 添加到 FF 得到 FE(正确,不考虑正确显示为“1”的进位)。

    摆脱最初的“U”可以通过以下两种方式之一完成。将已知值分配给 Sum 作为默认值,而不是依赖默认值,或者消除分配给 Sum 的延迟。

    “X”也取决于来自 FullAdders 的 Sum,在等待 5 ns 时输入会有转换。

    在行为组合模型中,延迟并不是特别具有表现力,尤其是当您不将延迟用于子项时。如果您一直延迟贡献信号,然后基于门延迟的特定网络的信号路径,Sum 将显示在正确的累积延迟时间。您还可以使用无延迟生成的中间 Sum(具有不同的信号名称),并在延迟后将其分配给输出端口 Sum,从而消除“X”。将 5 ns 后从 FullAdder 移动到 Adder4:

    在 FullAdder 中:

    ((NOT X) AND (NOT Y) AND Cin) OR (X AND Y AND Cin) ; --after 5 ns;
    

    在 Adder4 中:

    architecture Structure of Adder4 is
    signal sum: std_logic_vector(3 downto 0);
    
    b_adder0: FullAdder port map (X(0), Y(0), c0, sum(0), c1);
    b_adder1: FullAdder port map (X(1), Y(1), c1, sum(1), c2);
    b_adder2: FullAdder port map (X(2), Y(2), c2, sum(2), c3);
    b_adder3: FullAdder port map (X(3), Y(3), c3, sum(3), Cout);
    

    并为ans添加延迟分配总和:

    Ans

    如果你在 Adder4 端口的 Ans 上设置默认值 '0':

       Ans: out  STD_LOGIC_vector (3 DOWNTO 0) := (others => '0');
    

    你可以去掉最初的“U”:

    并澄清“U”的存在,直到在 5 ns 延迟之后的输出(Ans)上出现事务。使用 (others => 'X') 可能更合适

    【讨论】:

    • 所有操作都无需接触测试台或组件声明
    • 如果答案不能解决您的实际问题,请说明 UUUU 是否稍后实际更改为定义的值。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多