====== MUX ======
===== Model =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : mux.vhd #
-- # #
-- # Schaltung : Multiplexer mit parametrierbarer Anzahl von Datenaus- #
-- # gaenge und parametrierbarer Breite der Datenausgaenge #
-- # #
-- # Modell : mux #
-- # #
-- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 23.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 mux IS
GENERIC (X : INTEGER := @ANZAHL; -- X: Anzahl der Datenausgaenge
Y : INTEGER := @BITBR -- Y: Bitbreite der einzelnen Daten
);
PORT ( daten_ein : IN UNSIGNED ((Y-1) DOWNTO 0);
sel : IN UNSIGNED (LOG_2(X) DOWNTO 0);
${DATEN_AUS}
);
-- daten_ein : Dateneingangsvektor
-- :
-- sel : Eingangsport fuer die Auswahl der ent-
-- : sprechenden Ausgangsport fuer die Eingangs-
-- : daten
-- :
-- daten_aus : Datenausgangsvektor
-- :
END mux;
ARCHITECTURE dataflow OF mux IS
BEGIN
PROCESS(sel, daten_ein)
VARIABLE daten_ein_var : UNSIGNED ((Y-1) DOWNTO 0);
VARIABLE sel_var : UNSIGNED (LOG_2(X) DOWNTO 0);
VARIABLE daten_aus_var : UNSIGNED ((X*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
-- ------------------------------------------------------
daten_ein_var := daten_ein;
sel_var := sel;
-- ------------------------------------------------------
-- ------------------------------------------------------
-- eigentliche Beschreibung fuer den Multiplexer
-- ------------------------------------------------------
daten_aus_var := CONV_UNSIGNED('0', daten_aus_var'LENGTH);
FOR i IN 0 TO (X-1) LOOP
IF (i = CONV_INTEGER(sel_var)) THEN
daten_aus_var((Y*i+Y-1) DOWNTO (Y*i)) := daten_ein_var;
END IF;
END LOOP;
-- ------------------------------------------------------
-- ------------------------------------------------------
-- Zuweisung der Ausgangsports
-- ------------------------------------------------------
${DAT_ZUW}
-- ------------------------------------------------------
END PROCESS;
END dataflow;
CONFIGURATION CFG_mux OF mux IS
FOR dataflow
END FOR;
END CFG_mux;
===== Testbench =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : tb_${FILENAME}.vhd #
-- # #
-- # Schaltung : Testbench fuer Multiplexer mit parametrierbarer Anzahl #
-- # von Dateneingaengen und parametrierbarer Breite der #
-- # einzelnen Dateneingaenge #
-- # #
-- # Modell : tb_mux #
-- # #
-- # Designer : Wolfgang Sehr #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 23.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_mux IS
GENERIC (X : INTEGER := ${ANZAHL}; -- X: Anzahl der Dateneingaenge
Y : INTEGER := ${BITBR} -- Y: Bitbreite der einzelnen Daten
);
END TB_mux;
ARCHITECTURE behaviour OF TB_mux IS
SIGNAL tb_daten_ein : UNSIGNED ((Y-1) DOWNTO 0);
SIGNAL tb_sel : UNSIGNED (LOG_2(X) DOWNTO 0);
SIGNAL tb_daten_aus : UNSIGNED ((X*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 mux
PORT( daten_ein : IN UNSIGNED ((Y-1) DOWNTO 0);
sel : IN UNSIGNED (LOG_2(X) DOWNTO 0);
${TB_DATEN_AUS}
);
END COMPONENT;
BEGIN
UUT: mux
PORT MAP (daten_ein => tb_daten_ein,
sel => tb_sel,
${TB_DAT_ZUW}
);
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_mux OF TB_mux IS
FOR behaviour
FOR UUT: mux
USE CONFIGURATION WORK.CFG_mux;
END FOR;
END FOR;
END CFG_TB_mux;
===== Synopsys VSS Trace =====
tr tb_daten_ein
tr tb_sel
tr tb_daten_aus