====== Synchronous counter with hard upper limit ====== ===== Parametereinstellung ===== 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) {{:synthesizeable_vhdl-model-library:lib_fog_sync_counter.svg?nolink&300|Synchronous counter with hard upper limit}} ===== Schnittstellen ===== * 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 ===== Model ===== -- ############################################################################ -- # 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; ===== Testbench ===== -- ############################################################################ -- # 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; ===== Synopsys VSS Trace ===== tr tb_takt tr tb_reset tr tb_mode tr tb_zaehlwert tr tb_null_detect