как использовать список чувствительности в нескольких процессах, которые зависят - PullRequest
0 голосов
/ 12 апреля 2019

Я пишу код для простого арифметического уравнения d = 1 + (k * o).В моем коде три процесса. Третий процесс зависит от второго, а второй - от первого. Я не могу правильно составить список чувствительности.Выходные данные остаются неопределенными.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity dcalc is
    Port ( k : in  STD_LOGIC_VECTOR (7 downto 0);
           o : in  STD_LOGIC_VECTOR (7 downto 0);
           e : in  STD_LOGIC_VECTOR (7 downto 0);
           d : out  STD_LOGIC_VECTOR (7 downto 0);
              clk: in  STD_LOGIC);
end dcalc;

architecture Behavioral of dcalc is
COMPONENT divd
    PORT(
         d1 : IN  std_logic_vector(7 downto 0);
         e : IN  std_logic_vector(7 downto 0);
         remi : OUT  std_logic_vector(7 downto 0);
         clk : IN  std_logic
        );
    END COMPONENT;
signal  endp1,d2,k1,o1,e1,d3: unsigned (7 downto 0);
--signal d3:std_logic_vector(7 downto 0);
begin

--process 1
process(k,o,e)
begin
if(clk'event and clk='1') then
k1<=unsigned(k);
o1<=unsigned(o);
e1<=unsigned(e);
endp1<=x"01";
end if;
end process; 

--process 2
process(endp1)
begin
if(clk'event and clk='1') then
d2<=1+(k1*o1);
end if;
end process;

--process 3
process(d2)
begin
if(clk'event and clk='1') then
d<=std_logic_vector(d2);
end if;
end process;

end Behavioral;

В первом процессе преобразование завершено.Когда процесс 1 завершен, тогда d2 должен быть рассчитан в процессе 2. Когда d2 рассчитывается в процессе 2, d должен быть обновлен в процессе 3. Вот мой код испытательного стенда:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY ccalctb IS
END ccalctb;

ARCHITECTURE behavior OF ccalctb IS 

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

    COMPONENT dcalc
    PORT(
         k : IN  std_logic_vector(7 downto 0);
         o : IN  std_logic_vector(7 downto 0);
         e : IN  std_logic_vector(7 downto 0);
         d : OUT  std_logic_vector(7 downto 0);
         clk : IN  std_logic
        );
    END COMPONENT;


   --Inputs
   signal k : std_logic_vector(7 downto 0) := (others => '0');
   signal o : std_logic_vector(7 downto 0) := (others => '0');
   signal e : std_logic_vector(7 downto 0) := (others => '0');
   signal clk : std_logic := '0';

    --Outputs
   signal d : std_logic_vector(7 downto 0);

   -- Clock period definitions
   constant clk_period : time := 10 ns;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: dcalc PORT MAP (
          k => k,
          o => o,
          e => e,
          d => d,
          clk => clk
        );

   -- 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 100 ns.
      wait for 100 ns;  
k<=x"07";
o<=x"08";
e<=x"07";
      wait for clk_period*10;

      -- insert stimulus here 

      wait;
   end process;

END;

Пожалуйста, помогите.Вот результат моделирования после изменения всего списка чувствительности процесса только к clk:

enter image description here

1 Ответ

1 голос
/ 12 апреля 2019

В синхронном (синхронизированном) процессе список чувствительности должен содержать только часы (и, возможно, асинхронный сброс):

process(clk)
begin
  if RISING_EDGE(clk) then
    k1<=unsigned(k);
    o1<=unsigned(o);
    e1<=unsigned(e);
    endp1<=x"01";
  end if;
end process;

С вашим исходным списком чувствительности изменения на входах D триггера (или регистра, который является вектором D триггера) инициировали выполнение процесса, но, как мы знаем, выход не изменяется немедленно, он ожидает край часов. И затем, когда наступил край времени, clk не было в списке чувствительности, поэтому симуляция проигнорировала его. В результате ваши выходы никогда не обновляются в симуляции.

(Напротив, синтез имеет тенденцию игнорировать ваш список чувствительности и просто поместить логический элемент, настроенный как подлинный D-триггер, который будет корректно обновляться по фронту тактовой частоты)

...