synthesizeable_vhdl-model-library:synchronous_separable_counter_with_loadable_upper_limit

Synchronous separable counter with loadable upper limit

Eine kurze Funktions- und Schnittstellenbeschreibung:

  • Bei diesem Modell handelt es sich um einen synchronen Auf-/Abwärtszähler dessen obere Grenze fest eingestellt werden kann und über den Eingang 'test' in kleine Zähler unterteilbar ist, die jeweils die gleiche parametrisierbare Breite besitzten.
  • Diese Unterteilung in kleinere Zähler kann z.B. dazu benutzt werden, größere Zähler schneller zu testen.
  • Parametrierbar sind die Bitbreite des Hauptzählers ($BITBR_1) und die Bitbreite der Unterzähler ($BITBR_2), wobei diese ein ganzzahliger Teiler der Bitbreite des Hauptzählers sein muss.

Synchronous separable counter with loadable upper limit

  • takt : Taktsignal
  • reset : asynchrones Rücksetzsignal
  • mode : Port zum auswählen des Zämodus
    • mode = '1': Aufwärts zählen
    • mode = '0': Abwärts zählen
  • laden : ist laden = '1', so wird der am Port 'zaehl_start_wert' anliegende Wert als obere Zählgrenze übernommen
  • test :
    • test = '1': schaltet in den Testmode d.h. Aufteilung des Zähler in kleiner Zähler
    • test = '0': Normalbetrieb
  • null_detect : zeigt an, daß der Zählerinhalt den Wert 0 besitzt
  • zaehl_start_wert : Eingangsport für den Zählerstand
dft_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    dft_sync_counter.vhd                                     #
-- #                                                                          #
-- # Schaltung  :    synchroner Auf-/Abwaertszaehler mit ladbarem             #
-- #                 Zaehlerinhalt und Testeingang, der den Zaehler           #
-- #                 in benutzerdefinierte kleinere Zaehler unterteilen       #
-- #                 kann                                                     #
-- #                                                                          #
-- #                                                                          #
-- # Modell	:    dft_sync_counter                                         #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig          #
-- # Abteilung  : Lehrstul fuer rechnergestuetzten Schaltungsentwurf          #
-- # Datum      : 23.02.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                          IEEE PACKAGES                                   #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
-- ############################################################################
 
 
ENTITY dft_sync_counter IS
	GENERIC	(BITBR_1: INTEGER := @BITBR_1; -- BITBR_1: Bitbreite des
						 -- Hauptzaehlers
 
		 BITBR_2: INTEGER := @BITBR_2); -- BITBR_2: Bitbreite der
						  -- Zaehler im Testmodus
					 	  -- BITBR_2 muss ein ganz-
						  -- zahliger Teiler
					 	  -- von BITBR_1 sein
 
	PORT	(takt			: IN STD_LOGIC;
	  	 reset			: IN STD_LOGIC;
		 mode			: IN STD_LOGIC;
		 zaehl			: IN STD_LOGIC;
		 laden			: IN STD_LOGIC;
		 test			: IN STD_LOGIC;
		 null_detect		: OUT STD_LOGIC;
		 zaehl_start_wert	: IN UNSIGNED((BITBR_1-1) DOWNTO 0)
		);
 
	-- takt			: Taktsignal
	--			:
	-- reset		: synchroner Reset
	--			:
	-- mode			: Festlegen des Zaehlmodus
	--			: o mode = '1': Vorwaertszaehlen
	--			: o mode = '0': Rueckwaertszaehlen
	--			:
	-- zaehl		: maskieren des Zaehlvorgangs:
	--			: o zaehl = '1': Zaehlen je nach Modus
	--			: o zaehl = '0': kein Zaehlvorgang un abhaengig
	--			:		 von eingestellten Modus
	--			:
	-- laden		: ist laden = '1', so wird der am Port 
	--			: 'zaehl_start_wert' anliegende Wert
	--			: als obere Zaehlgrenze uebernommen
	--			: 
	-- test			: o test = '1': schaltet in den Testmode,
	--			:		d.h. Aufteilung des Zaehlers
	--			: 		in kleine Zaehler
	--			: o test = '0': Normalbetrieb
	--			:
	-- null_detect		: zeigt an, dass der Zaehlerinhalt den 
	--			: Wert 0 besizt
	--			:
	-- zaehl_start_wert	: Eingangsport fuer den Zaehlerstand
	--			:
 
END @FILENAME;
 
 
ARCHITECTURE verhalten OF dft_sync_counter IS
 
SIGNAL	zaehlwert_intern	: UNSIGNED((BITBR_1-1) DOWNTO 0);
	-- zaehlwert_intern	: eigentlicher Zaehlerinhalt
 
BEGIN
	PROCESS(zaehlwert_intern)
	-- -------------------------------------------------------------
	-- Bestimmung des asynchronen Ausgangssignals 'null_detect'
	-- -------------------------------------------------------------
	VARIABLE null_detect_var	: STD_LOGIC;
	BEGIN
	   IF (zaehlwert_intern = CONV_UNSIGNED(0,
 		       zaehlwert_intern'LENGTH)) THEN
		       null_detect_var := '1';
	   ELSE
 
		       null_detect_var := '0';
	   END IF;
 
	   null_detect	 <= null_detect_var;
 
	END PROCESS;
 
 
 
 
	PROCESS(takt, reset, laden, mode, zaehl, zaehl_start_wert)
	-- -------------------------------------------------------------
	-- Bestimmung des neuen Zaehlerwertes
	-- -------------------------------------------------------------
	VARIABLE zaehlwert_intern_var	: UNSIGNED((BITBR_1-1) DOWNTO 0);
	VARIABLE zaehlwert_intern_2_var : UNSIGNED((BITBR_2-1) DOWNTO 0);
 
	BEGIN
 
	   IF (takt = '1') AND (takt'EVENT) THEN
	        zaehlwert_intern_var := zaehlwert_intern;
 
 
	 	IF (reset = '1') THEN
		   zaehlwert_intern_var := CONV_UNSIGNED(0, 
						  zaehlwert_intern_var'LENGTH);
		ELSE
		   IF (test = '0') THEN
		      IF (laden = '1') THEN 
		        zaehlwert_intern_var := zaehl_start_wert;
 
		      ELSIF (mode = '1') AND (zaehl = '1') THEN
	     	        zaehlwert_intern_var := zaehlwert_intern_var + 1;
 
		      ELSIF (mode = '0') AND (zaehl = '1') THEN
		        zaehlwert_intern_var := zaehlwert_intern_var - 1;
 
		      END IF;
 
		   ELSIF (test = '1') THEN
		      FOR i IN 0 TO (BITBR_1/BITBR_2 - 1) LOOP
			  zaehlwert_intern_2_var := 
				zaehlwert_intern_var((i*BITBR_2-1 + BITBR_2)
						      DOWNTO i*BITBR_2);
 
			  IF (zaehl_start_wert(i*BITBR_2-1+ BITBR_2) = '1') THEN
			     zaehlwert_intern_2_var := zaehlwert_intern_2_var+1;
			  END IF;
 
			  zaehlwert_intern_var((i*BITBR_2-1 + BITBR_2) 
						DOWNTO i*BITBR_2)
				:= zaehlwert_intern_2_var;			
		      END LOOP;
		   END IF;
		END IF;
 
    	        zaehlwert_intern <= zaehlwert_intern_var;
 
	   END IF;
   END PROCESS;
END verhalten;
 
 
 
CONFIGURATION CFG_dft_sync_counter OF dft_sync_counter IS
   FOR verhalten
   END FOR;
END CFG_dft_sync_counter;
tb_dft_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    TB_dft_sync_counter.vhd                                  #
-- #                                                                          #
-- # Schaltung  :    Testbench fuer synchrone Auf-/Abwaertszaehler mit 	      #
-- #		     ladbarem Zaehlerinhalt und Testeingang, der den          #
-- #                 Zaehler in benutzerdefinierte kleinere Zaehler           #
-- #                 unterteilen kann     				      #
-- #                                                                          #
-- # Modell	:    tb_dft_sync_counter                                      #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr                                               #
-- # Abteilung  : Lehrstuhl fuer Rechnergestuetzten Schaltungsentwurf         #
-- # Datum      : 23.02.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                          IEEE PACKAGES                                   #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
   USE IEEE.math_real.all; 	-- wird fuer die Erzeugung von Zufallszahlen
				-- benoetigt 
 
-- ############################################################################
 
ENTITY TB_dft_sync_counter IS
	GENERIC (BITBR_1: INTEGER := @BITBR_1;  -- BITBR_1: Bitbreite des
					          -- Hauptzaehlers
 
		 BITBR_2: INTEGER := @BITBR_2); -- BITBR_2: Bitbreite der
						  -- Zaehler im Testmodus
					          -- BITBR_2 muss ein ganz-
						  -- zahliger Teiler von BITBR_1
						  -- sein
END TB_dft_sync_counter;
 
ARCHITECTURE behaviour OF TB_dft_sync_counter IS
SIGNAL tb_takt			: STD_LOGIC;
SIGNAL tb_reset			: STD_LOGIC;
SIGNAL tb_mode			: STD_LOGIC;
SIGNAL tb_zaehl			: STD_LOGIC;
SIGNAL tb_laden			: STD_LOGIC;
SIGNAL tb_test			: STD_LOGIC;
SIGNAL tb_null_detect		: STD_LOGIC;
SIGNAL tb_zaehl_start_wert	: UNSIGNED((BITBR_1-1) DOWNTO 0);
 
 
-- tb_takt			: an das UUT ausgesendete Taktsignal
--				:
-- tb_reset			: an das UUT ausgesendete Taktsignal
--				:
-- tb_mode			: an das UUT ausgesendete Signal zur
--				: Auswahl des Modus im Normalbetrieb
--				:
-- tb_zaehl			: an das UUT ausgesendete Siganal zur 
--				: Aktivierung des Zaehlvorganges
--				:
-- tb_laden			: an das UUT ausgesendete Signal zum Laden
--				: des Zaehlerstartwertes
--				:
-- tb_test			: an das UUT ausgesendete Signal zum Wechseln
--				: in den Testmodus
-- 				:
-- tb_null_detect		: vom UUT empfangenes Signal zur Anzeige, dass
--				: der sich Zaehler der Wert 0 befindet
--				:
-- tb_zaehl_start_wert		: an das UUT ausgsendete Signal:  
--				: Startwert fuer den Zaehler, der bei einem 
--				: Ladebefehl uebernommen wird
--				:
 
COMPONENT dft_sync_counter
	PORT	(takt			: IN STD_LOGIC;
	  	 reset			: IN STD_LOGIC;
		 mode			: IN STD_LOGIC;
		 zaehl			: IN STD_LOGIC;
		 laden			: IN STD_LOGIC;
		 test			: IN STD_LOGIC;
		 null_detect		: OUT STD_LOGIC;
		 zaehl_start_wert	: IN UNSIGNED((BITBR_1-1) DOWNTO 0)
		);
END COMPONENT;
 
 
BEGIN
   UUT: dft_sync_counter 		-- zu testende Schaltung
	PORT MAP(takt			=> tb_takt,			 
	  	 reset			=> tb_reset,
		 mode			=> tb_mode,
		 zaehl			=> tb_zaehl,
		 laden			=> tb_laden,
		 test			=> tb_test,
		 null_detect		=> tb_null_detect,
		 zaehl_start_wert	=> tb_zaehl_start_wert
		);
 
 
 
stim_1: PROCESS
	-- ------------------------------------------------------
	-- Erzeugung des Taktsignals
	-- ------------------------------------------------------
    	BEGIN
	   tb_takt <= '1';
	   WAIT FOR 10 ns;
 
	   LOOP
	       tb_takt <= NOT (tb_takt);
	       WAIT FOR 10 ns;
	   END LOOP;
	END PROCESS;
 
stim_2: PROCESS
	-- ------------------------------------------------------
	-- Erzeugung des Resetsignals
	-- ------------------------------------------------------
	BEGIN
	   tb_reset <= '1';
	   WAIT FOR 15 ns;
 
	   LOOP
	      tb_reset <= NOT (tb_reset);
	      WAIT FOR 200 ns;
 
	      tb_reset <= NOT (tb_reset);
	      WAIT FOR 200 ns;
	   END LOOP;
	END PROCESS;
 
stim_3: PROCESS
	-- ------------------------------------------------------
	-- Erzeugung des Modussignals
	-- ------------------------------------------------------
	BEGIN
	   tb_mode <= '1';
	   WAIT FOR 100 ns;
 
	   LOOP
	     tb_mode <= NOT(tb_mode);
	     WAIT FOR 100 ns;
	   END LOOP;
	END PROCESS;
 
stim_4: PROCESS
	-- -------------------------------------------------------
	-- Erzeugung der Zaehlsignals
	-- -------------------------------------------------------
	BEGIN 
	   tb_zaehl <= '1';
	   WAIT FOR 30 ns;
 
 	   LOOP
	      tb_zaehl <= NOT (tb_zaehl);
	      WAIT FOR 20 ns;
	   END LOOP;
	END PROCESS;
 
stim_5: PROCESS
	-- --------------------------------------------------------
	-- Erzeugung des Ladesignals
	-- --------------------------------------------------------
	BEGIN
	    tb_laden <= '0';
	    WAIT FOR 70 ns;
 
	    LOOP
	       tb_laden <= NOT (tb_laden);
	       WAIT FOR 20 ns;
 
	       tb_laden <= NOT (tb_laden);
	       WAIT FOR 70 ns;
	    END LOOP; 
	END PROCESS;
 
 
stim_6: PROCESS
	-- ---------------------------------------------------------
	-- Erzeugung des Testsignals
	-- ---------------------------------------------------------
	BEGIN
	   tb_test <= '0';
	   WAIT FOR 1000 ns;
 
	   LOOP
	     tb_test <= NOT (tb_test);
	     WAIT FOR 400 ns;
 
	     tb_test <= NOT (tb_test);
	     WAIT FOR 1000 ns;	
	   END LOOP;
	END PROCESS;
 
 
 
stim_7: PROCESS
	-- ---------------------------------------------------------
	-- Erzeugung des Startwertes fuer den Zaehler
	-- ---------------------------------------------------------
	BEGIN
	    LOOP
	  	tb_zaehl_start_wert <= CONV_UNSIGNED(RAND, 
						    tb_zaehl_start_wert'LENGTH);
		WAIT FOR 200 ns;
  	    END LOOP;
	END PROCESS;
 
 
 
END behaviour;
 
CONFIGURATION CFG_TB_dft_sync_counter OF TB_dft_sync_counter IS
   FOR behaviour
	FOR UUT: dft_sync_counter
	   USE CONFIGURATION WORK.CFG_dft_sync_counter;
	END FOR;
   END FOR;
END CFG_TB_dft_sync_counter;
trace_dft_sync_counter.vhd
tr tb_takt
tr tb_reset
tr tb_mode
tr tb_zaehl
tr tb_laden
tr tb_test
tr tb_null_detect
tr tb_zaehl_start_wert
 
tr /tb_dft_sync_counter/uut/zaehlwert_intern