synthesizeable_vhdl-model-library:synchronous_loadable_counter

Synchronous Loadable Counter

Eine kurze Funktions- und Schnittstellenbeschreibung:

  • In der Bitbreite (@BITBR) parametrisierbarer synchroner Auf-/Abwärtszähler mit synchronen ladbarem Zählerinhalt.

Synchronous Loadable Counter

  • takt : Taktsignal
  • reset : synchroner Reset
  • mode : Festlegen des Zählmodus
    • mode = '1': Vorwärtszählen
    • mode = '0': Rückwärtszählen
  • zaehl : maskieren des Zählvorgangs:
    • zaehl = '1': Zählen je nach Modus
    • zaehl = '0': kein Zählvorgang unabhängig vom eingestellten Modus
  • laden : ist laden = '1', so wird der am Port 'zaehl_start_wert' anliegende Wert als obere Zählgrenze übernommen
  • zaehl_start_wert : Eingangsport für den Zählerstand (parametriert)
  • null_detect : wird '1' gesetzt, wenn der Zählerinhalt 0 ist
lin_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    lin_sync_counter.vhd                                     #
-- #                                                                          #
-- # Schaltung  :    synchroner Auf-/Abwaertszaehler mit ladbarem             #
-- #                 Zaehlerinhalt                                            #
-- #                                                                          #
-- # Modell	:    lin_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 lin_sync_counter IS
	GENERIC	(BITBR: INTEGER := @BITBR);	-- Bitbr: Bitbreite des Zaehlers
						--	
 
	PORT	(takt			: IN STD_LOGIC;
	  	 reset			: IN STD_LOGIC;
		 mode			: IN STD_LOGIC;
		 zaehl			: IN STD_LOGIC;
		 laden			: IN STD_LOGIC;
		 null_detect		: OUT STD_LOGIC;
		 zaehl_start_wert	: IN UNSIGNED((BITBR-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
	--			:		 vom eingestellten Modus
	--			:
	-- laden		: ist laden = '1', so wird der am Port 
	--			: 'zaehl_start_wert' anliegende Wert
	--			: als obere Zaehlgrenze uebernommen
	--			: 
	-- zaehl_start_wert	: Eingangsport fuer den Zaehlerstand
	--			:
	-- null_detect		: wird '1' gesetzt, wenn der Zaehlerinhalt
	--			: 0 ist.		
END lin_sync_counter;
 
 
 
ARCHITECTURE verhalten OF lin_sync_counter IS
 
SIGNAL	zaehlwert_intern	: UNSIGNED((BITBR-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) 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 (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;
 
		END IF;
    	        zaehlwert_intern <= zaehlwert_intern_var;
 
	   END IF;
 
	END PROCESS;
END verhalten;
 
 
 
CONFIGURATION CFG_lin_sync_counter OF lin_sync_counter IS
   FOR verhalten
   END FOR;
END CFG_lin_sync_counter;
tb_lin_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    tb_lin_sync_counter.vhd                                  #
-- #                                                                          #
-- # Schaltung  :    Testbench fuer synchronen Auf-/Abwaertszaehler mit       # 
-- #		     ladbarem Zaehlerinhalt                                   #
-- #                                                                          #
-- #                 tb_lin_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;
   USE IEEE.math_real.all; 	-- wird fuer die Erzeugung von Zufallszahlen
				-- benoetigt 
-- ############################################################################
 
 
ENTITY TB_lin_sync_counter IS
	GENERIC (BITBR: INTEGER := @BITBR);  -- Bitbr: Bitbreite des Zaehlers
END TB_lin_sync_counter;
 
 
ARCHITECTURE behaviour of TB_lin_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_null_detect		: STD_LOGIC;
SIGNAL	tb_zaehl_start_wert	: UNSIGNED((BITBR-1) DOWNTO 0);
 
COMPONENT lin_sync_counter
	PORT	(takt			: IN STD_LOGIC;
	  	 reset			: IN STD_LOGIC;
		 mode			: IN STD_LOGIC;
		 zaehl			: IN STD_LOGIC;
		 laden			: IN STD_LOGIC;
		 null_detect		: OUT STD_LOGIC;
		 zaehl_start_wert	: IN UNSIGNED((BITBR-1) DOWNTO 0)
		);
END COMPONENT;
 
BEGIN
   UUT: lin_sync_counter
	PORT MAP (	takt			=> tb_takt,
	  	 	reset			=> tb_reset,
		 	mode			=> tb_mode,
		 	zaehl			=> tb_zaehl,
		 	laden			=> tb_laden,
		 	null_detect		=> tb_null_detect,
		 	zaehl_start_wert	=> tb_zaehl_start_wert
		);
stim_1: PROCESS
    	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
	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
	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
	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
	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
	BEGIN
	    LOOP
	       tb_zaehl_start_wert <= CONV_UNSIGNED(RAND, 
						    tb_zaehl_start_wert'LENGTH);
		WAIT FOR 30 ns;
	    END LOOP;
	END PROCESS;
 
END behaviour;
 
 
CONFIGURATION CFG_TB_lin_sync_counter OF TB_lin_sync_counter IS
   FOR behaviour
	FOR UUT: lin_sync_counter
	   USE CONFIGURATION WORK.CFG_lin_sync_counter;
	END FOR;
   END FOR;
END CFG_TB_lin_sync_counter;
trace_lin_sync_counter.vhd
tr tb_takt
tr tb_reset
tr tb_mode
tr tb_zaehl
tr tb_laden
tr tb_null_detect
tr tb_zaehl_start_wert
 
tr tb_lin_sync_counter/UUT/zaehlwert_intern