Испытательный стенд для T Flip Flop с использованием D Flip Flop в 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;
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
чуть более крепкий.
Ваше 'U' вызвано тем, что вывод D-триггера используется в комбинаторном выражении без сброса в известное состояние.
Простейшим способом скрыть D-триггер в обнуленном объекте T-триггера является добавление второго процесса к тестовому стенду по следующим направлениям:
RESET_PROC:
process
begin
wait for 5 ns;
reset <= '1';
wait for 5 ns;
reset <= '0';
wait;
end process;