synthesizeable_vhdl-model-library:synchronous_counter_with_hard_upper_limit

Synchronous counter with hard upper limit

Eine kurze Funktions- und Schnittstellenbeschreibung:

  • Bei diesem Modell handelt es sich um einen synchronen Auf-/Abwärtszähler dessen obere Grenze (@MAX) fest eingestellt werden kann. (Modulo Zähler)

Synchronous counter with hard 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
  • zaehlwert : Ausgangssignal für den aktuellen Zählerinhalt
  • null_detect : zeigt an, daß der Zählerinhalt den Wert 0 besitzt
fog_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    fog_sync_counter.vhd                                     #
-- #                                                                          #
-- # Schaltung  :    synchroner Auf-/Abwaertszaehler mit festvorgegebener     #
-- #                 oberer Grenze (Modulo Zaehler)                           #
-- #                                                                          #
-- # Modell     :    fog_sync_counter                                         #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig          #
-- # Abteilung  : Lehrstul fuer rechnergestuetzten Schaltungsentwurf          #
-- # Datum      : 22.02.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                          IEEE PACKAGES                                   #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
-- ############################################################################
 
-- ############################################################################
-- #                  PROJECT - SPEZIFISCHE  PACKAGES                         #
-- ############################################################################
   use WORK.local.all;
-- ############################################################################
 
 
ENTITY fog_sync_counter IS
	GENERIC	(MAX: INTEGER := @MAX);	-- MAX: hoechster zulaessiger
						--	Wert fuer den Zaehler-
 						--	inhalt
	PORT	(takt		: IN STD_LOGIC;
	  	 reset		: IN STD_LOGIC;
		 mode		: IN STD_LOGIC;
		 zaehlwert	: OUT UNSIGNED(LOG_2(MAX) DOWNTO 0);
		 null_detect	: OUT STD_LOGIC
		);
 
	-- takt			: Taktsignal
	--			:
	-- reset		: asynchrones Ruecksetzsignal
	--			:
	-- mode			: Port zum Auswaehlen des Zaehlmodus:
	--			: o mode = '1': Aufwaerts zaehlen
	--			: o mode = '0': Abwaerts zaehlen
	--			:
	-- zaehlwert		: Ausgangssignal fuer den aktuellen 
	--			: Zaehlerinhalt
	--			:
	-- null_detect		: zeigt an, dass der Zaehlerinhalt den 
	--			: Wert 0 besizt
 
 
END fog_sync_counter;
 
 
ARCHITECTURE verhalten OF fog_sync_counter IS
 
SIGNAL	zaehlwert_intern	: UNSIGNED(LOG_2(MAX) DOWNTO 0);
 
	-- zaehlwert_intern	: Signal mit selben Inhalt wie dar Ausgangs-
	--			: port 'zaehlwert'; Ausgangsports koennen
	--			: nicht gelesen werden
 
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)
	VARIABLE zaehlwert_intern_var	: UNSIGNED(LOG_2(MAX) 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'LENGTH);
 
	      ELSE
		  IF (mode = '1') AND
		     (CONV_INTEGER(zaehlwert_intern_var) < MAX) THEN
		     zaehlwert_intern_var := zaehlwert_intern_var + 1;
 
		  ELSIF (mode = '0') AND
		     (CONV_INTEGER(zaehlwert_intern) < MAX) THEN
		     zaehlwert_intern_var := zaehlwert_intern_var - 1;
 
		  ELSE
		    zaehlwert_intern_var  := CONV_UNSIGNED(0, 
						       zaehlwert_intern'LENGTH);
 
		  END IF;
	      END IF;
 
	   zaehlwert_intern <= zaehlwert_intern_var;
 
	   END IF;
 
	END PROCESS;
 
        zaehlwert <= zaehlwert_intern;
 
END verhalten;
 
CONFIGURATION CFG_fog_sync_counter OF fog_sync_counter IS
   FOR verhalten
   END FOR;
END CFG_fog_sync_counter;
tb_fog_sync_counter.vhd
-- ############################################################################
-- # Project    :    VHDL-Modellbibliothek				      #
-- #                                                                          #
-- # Filename   :    tb_fog_sync_counter.vhd       	                      #
-- #                                                                          #
-- # Schaltung  :    Testbench fuer parametrierbaren binaeren synchronen      #
-- #                 Auf-/Abwaertszaehler                                     #
-- #                                                                          #
-- # Modell	:    tb_fog_sync_counter                                      #
-- #                                                                          #
-- # Designer   : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig          #
-- # Abteilung  : Lehrstul fuer rechnergestuetzten Schaltungsentwurf          #
-- # Datum      : 22.02.1995                                                  #
-- ############################################################################
 
-- ############################################################################
-- #                             IEEE PACKAGES                                #
-- ############################################################################
   Library IEEE;
   use IEEE.std_logic_1164.all;
   use IEEE.std_logic_arith.all;
-- ############################################################################
 
-- ############################################################################
-- #                  PROJECT - SPEZIFISCHE  PACKAGES                         #
-- ############################################################################
   use WORK.local.all;
-- ############################################################################
 
 
ENTITY TB_fog_sync_counter IS
	GENERIC (MAX: INTEGER := @MAX);
END TB_fog_sync_counter;
 
 
ARCHITECTURE behaviour OF TB_fog_sync_counter IS
SIGNAL tb_takt			: STD_LOGIC;
SIGNAL tb_reset			: STD_LOGIC;
SIGNAL tb_mode			: STD_LOGIC;
SIGNAL tb_zaehlwert		: UNSIGNED(LOG_2(MAX) DOWNTO 0);
SIGNAL tb_null_detect		: STD_LOGIC;
 
COMPONENT fog_sync_counter
	PORT(	 takt		: IN  STD_LOGIC;
	  	 reset		: IN  STD_LOGIC;
		 mode		: IN  STD_LOGIC;
		 zaehlwert	: OUT UNSIGNED(LOG_2(MAX) DOWNTO 0);
		 null_detect	: OUT STD_LOGIC
		);
END COMPONENT;
BEGIN
    UUT: fog_sync_counter			-- einzige Schaltung
	 PORT MAP(	takt		=> tb_takt,
		  	reset		=> tb_reset,
			mode		=> tb_mode,
		  	zaehlwert	=> tb_zaehlwert,
			null_detect	=> tb_null_detect
		 );
 
 
    stim_1: PROCESS
    BEGIN
	tb_reset <= '1';
	WAIT FOR 10 ns;
 
	LOOP
	   tb_reset <= NOT(tb_reset);
	   WAIT FOR 1000 ns;
 
	   tb_reset <= NOT(tb_reset);
	   WAIT FOR 50 ns;
	END LOOP;
    END PROCESS;
 
    stim_2: PROCESS
    BEGIN
	tb_takt <= '1';
	WAIT FOR 15 ns;
 
 	LOOP
	   tb_takt <= NOT(tb_takt);
	   WAIT FOR 15 ns;
	END LOOP;
    END PROCESS;
 
 
    stim_3: PROCESS
    BEGIN
	tb_mode <= '1';
	WAIT FOR 150 ns;
 
	LOOP
	   tb_mode <= not(tb_mode);
	   WAIT FOR 150 ns;
	END LOOP;
    END PROCESS;
 
 
END behaviour;
 
 
CONFIGURATION CFG_TB_fog_sync_counter OF TB_fog_sync_counter IS
   FOR behaviour
	FOR UUT: fog_sync_counter
	   USE CONFIGURATION WORK.CFG_fog_sync_counter;
	END FOR;
   END FOR;
END CFG_TB_fog_sync_counter;
trace_fog_sync_counter.vhd
tr tb_takt
tr tb_reset
tr tb_mode
tr tb_zaehlwert
tr tb_null_detect