====== Synchronous separable counter with loadable upper limit ====== ===== Parametereinstellung ===== 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. {{:synthesizeable_vhdl-model-library:lib_dft_sync_counter.svg?nolink&300|Synchronous separable counter with loadable 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 * 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 ===== Model ===== -- ############################################################################ -- # 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; ===== Testbench ===== -- ############################################################################ -- # 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; ===== Synopsys VSS Trace ===== 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