synthesizeable_vhdl-model-library:jk-flip-flop

JK-Flip-Flop

jk_ff.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    jk_ff.vhd                                                #
-- #                                                                          #
-- # Schaltung  :    JK-Flip-Flops in waehlbarer Anzahl; mit demselben        #
-- #                 Taktsignal und Resetsignal fuer alle Flip-Flops          #
-- #                                                                          #
-- #                                                                          #
-- # Modell     :    jk_ff                                                    #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig          #
-- # Abteilung  : Lehrstul fuer rechnergestuetzten Schaltungsentwurf          #
-- # Datum      : 04.04.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                        IEEE PACKAGES                                     #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
-- ############################################################################
 
 
ENTITY jk_ff IS
	GENERIC ( X: INTEGER := @ANZAHL       -- X: Anzahl der Flip-FLops
	        );
	PORT	(@EING_J
		 @EING_K
		 @AUSG_Q
		 @AUSG_NQ
		 takt	    : IN STD_LOGIC;
		 reset	    : IN STD_LOGIC
		);
 
	-- j_x			: J-Eingang fuer x-tes Flip-Flop
	--			:
	-- k_x			: K-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 jk_ff;
 
ARCHITECTURE dataflow OF jk_ff IS
SIGNAL j_ein			: UNSIGNED((X-1) DOWNTO 0);
SIGNAL k_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);
 
	-- j_ein		: internes Signal fuer J
	--			:
	-- k_ein		: internes Signal fuer K
	--			:
	-- q			: internes Signal fuer q
	--			:
	-- nq			: internes Signal fuer nq
 
BEGIN
    ${EING_ZUW_J}
 
    ${EING_ZUW_K}
 
    ${AUSG_ZUW_Q}
 
    ${AUSG_ZUW_NQ}
 
 
    komb: PROCESS(j_ein, k_ein, reset, q)
          VARIABLE ents		: STD_LOGIC_VECTOR(3 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) & j_ein(i) & k_ein(i) & reset;
 
	      	CASE ents IS
		    WHEN "0000"	=> 	q_next_var(i) := '0';
		    WHEN "0010"	=> 	q_next_var(i) := '0';
		    WHEN "0100"	=> 	q_next_var(i) := '1';
		    WHEN "0110"	=> 	q_next_var(i) := '1';
		    WHEN "1000" => 	q_next_var(i) := '1';
		    WHEN "1010" => 	q_next_var(i) := '0';
		    WHEN "1100" => 	q_next_var(i) := '1';
		    WHEN "1110" =>	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_jk_ff OF jk_ff IS
   FOR dataflow
   END FOR;
END CFG_jk_ff;
tb_jk_ff.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    tb_${FILENAME}.vhd                                       #
-- #                                                                          #
-- # Schaltung  :    Testbench fuer JK-Flip-Flops in waehlbarer Anzahl;       #
-- #                 mit demselben  Taktsignal und Resetsignal fuer           #
-- #                 alle Flip-Flops                                          #
-- #                                                                          #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr                                               #
-- # Abteilung  : Lehrstul fuer rechnergestuetzten Schaltungsentwurf          #
-- # Datum      : 04.04.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                        IEEE PACKAGES                                     #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
-- ############################################################################
 
ENTITY TB_jk_ff IS
	GENERIC (X : INTEGER := ${ANZAHL}   -- X: Anzahl der Flip-FLops
		);   
END TB_jk_ff;
 
 
ARCHITECTURE behaviour OF TB_jk_ff IS
SIGNAL tb_j		: UNSIGNED ((X-1) 	DOWNTO 0);
SIGNAL tb_k		: 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_j			: J-Signal fuer die einzelnen Flip-Flops
	--			:
	-- tb_k			: K-Signal fuer die einzelnen Flip-Flops
	--			:
	-- tb_reset		: Reset-Signal fuer alle Flip-Flops
	--			:
	-- tb_takt		: Taktsignal fuer alle Flip-Flops
	--			:
 
COMPONENT jk_ff
	PORT( ${TB_DEKL_EIN_J}
	      ${TB_DEKL_EIN_K}
	      ${TB_DEKL_AUS_Q}
	      ${TB_DEKL_AUS_NQ}
	      takt		: IN STD_LOGIC;
	      reset		: IN STD_LOGIC		
	    );
END COMPONENT;
 
BEGIN
   UUT:   jk_ff
	  PORT MAP (${TB_ZUW_EIN_J}
 
		    ${TB_ZUW_EIN_K}
 
		    ${TB_ZUW_AUS_Q}
 
		    ${TB_ZUW_AUS_NQ}
 
		    reset      => tb_reset,
		    takt       => tb_takt
		   );
 
  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_j: PROCESS
	 BEGIN
	    tb_j <= CONV_UNSIGNED(0, tb_j'LENGTH);
	    WAIT FOR 33 ns;
 
	    LOOP
	       tb_j <= tb_j + '1';
	       WAIT FOR 33 ns;
	    END LOOP;
	 END PROCESS;
 
 
 stim_k: PROCESS
	 BEGIN
	    tb_k <= CONV_UNSIGNED(0, tb_k'LENGTH);
	    WAIT FOR 47 ns;
 
	    LOOP
	       tb_k <= tb_k + '1';
	       WAIT FOR 47 ns;
	    END LOOP;
	 END PROCESS;
 
 
END behaviour;
 
 
CONFIGURATION CFG_TB_jk_ff OF TB_jk_ff IS
   FOR behaviour
       FOR UUT: jk_ff
	    USE CONFIGURATION WORK.CFG_jk_ff;
       END FOR;
   END FOR;
END CFG_TB_jk_ff;
trace_jk_ff.vhd
tr tb_takt
tr tb_reset
tr tb_j
tr tb_k
tr tb_q
tr tb_nq