====== 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