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