library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity equation_tb is
end equation_tb;
architecture Behavioral of equation_tb is
signal x, y, z, t, w : std_logic;
signal F : std_logic;
begin
UUT : entity work.equation port map (x, y, z, t, w, F);
process
begin
x <= '0', '1' after 160 ns;
y <= '0', '1' after 80 ns, '0' after 160 ns, '1' after 240 ns;
z <= '0', '1' after 40 ns, '0' after 80 ns, '1' after 120 ns, '0' after 160 ns, '1' after 200 ns, '0' after 240 ns, '1' after 280 ns;
t <= '0', '1' after 20 ns, '0' after 40 ns, '1' after 60 ns, '0' after 80 ns, '1' after 100 ns, '0' after 120 ns, '1' after 140 ns, '0' after 160 ns, '0' after 180 ns, '1' after 200 ns, '0' after 220 ns, '1' after 240 ns, '0' after 260 ns, '1' after 280 ns, '0' after 300 ns;
end process;
end Behavioral;
Добрый день, а можно как-то проще написать. После «t» я должен написать это для «w», и оно будет меняться каждые 10 нс, поэтому строка будет очень длинной.
Я думал об использовании цикла for или if, но не знал, что делать.
Здесь не нужен процесс. Если вы используете процесс, добавьте wait ;
перед end process;
, иначе получится бесконечный цикл.
Вы можете использовать отдельные процессы для каждого сигнала. Поскольку каждый процесс без блокировки wait
будет повторяться, это дает вам циклические сигналы, как вы хотите.
architecture Behavioral of equation_tb is
signal x : std_logic := '0';
signal y : std_logic := '0';
signal z : std_logic := '0';
signal t : std_logic := '0';
signal w : std_logic := '0';
signal F : std_logic;
begin
UUT : entity work.equation port map (x, y, z, t, w, F);
process
begin
wait for 160 ns;
x <= not x;
end process;
process
begin
wait for 80 ns;
y <= not y;
end process;
process
begin
wait for 40 ns;
z <= not z;
end process;
process
begin
wait for 20 ns;
t <= not t;
end process;
process
begin
wait for 10 ns;
w <= not w;
end process;
end Behavioral;
У вас, вероятно, была опечатка в вашей последовательности для t
, поскольку вы написали '0' after 160 ns, '0' after 180 ns
. Я проигнорировал это.
Вы могли бы упростить свой код, если бы просто использовали присваивания, чтобы делать то же самое: w <= not w after 10 ns;
и так далее.
Если бы не дополнительное назначение «0» на t на 180 нс, вы могли бы использовать совокупное назначение из счетчика. Я не могу придумать никакой причины, по которой при дополнительном присвоении 0 представлены все 16 двоичных значений совокупных входов.
architecture foo of equation_tb is
signal x, y, z, t : std_logic := '0';
signal w, F : std_logic;
use ieee.numeric_std.all;
signal counter: unsigned (3 downto 0) := (others => '0');
begin
UUT: entity work.equation port map (x, y, z, t, w, F);
STIMULI:
process
begin
for i in 0 to 15 loop
(x, y, z, t) <= std_logic_vector(counter);
counter <= counter + 1;
wait for 20 ns;
end loop;
wait;
end process;
end architecture;
Который дает:
Это было сделано с использованием фиктивной сущности и архитектуры для уравнения, потому что вы использовали создание экземпляра компонента с использованием зарезервированного слова entity
.
Похоже, цикл for может помочь - похоже, что каждая итерация ждет еще один кусок времени? vhdlwhiz.com/for-loop