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