====== T-Flip-Flop ======
===== Model =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : t_ff.vhd #
-- # #
-- # Schaltung : T-Flip-Flops in waehlbarer Anzahl; mit demselben #
-- # Taktsignal und Resetsignal fuer alle Flip-Flops #
-- # #
-- # Modell : t_ff #
-- # #
-- # #
-- # Designer : Wolfgang Sehr #
-- # Abteilung : Lehrstuhl fuer Rechnergestuetzten Schaltungsentwurf #
-- # Datum : 29.03.1995 #
-- ############################################################################
-- ############################################################################
-- # IEEE PACKAGES #
-- ############################################################################
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- ############################################################################
ENTITY t_ff IS
GENERIC ( X: INTEGER := ${ANZAHL} -- X: Anzahl der Flip-FLops
);
PORT (${EING}
${AUSG_Q}
${AUSG_NQ}
takt : IN STD_LOGIC;
reset : IN STD_LOGIC
);
-- t_x : T-Eingang fuer x-tes Flip-Flop
-- :
-- q_x : Inhalt des x-ten Flip-Flops
-- :
-- nq_x : invertierter Inhalt des x-ten Flip-Flops
-- :
-- takt : Taktsignal fuer alle Flip-Flops
-- :
-- reset : Resetsignal fuer alle Flip-Flops
-- :
END t_ff;
ARCHITECTURE dataflow OF t_ff IS
SIGNAL t_ein : UNSIGNED((X-1) DOWNTO 0);
SIGNAL q_next : UNSIGNED((X-1) DOWNTO 0);
SIGNAL q : UNSIGNED((X-1) DOWNTO 0);
SIGNAL nq : UNSIGNED((X-1) DOWNTO 0);
-- t_ein : internes Signal fuer T
-- :
-- q : internes Signal fuer q
-- :
-- nq : internes Signal fuer nq
BEGIN
${EING_ZUW}
${AUSG_ZUW_Q}
${AUSG_ZUW_NQ}
komb: PROCESS(t_ein, reset, q)
VARIABLE ents : STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE q_var : UNSIGNED((X-1) DOWNTO 0);
VARIABLE q_next_var : UNSIGNED((X-1) DOWNTO 0);
VARIABLE nq_var : UNSIGNED((X-1) DOWNTO 0);
BEGIN
q_var := q;
FOR i IN 0 TO (X-1) LOOP
ents := q_var(i) & t_ein(i) & reset;
CASE ents IS
WHEN "000" => q_next_var(i) := '0';
WHEN "010" => q_next_var(i) := '1';
WHEN "100" => q_next_var(i) := '1';
WHEN "110" => q_next_var(i) := '0';
WHEN OTHERS => q_next_var(i) := '0';
END CASE;
END LOOP;
FOR i IN 0 TO (X-1) LOOP
nq_var(i) := NOT(q_var(i));
END LOOP;
q_next <= q_next_var;
nq <= nq_var;
END PROCESS;
speicher: PROCESS(takt, q_next)
BEGIN
IF (takt'EVENT AND takt='1') THEN
q <= q_next;
END IF;
END PROCESS;
END dataflow;
CONFIGURATION CFG_t_ff OF t_ff IS
FOR dataflow
END FOR;
END CFG_t_ff;
===== Testbench =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : tb_t_ff.vhd #
-- # #
-- # Schaltung : Testbench fuer Toggle-Flip-Flops in waehlbarer Anzahl; #
-- # mit demselben Taktsignal und Resetsignal fuer #
-- # alle Flip-Flops #
-- # #
-- # Modell : tb_t_ff #
-- # #
-- # #
-- # Designer : Wolfgang Sehr #
-- # Abteilung : Lehrstuhl fuer Rechnergestuetzten Schaltungsentwurf #
-- # Datum : 30.03.1995 #
-- ############################################################################
-- ############################################################################
-- # IEEE PACKAGES #
-- ############################################################################
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- ############################################################################
ENTITY TB_t_ff IS
GENERIC (X : INTEGER := ${ANZAHL} -- X: Anzahl der Flip-FLops
);
END TB_t_ff;
ARCHITECTURE behaviour OF TB_t_ff IS
SIGNAL tb_t : UNSIGNED ((X-1) DOWNTO 0);
SIGNAL tb_q : UNSIGNED ((X-1) DOWNTO 0);
SIGNAL tb_nq : UNSIGNED ((X-1) DOWNTO 0);
SIGNAL tb_reset : STD_LOGIC;
SIGNAL tb_takt : STD_LOGIC;
-- tb_t : Toggle-Signal fuer die einzelnen Flip-Flops
-- :
-- tb_reset : Reset-Signal fuer alle Flip-Flops
-- :
-- tb_takt : Taktsignal fuer alle Flip-Flops
-- :
COMPONENT t_ff
PORT( ${TB_DEKL_EIN}
${TB_DEKL_AUS_Q}
${TB_DEKL_AUS_NQ}
takt : IN STD_LOGIC;
reset : IN STD_LOGIC
);
END COMPONENT;
BEGIN
UUT: t_ff
PORT MAP (${TB_ZUW_EIN}
${TB_ZUW_AUS_Q}
${TB_ZUW_AUS_NQ}
takt => tb_takt,
reset => tb_reset
);
clock: PROCESS
BEGIN
tb_takt <= '0';
WAIT FOR 10 ns;
LOOP
tb_takt <= NOT(tb_takt);
WAIT FOR 10 ns;
END LOOP;
END PROCESS;
res: PROCESS
BEGIN
tb_reset <= '1';
WAIT FOR 30 ns;
LOOP
tb_reset <= '0';
WAIT FOR 1000 ns;
tb_reset <= '1';
WAIT FOR 30 ns;
END LOOP;
END PROCESS;
stim: PROCESS
BEGIN
tb_t <= CONV_UNSIGNED(0, tb_t'LENGTH);
WAIT FOR 33 ns;
LOOP
tb_t <= tb_t + '1';
WAIT FOR 33 ns;
END LOOP;
END PROCESS;
END behaviour;
CONFIGURATION CFG_TB_t_ff OF TB_t_ff IS
FOR behaviour
FOR UUT: t_ff
USE CONFIGURATION WORK.CFG_t_ff;
END FOR;
END FOR;
END CFG_TB_t_ff;
===== Synopsys VSS Trace =====
tr tb_reset
tr tb_takt
tr tb_t
tb_q
tb_nq