-- ############################################################################ -- # 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;