VHDL: внутренний сигнал в компоненте не запущен

Я новичок в VHDL. У меня есть этот объект (сокращенно):

entity foo is
  port (CLK   : in  std_logic;
        out_A : out std_logic;
        );
end foo;

architecture Structure of foo is

  component D_Flipflop
    port (
      D     : in  std_logic;
      CLK   : in  std_logic;
      Q     : out std_logic;
      not_Q : out std_logic);
  end component;

  signal D_A, qA, not_qA : std_logic;

begin
  my_Flipflop : D_Flipflop
    port map(
      not_qA,
      CLK,
      qA,
      not_qA
      );
end Structure;

Как видите, я хочу использовать D_Flipflop как Toggle-Flipflop, поэтому я перенаправил вывод на вход по сигналу not_qA (это возможно?). Проблема в том, что извне в качестве входных данных виден только порт CLK из foo и, по крайней мере, в симуляторе Vivado, сигналы qA и not_qA никогда не оцениваются.

Это архитектура D_Flipflop:

architecture Behavioral of D_Flipflop is

begin

  set_state : process(CLK, D)
    variable state : std_logic := '0';
  begin
    if falling_edge(CLK) then
      state := D;
      Q     <= state;
      not_Q <= not state;
    end if;
  end process set_state;

end Behavioral;

Я много гуглил для этого. Без шансов. Любые решения?


person Monkey Supersonic    schedule 10.06.2015    source источник
comment
Ваш код не является минимальным, полным и поддающимся проверке примером. Помимо отсутствующих предложений контекста, в foo есть три ошибки, препятствующие его работе. В объявлении порта есть дополнительный ';', qA не назначено out_A, а not_qA не имеет назначенного начального значения (триггер бесконечно переключает 'U'). Также обратите внимание, что D не требуется в списке чувствительности процесса.   -  person    schedule 10.06.2015
comment
И я уверяю вас, что not_qA оценивается, он отображается (ошибочно) как D в списке конфиденциальности.   -  person    schedule 10.06.2015
comment
@ Дэвид Кунц. Я изо всех сил старался свести его к минимуму. Я не могу сделать код еще меньше и добавить контекст, поэтому я подумал об этом как о компромиссе.   -  person Monkey Supersonic    schedule 11.06.2015


Ответы (1)


Дело не в том, как вы указываете в заголовке вопроса, что внутренний сигнал для компонента my_Flipflop не сработал, а в том, что нет способа предоставить известное состояние немета-значения - не «U» это «U».

Это вызвано оператором not. Обратитесь к not_table в теле пакета std_logic_1164:

    -- truth table for "not" function
    CONSTANT not_table: stdlogic_1d :=
    --  -------------------------------------------------
    --  |   U    X    0    1    Z    W    L    H    -   |
    --  -------------------------------------------------
         ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );

Смотрите изменения и добавленный тестовый стенд:

library ieee;                   -- Added Context clause (MCVe)
use ieee.std_logic_1164.all;

entity D_Flipflop is
    port (
        D:      in  std_logic;
        CLK:    in  std_logic;
        Q:      out std_logic; 
        not_Q:  out std_logic := '0'
);
end entity;

architecture behavioral of D_Flipflop is  
begin
set_state:  
    process (CLK)                -- removed D from sensitivity list
        variable state:  std_logic := '0';  
    begin
        if falling_edge(CLK) then
            state := D;
            Q <= state;
            not_Q <= not state;
        end if;
    end process;  
end architecture;

library ieee;                    -- added context clause
use ieee.std_logic_1164.all;

entity foo is
    port (
        CLK:    in  std_logic;
        out_A:  out std_logic     -- removed extra ';'
    );
end entity;

architecture Structure of foo is

    component D_Flipflop is
        port (
            D:      in  std_logic;
            CLK:    in  std_logic;
            Q:      out std_logic;
            not_Q:  out std_logic
      );
  end component;

    -- signal D_A:     std_logic;  -- not used
    signal qA:      std_logic;       
    signal not_qA:  std_logic := '1';  -- notice this didn't matter

begin
my_Flipflop:  
    D_Flipflop
        port map (
            not_qA,
            CLK,
            qA,
            not_qA
        );

    out_A <= qA;                -- Added

end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity foo_tb is
end entity;

architecture fum of foo_tb is
    signal CLK:     std_logic := '0';
    signal out_A:   std_logic;
begin

DUT:
    entity work.foo 
        port map (
            CLK => CLK,
            out_A => out_A
        );
CLOCK:
    process
    begin
        wait for 10 ns;
        CLK <= not CLK;
        if Now > 200 ns then
            wait;
        end if;
    end process;
end architecture;

Выход not_Q D_Flipflop был инициализирован на «0» (его можно было бы так же легко инициализировать на «1»). Это эквивалент набора коллекторов для флип-флопа при включении питания.

Теперь флип-флоп может переключаться — он имеет известное немета-значение на входе D.

Это дает:

введите здесь описание изображения (кликабельно)

person Community    schedule 10.06.2015