====== DEMUX ======
===== Model =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : demux.vhd #
-- # #
-- # Schaltung : Demultiplexer mit parametrierbarer Anzahl von Datenein- #
-- # gaenge und parametrierbarer Breite der Dateneingaenge #
-- # #
-- # Modell : demux #
-- # #
-- # #
-- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 17.03.1995 #
-- ############################################################################
-- ############################################################################
-- # IEEE PACKAGES #
-- ############################################################################
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- ############################################################################
-- ############################################################################
-- # Bibliotheks - SPEZIFISCHE PACKAGES #
-- ############################################################################
use WORK.local.all;
ENTITY demux IS
GENERIC (X : INTEGER := @ANZAHL; -- X: Anzahl der Dateneingaenge
Y : INTEGER := @BITBR -- Y: Bitbreite der einzelnen Daten
);
PORT ( ${DATEN_EIN}
sel : IN UNSIGNED (LOG_2(X) DOWNTO 0);
daten_aus : OUT UNSIGNED ((Y-1) DOWNTO 0)
);
-- daten_ein : Dateneingangsvektor
-- :
-- sel : Eingangsport fuer die Auswahl der ent-
-- : sprechenden Eingangsdaten
-- :
-- daten_aus : Datenausgangsvektor
-- :
END demux;
ARCHITECTURE dataflow OF demux IS
BEGIN
PROCESS(sel, ${DAT_SENS})
VARIABLE daten_ein_var : UNSIGNED ((X*Y-1) DOWNTO 0);
VARIABLE sel_var : UNSIGNED (LOG_2(X) DOWNTO 0);
VARIABLE daten_aus_var : UNSIGNED ((Y-1) DOWNTO 0);
-- daten_ein_var : Variable fuer den Eingangsvektor der Daten
-- :
-- sel_var : Variable fuer das Select-Signal
-- :
-- sel_int : Variable fuer das Select-Signal im
-- : Integerformat
-- :
-- daten_aus_var : Variable fuer den Datenausgangsvektor
BEGIN
-- ------------------------------------------------------
-- Eingangsports werden Processvariablen zugewiesen
-- ------------------------------------------------------
${DAT_ZUW}
sel_var := sel;
-- ------------------------------------------------------
-- ------------------------------------------------------
-- eigentliche Beschreibung fuer den Demultiplexer
-- ------------------------------------------------------
daten_aus_var := CONV_UNSIGNED('0', daten_aus_var'LENGTH);
-- Diese Zuweisung wird benoetigt, damit data_aus_var
-- nicht mit Latches synthetisiert wird.
FOR i IN 0 TO (X-1) LOOP
IF i = CONV_INTEGER(sel_var) THEN
daten_aus_var := daten_ein_var((Y*i+Y-1) DOWNTO (Y*i));
END IF;
END LOOP;
-- ------------------------------------------------------
-- ------------------------------------------------------
-- Zuweisung der Ausgangsports
-- ------------------------------------------------------
daten_aus <= daten_aus_var;
-- ------------------------------------------------------
END PROCESS;
END dataflow;
CONFIGURATION CFG_demux OF demux IS
FOR dataflow
END FOR;
END CFG_demux;
===== Testbench =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : tb_${FILEANME}.vhd #
-- # #
-- # Schaltung : Testbench fuer Demultiplexer mit parametrierbarer Anzahl #
-- # von Dateneingaengen und parametrierbarer Breite der #
-- # einzelnen Dateneingaenge #
-- # #
-- # Modell : tb_demux #
-- # #
-- # Designer : Wolfgang Sehr #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 17.03.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
-- ############################################################################
-- ############################################################################
-- # Bibliotheks - SPEZIFISCHE PACKAGES #
-- ############################################################################
use WORK.local.all;
ENTITY TB_demux IS
GENERIC (X : INTEGER := ${ANZAHL}; -- X: Anzahl der Dateneingaenge
Y : INTEGER := ${BITBR} -- Y: Bitbreite der einzelnen Daten
);
END TB_demux;
ARCHITECTURE behaviour OF TB_demux IS
SIGNAL tb_daten_ein : UNSIGNED ((X*Y-1) DOWNTO 0);
SIGNAL tb_sel : UNSIGNED (LOG_2(X) DOWNTO 0);
SIGNAL tb_daten_aus : UNSIGNED ((Y-1) DOWNTO 0);
-- tb_daten_ein : Dateneingangsvektor von der Testbench
-- : erzeugt
-- :
-- tb_sel : Select-Signal, von der Testbench erzeugt
-- :
-- tb_daten_aus : Datenausgangsvektor vom UUT empfangen
-- :
COMPONENT demux
PORT( ${TB_DATEN_EIN}
sel : IN UNSIGNED (LOG_2(X) DOWNTO 0);
daten_aus : OUT UNSIGNED ((Y-1) DOWNTO 0)
);
END COMPONENT;
BEGIN
UUT: demux
PORT MAP( ${TB_DAT_ZUW}
sel => tb_sel,
daten_aus => tb_daten_aus
);
stim_1: PROCESS
VARIABLE tb_daten_ein_int_var : INTEGER;
BEGIN
LOOP
tb_daten_ein_int_var := RAND;
tb_daten_ein <= CONV_UNSIGNED(tb_daten_ein_int_var,
tb_daten_ein'LENGTH);
WAIT FOR 200 ns;
END LOOP;
END PROCESS;
stim_2: PROCESS
BEGIN
tb_sel <= CONV_UNSIGNED(0, tb_sel'LENGTH);
WAIT FOR 10 ns;
LOOP
tb_sel <= tb_sel + 1;
WAIT FOR 10 ns;
END LOOP;
END PROCESS;
END behaviour;
CONFIGURATION CFG_TB_demux OF TB_demux IS
FOR behaviour
FOR UUT: demux
USE CONFIGURATION WORK.CFG_demux;
END FOR;
END FOR;
END CFG_TB_demux;
===== Synopsys VSS Trace =====
tr tb_daten_ein
tr tb_sel
tr tb_daten_aus