2015-05-09 2 views
0

Я написал объект для 4-разрядного Adder. Этот объект использует другой порт 1 битовых полный сумматора в качестве видимого в коде:Сигналы в форме VHDL testbench не инициализированы

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 


entity adder4bit is 
Port (a,b : in STD_LOGIC_VECTOR(3 downto 0); 
     cin : in STD_LOGIC; 
     sum : out STD_LOGIC_VECTOR(3 downto 0); 
     cout : out STD_LOGIC); 
end adder4bit; 

architecture Behavioral of adder4bit is 

component FA is port(a,b,cin : in STD_LOGIC; 
    sum,cout : out STD_LOGIC); 
end component; 
signal c : std_logic_vector(2 downto 0); 

begin 

fa0: FA port map(a(0),b(0),cin,sum(0),c(0)); 
fa1: FA port map(a(1),b(1),c(0),sum(1),c(1)); 
fa2: FA port map(a(2),b(2),c(1),sum(2),c(2)); 
fa3: FA port map(a(3),b(3),c(2),sum(3),cout); 

end Behavioral; 

Однако следующий TestBench не кажется, что работает как всегда получают значения неиницализированных в сигнале. Я не уверен в коде Waveform!

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 


ENTITY adder4bit_TB IS 
END adder4bit_TB; 

ARCHITECTURE behavior OF adder4bit_TB IS 

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

COMPONENT adder4bit 
PORT(
    a : IN std_logic_vector(3 downto 0); 
    b : IN std_logic_vector(3 downto 0); 
    cin : IN std_logic; 
    sum : OUT std_logic_vector(3 downto 0); 
    cout : OUT std_logic 
    ); 
END COMPONENT; 




    --Inputs 
    signal a : std_logic_vector(3 downto 0) := (others => '0'); 
    signal b : std_logic_vector(3 downto 0) := (others => '0'); 
    signal cin : std_logic := '0'; 

    --Outputs 
    signal sum : 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: adder4bit PORT MAP (
     a => a, 
     b => b, 
     cin => cin, 
     sum => sum, 
     cout => 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; 

     a <= a + '1'; 
    end process; 

    stim_proc1: process 
    begin   
     -- hold reset state for 100 ns. 
     wait for 50 ns; 

     b <= b + '1'; 
    end process; 

    stim_proc2: process 
    begin   
     -- hold reset state for 100 ns. 
     wait for 25 ns; 

     cin<=not cin; 
    end process; 

    END; 

То, что я пытаюсь достичь, - это увеличение a и b с интервалом в 100 и 50 нс соответственно. Но в форме волны каждый сигнал кажется неинициализированным! Что я делаю не так??

Редактировать 1: Код для Adder4bit и FA:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
entity FA is 
    Port (a,b,cin : in STD_LOGIC; 
      cout,sum : out STD_LOGIC); 
end FA; 

architecture Behavioral of FA is 
begin 

    sum <= a xor b xor cin; 
    cout <= (a and b) or (b and cin) or (cin and a); 

end Behavioral; 

Adder4bit:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity adder4bit is 
    Port (a,b : in STD_LOGIC_VECTOR(3 downto 0); 
      cin : in STD_LOGIC; 
      sum : out STD_LOGIC_VECTOR(3 downto 0); 
      cout : out STD_LOGIC); 
end adder4bit; 

architecture Behavioral of adder4bit is 

    component FA is port(a,b,cin : in STD_LOGIC; 
     sum,cout : out STD_LOGIC); 
    end component; 
    signal c : std_logic_vector(2 downto 0); 

begin 

    fa0: FA port map(a(0),b(0),cin,sum(0),c(0)); 
    fa1: FA port map(a(1),b(1),c(0),sum(1),c(1)); 
    fa2: FA port map(a(2),b(2),c(1),sum(2),c(2)); 
    fa3: FA port map(a(3),b(3),c(2),sum(3),cout); 

end Behavioral; 
+0

Пожалуйста, добавьте код FullAdder. – Paebbels

+0

Скажите, пожалуйста, какой VHDL-симулятор вы используете. – user1155120

+0

Привет, Извините за то, что так поздно. Я использую ISim Ver 14.1 –

ответ

0

+ в, например, a + '1' не определен с использованием только показанных пакетов, так и для быстрого запуска можно добавить:

use ieee.std_logic_unsigned.all; 

для использования нестандартного пакета Synopsys. В противном случае рассмотрите:

use ieee.numeric_std.all; 

для стандартного пакета, который требует небольшой перезаписи.

Кроме того, проверьте компиляции предупреждений/ошибок, так как это, вероятно, показывая что-то вроде:

Нет осуществимые записей для инфиксной оператора «+».

0

Я добавил поведенческую модель один битном Полный сумматор и ранее конвертируется ваш испытательный стенд, чтобы использовать пакет numeric_std, как Morten также указывает:

library ieee; 
use ieee.std_logic_1164.all; 

entity FA is 
    port (
     a,b,cin: in std_logic; 
     sum, cout: out std_logic 
    ); 
end entity; 

architecture foo of FA is 
begin 
    sum <= a xor b xor cin; 
    cout <= (a and b) or (a and cin) or (b and cin); 
end architecture; 

library ieee; 
use ieee.std_logic_1164.all; 

entity adder4bit is 
    port ( 
     a,b : in std_logic_vector(3 downto 0); 
     cin : in std_logic; 
     sum : out std_logic_vector(3 downto 0); 
     cout : out std_logic 
    ); 
end adder4bit; 

architecture behavioral of adder4bit is 

    component fa is 
     port ( 
      a,b,cin : in std_logic; 
      sum,cout : out std_logic 
     ); 
    end component; 

    signal c : std_logic_vector(2 downto 0); 

begin 

fa0: fa port map(a(0),b(0),cin,sum(0),c(0)); 
fa1: fa port map(a(1),b(1),c(0),sum(1),c(1)); 
fa2: fa port map(a(2),b(2),c(1),sum(2),c(2)); 
fa3: fa port map(a(3),b(3),c(2),sum(3),cout); 

end architecture behavioral; 

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity adder4bit_tb is 
end adder4bit_tb; 

architecture behavior of adder4bit_tb is 

    component adder4bit 
     port (
      a : in std_logic_vector(3 downto 0); 
      b : in std_logic_vector(3 downto 0); 
      cin : in std_logic; 
      sum : out std_logic_vector(3 downto 0); 
      cout : out std_logic 
     ); 
    end component; 

--inputs 
    signal a : std_logic_vector(3 downto 0) := (others => '0'); 
    signal b : std_logic_vector(3 downto 0) := (others => '0'); 
    signal cin : std_logic := '0'; 

--outputs 
    signal sum : std_logic_vector(3 downto 0); 
    signal cout : std_logic; 

begin 

uut: adder4bit 
    port map (
     a => a, 
     b => b, 
     cin => cin, 
     sum => sum, 
     cout => cout 
    ); 

stim_proc: 
    process 
    begin  
     wait for 100 ns; 

     a <= std_logic_vector(unsigned(a) + 1); 
    end process; 

stim_proc1: 
    process 
    begin   
     wait for 50 ns; 

     b <= std_logic_vector(unsigned(b) + 1); 
    end process; 

stim_proc2: 
    process 
    begin   
     wait for 25 ns; 
     cin <= not cin; 
    end process; 

end architecture; 

Это произвело:

ghdl -a adder4bit.vhdl
ghdl -e adder4bit_tb
ghdl -r adder4bit_tb --stop-time = 1000ns --wave = adder4bit_tb.ghw
./adder4bit_tb:info: моделирование останавливала --stop времени

adder4bit_tb.png (кликабельно)

Как вы можете видеть, нет неинициализированных значений в осциллограммах.

Проверьте наличие сообщений о несвязанных компонентах, или ваш компонент FA не работает?

Смежные вопросы