Стенд для тестирования T-триггера с использованием D-триггера в VHDL

У меня есть коды VHDL, как у D-триггера, и T-триггера, который использует его структурно: он состоит из DFF с входом D, T Xored с Q, часами. Но моя симуляция дает мне сигнал, который имеет на выходе только красную прямую линию «U». Я думаю, это из-за обратной связи от Q к D, и вначале он не инициализирован. Но я не знаю, как это написать иначе. Это код:

- Это DFF:

    library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity d_flip_flop is
     port(
         clk : in STD_LOGIC;
         din : in STD_LOGIC;
         reset : in STD_LOGIC;
         dout : out STD_LOGIC
         );
end d_flip_flop;

architecture d_flip_flop_arc of d_flip_flop is    
begin

    dff : process (din,clk,reset) is
    begin
        if (reset='1') then
            dout <= '0';
        elsif (rising_edge (clk)) then
            dout <= din;
        end if;
    end process dff;


end d_flip_flop_arc;

--TFF:

    library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity tff_using_dff is
     port(
         clk : in STD_LOGIC;
         t : in STD_LOGIC;
         reset : in STD_LOGIC;
         dout : out STD_LOGIC
         );
end tff_using_dff;

architecture tff_using_dff_arc of tff_using_dff is    

component d_flip_flop is
     port(
         clk : in STD_LOGIC;
         din : in STD_LOGIC;
         reset : in STD_LOGIC;
         dout : out STD_LOGIC
         );
end component d_flip_flop;

signal ip : std_logic;
signal op : std_logic;    

begin

    ip <= op xor t ;
    u0 : d_flip_flop port map (clk => clk,
                            din => ip,
                            reset => reset,
                            dout => op);

    dout <= op;


end tff_using_dff_arc;

- и текущий тестовый стенд:

 library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity T_FF_tb is
end T_FF_tb;

architecture T_FF_tb of T_FF_tb is
component tff_using_dff is 
     port(
         clk : in STD_LOGIC;
         t : in STD_LOGIC;
         reset : in STD_LOGIC;
         dout : out STD_LOGIC
         );
end component;

signal clk,t,reset: std_logic:='0';
signal dout: std_logic:='0';
begin
U0: tff_using_dff port map(clk,t,reset,dout);
clk<=not clk after 5 ns;
t<= not t after 30 ns;

end T_FF_tb;

person Rawan Moukalled    schedule 07.12.2014    source источник


Ответы (2)


В качестве альтернативы стробированию сигнала reset на вашем испытательном стенде (что должно быть сделано в любом случае) вы можете определить начальное состояние выхода d_flip_flop. Это может быть сделано путем определения промежуточного сигнала dout_i для выхода регистра с назначением начального состояния. Например.

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity d_flip_flop is
  port(
     clk : in STD_LOGIC;
     din : in STD_LOGIC;
     reset : in STD_LOGIC;
     dout : out STD_LOGIC
     );
end d_flip_flop;

architecture d_flip_flop_arc of d_flip_flop is    
  signal dout_i : STD_LOGIC := '0';
begin

dff : process (clk,reset) is
begin
    if (reset='1') then
        dout_i <= '0';
    elsif (rising_edge (clk)) then
        dout_i <= din;
    end if;
end process dff;

dout <= dout_i;

end d_flip_flop_arc;

Это должно привести к тому же желаемому эффекту. У него также есть дополнительный бонус, заключающийся в том, что он делает d_flip_flop немного более надежным.

person pwolfsberger    schedule 07.12.2014

Ваше «U» вызвано тем, что выходной сигнал D-триггера используется в комбинаторном выражении без сброса в известное состояние.

Самый простой способ сбросить D-триггер в объект T-триггера до известного - это добавить второй процесс на испытательный стенд по следующим строкам:

RESET_PROC:
    process
    begin
        wait for 5 ns;
        reset <= '1';
        wait for 5 ns;
        reset <= '0';
        wait;
    end process;
person Community    schedule 07.12.2014