Как поставить нужные входы для симуляции 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;  

Прагмы не являются абсолютно необходимыми, но они являются хорошей привычкой добавлять к любому не синтезируемому коду внутри модуля, предназначенного для синтеза.

В вашем примере сила не должна использоваться.

Другие вопросы по тегам