0

私は 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;
4

1 に答える 1

2

提供されていないコンテキスト句を追加し、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 だったので、1 つ追加しました。

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 まで ans に「U」がありました。

同じ遅延割り当てから 5 ns 後にクリアされた ans で 50 ns で「X」を取得しました。短絡論理演算子のため、LSB が「0」であることに注意してください。

FF に FF を追加すると FE が得られました (「1」として正しく表示されたキャリーアウトに関係なく正しい)。

最初の 'U' を取り除くには、2 つの方法のいずれかを実行できます。デフォルトに依存するのではなく、既知の値をデフォルト値として Sum に割り当てるか、Sum への割り当ての遅延を取り除きます。

X は FullAdders からの Sum にも依存しており、5 ns 待機中に入力に遷移があります。

Addr4_Test 波形

動作の組み合わせモデルでは、遅延は特に表現力がありません。特に、サブタームに遅延を使用しない場合はそうです。ゲート遅延に基づいて特定のネットの信号パスに沿って信号を遅延させると、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 <= 5 ns 後の合計。

遅延を Adder4 に移動

Adder4 ポートの Ans にデフォルト値の '0' を設定すると、次のようになります。

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

最初の「U」を取り除くことができます:

UUUUを取り除く

また、5 ns の遅延の後、出力 (Ans) にトランザクションが発生するまで、「U」が存在することを明確にします。使用する方が適切かもしれません (その他 => 'X')

于 2013-09-06T23:10:54.980 に答える