Как поставить нужные входы для симуляции VHDL (Force Command)
Ниже приведен код VHDL для счетчика, использующего триггеры. Здесь мы предполагаем, что триггеры срабатывают с положительным фронтом.
Внутри архитектуры я объявил Q (текущее состояние) и D как 4-битный логический вектор.
Я назначил все выходные сигналы (от Z0 до Z7) и значения D, чтобы они соответствовали логическим выражениям, определенным минимальными входными уравнениями для счетчика и триггеров соответственно.
В конце кода вызывается процесс для имитации поведения очистки (ClrN) и тактового генератора (CLK).
Мой вопрос:
Код работает правильно, но я столкнулся с проблемой симуляции на тестовом стенде.
В симуляции нам нужно показать, что схема началась с состояния 1000, а затем проходит через каждое состояние в правильном порядке.
Вкратце: как мне показать сигналы Q и D в симуляции.
Это та часть, в которой я не уверен, как это сделать.
Мне сказали использовать команды форсирования для установки желаемых входов.
Например:
force ClrN 0 0, 1 20
force CLK 1000 0
force CLK 0 0, 1 40 -repeat 80
Но я не уверен, где и как его использовать.
Ниже приведен код VHDL:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity counter is
port (CLK, ClrN : in std_logic;
Z0 : out std_logic;
Z1 : out std_logic;
Z2 : out std_logic;
Z3 : out std_logic;
Z4 : out std_logic;
Z5 : out std_logic;
Z6 : out std_logic;
Z7 : out std_logic);
end counter;
architecture Behavioral of counter is
signal Q: std_logic_vector(0 to 3);
signal D: std_logic_vector(0 to 3);
begin
u1: process(Q)
begin
Z0 <= Q(0) and not Q(1) and not Q(3);
Z1 <= Q(0) and Q(1);
Z2 <= not Q(0) and Q(1) and not Q(2);
Z3 <= Q(1) and Q(2);
Z4 <= not Q(1) and Q(2) and not Q(3);
Z5 <= Q(2) and Q(3);
Z6 <= not Q(0) and not Q(2) and Q(3);
Z7 <= Q(0) and Q(3);
D(0) <= not Q(1) and not Q(2);
D(1) <= not Q(2) and not Q(3);
D(2) <= not Q(0) and not Q(3);
D(3) <= not Q(0) and not Q(1);
end process u1;
u2: process(CLK,ClrN)
begin
if ClrN = '0' then
Q <= "1000";
elsif Rising_Edge (CLK) then
Q <= D;
end if;
end process u2;
end Behavioral;
Вот мой стенд VHDL:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY tb IS
END tb;
ARCHITECTURE behavior OF tb IS
COMPONENT counter
PORT(
CLK : IN std_logic;
ClrN : IN std_logic;
Z0 : OUT std_logic;
Z1 : OUT std_logic;
Z2 : OUT std_logic;
Z3 : OUT std_logic;
Z4 : OUT std_logic;
Z5 : OUT std_logic;
Z6 : OUT std_logic;
Z7 : OUT std_logic
);
END COMPONENT;
--Inputs
signal CLK : std_logic := '0';
signal ClrN : std_logic := '0';
--Outputs
signal Z0 : std_logic;
signal Z1 : std_logic;
signal Z2 : std_logic;
signal Z3 : std_logic;
signal Z4 : std_logic;
signal Z5 : std_logic;
signal Z6 : std_logic;
signal Z7 : std_logic;
-- Clock period definitions
constant CLK_period : time := 10 ns;
BEGIN
-- Instantiate the Unit Under Test (UUT)
uut: counter PORT MAP (
CLK => CLK,
ClrN => ClrN,
Z0 => Z0,
Z1 => Z1,
Z2 => Z2,
Z3 => Z3,
Z4 => Z4,
Z5 => Z5,
Z6 => Z6,
Z7 => Z7
);
-- Clock process definitions
CLK_process :process
begin
CLK <= '0';
wait for CLK_period/2;
CLK <= '1';
wait for CLK_period/2;
end process;
-- Stimulus process
stim_proc: process
begin
-- -- hold reset state for 10 ns.
wait for 10 ns;
ClrN <= '1';
wait;
end process;
END;
Где и как мне добавить сигналы Q и D к моему испытательному стенду, чтобы получить симуляцию, которая показывает, что схема началась с состояния 1000, а затем проходит через каждое состояние в правильном порядке. и я даже использую силу команды?
1 ответ
Один из способов документировать, что происходит в симуляции (в дополнение к форме волны), - записать нужные сигналы в вывод (например, printf в c) или в файл (например, fprintf).
Для этого сначала включите пакет textio:
use std.textio.all;
use ieee.std_logic_textio.all;
а затем изменить ваш процесс:
u2: process(CLK,ClrN)
file f0 : text is out "output.txt";
begin
if ClrN = '0' then
Q <= "1000";
elsif Rising_Edge (CLK) then
--pragma translate_off
write(output, "Q:" & to_string(Q) & " D:" & to_string(D) & lf);
write(f0, "Q:" & to_string(Q) & " D:" & to_string(D) & lf);
--pragma translate_on
Q <= D;
end if;
end process u2;
Прагмы не являются абсолютно необходимыми, но они являются хорошей привычкой добавлять к любому не синтезируемому коду внутри модуля, предназначенного для синтеза.
В вашем примере сила не должна использоваться.