====== Parity-Generator ======
===== Parametereinstellung =====
Eine kurze Funktions- und Schnittstellenbeschreibung:
* Das Modell ist in der Bitbreite (@BITBR) parametrisierbar.
* Das Moddell überprüft ob ein Datenstrom gerade oder ungerade ist.
{{:synthesizeable_vhdl-model-library:lib_parity.svg?nolink&400|Parity-Generator block diagram}}
===== Schnittstellen =====
* data_in : Eingang für das auf die Parität hin zu untersuchende Datenbitmuster
* parity_gerade_in : Eingang für gerade Parität
* parity_ungerade_in : Eingang für ungerade Parität
* parity_gerade_out : Ausgang für gerade Parität
* parity_ungerade_out : Ausgang für ungerade Parität
===== Model =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : parity.vhd #
-- # #
-- # Schaltung : Modul zur Generierung/Ueberpruefung der Paritaet #
-- # #
-- # Modell : parity #
-- # #
-- # #
-- # #
-- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 25.01.1995 #
-- ############################################################################
-- ############################################################################
-- # IEEE PACKAGES #
-- ############################################################################
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- ############################################################################
ENTITY parity IS
GENERIC(X :INTEGER := @BITBR); -- X := Breite des
-- Datenvektors
PORT(data_in : IN UNSIGNED ((X-1) DOWNTO 0);
parity_gerade_in : IN STD_LOGIC;
parity_ungerade_in : IN STD_LOGIC;
parity_gerade_out : OUT STD_LOGIC;
parity_ungerade_out : OUT STD_LOGIC
);
-- data_in : Eingang fuer das auf die Paritaet
-- : hin zu untersuchende Datenbitmuster
-- parity_gerade_in : Eingang fuer gerade Paritaet
-- parity_ungerade_in : Eingang fuer ungerade Paritaet
-- parity_gerade_out : Ausgang fuer gerade Paritaet
-- parity_ungerade_out : Ausgang fuer ungerade Paritaet
END parity;
ARCHITECTURE verhalten OF parity IS
BEGIN
PROCESS(data_in, parity_gerade_in, parity_ungerade_in)
VARIABLE data_in_var : UNSIGNED ((X-1) DOWNTO 0);
VARIABLE parity_gerade_in_var : STD_LOGIC;
VARIABLE parity_ungerade_in_var : STD_LOGIC;
VARIABLE parity_gerade_out_var : STD_LOGIC;
VARIABLE parity_ungerade_out_var : STD_LOGIC;
VARIABLE zaehler_int : INTEGER;
VARIABLE zaehler_bin : UNSIGNED((X-1) DOWNTO 0);
-- data_in_var : Variable fuer die am Eingang anliegenden
-- : Daten, deren Paritaet untersucht werden soll
-- parity_gerade_in_var : Eingang fuer gerade Paritaet
-- parity_ungerade_in_var : Eingang fuer ungerade Paritaet
-- parity_gerade_out_var : Ausgang fuer gerade Paritaet
-- parity_ungerade_out_var : Ausgang fuer ungerade Paritaet
-- zaehler_int : Variable fuer die Anzahl der 1'sen im ueber-
-- : prueften Bitmuster der Daten im
-- : INTEGER-Format
-- zaehler_bin : Variable fuer die Anzahl der 1'sen im ueber-
-- : prueften Bitmuster der Daten im
-- : UNSIGNED-Format
BEGIN
data_in_var := data_in;
parity_gerade_in_var := parity_gerade_in;
parity_ungerade_in_var := parity_ungerade_in;
zaehler_int := 0;
IF (parity_gerade_in_var = parity_ungerade_in_var) THEN
-- -----------------------------------------------------------------
-- unzulaessige Betriebsart
-- -----------------------------------------------------------------
parity_gerade_out_var := NOT(parity_gerade_in_var);
parity_ungerade_out_var := NOT(parity_ungerade_in_var);
ELSE
-- -----------------------------------------------------------------
-- Zaehlen der 1'sen im Bitmuster
-- -----------------------------------------------------------------
FOR i IN 0 TO (X-1) LOOP
IF (data_in_var(i) = '1') THEN
zaehler_int := zaehler_int + 1;
END IF;
END LOOP;
zaehler_bin := CONV_UNSIGNED(zaehler_int, zaehler_bin'LENGTH);
-- -----------------------------------------------------------------
-- Ausgabe der Paritaet
-- -----------------------------------------------------------------
IF (zaehler_bin(0) = '0') THEN
parity_gerade_out_var := parity_gerade_in_var;
parity_ungerade_out_var := parity_ungerade_in_var;
ELSE
parity_gerade_out_var := NOT(parity_gerade_in_var);
parity_ungerade_out_var := NOT(parity_ungerade_in_var);
END IF;
END IF;
-- --------------------------------------------------------------------
-- Zuweisung der Ausgangssignale
-- --------------------------------------------------------------------
parity_gerade_out <= parity_gerade_out_var;
parity_ungerade_out <= parity_ungerade_out_var;
END PROCESS;
END verhalten;
CONFIGURATION CFG_parity OF parity IS
FOR verhalten
END FOR;
END CFG_parity;
===== Testbench =====
-- ############################################################################
-- # Project : VHDL-Modellbibliothek #
-- # #
-- # Filename : tb_parity.vhd #
-- # #
-- # Schaltung : Testbench fuer Modul zur Generierung/Ueberpruefung #
-- # der Paritaet #
-- # #
-- # Modell : tb_parity #
-- # #
-- # #
-- # Designer : Wolfgang Sehr; ueberarbeitet von Stefan Schmechtig #
-- # Abteilung : Lehrstul fuer rechnergestuetzten Schaltungsentwurf #
-- # Datum : 25.01.1995 #
-- ############################################################################
-- ############################################################################
-- # IEEE PACKAGES #
-- ############################################################################
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
-- ############################################################################
ENTITY TB_parity IS
GENERIC(X :INTEGER := @BITBR); -- X := Operandenbreite
END TB_parity;
ARCHITECTURE verhalten OF TB_parity IS
SIGNAL tb_data_in : UNSIGNED ((X-1) DOWNTO 0);
SIGNAL tb_parity_gerade_in : STD_LOGIC;
SIGNAL tb_parity_ungerade_in : STD_LOGIC;
SIGNAL tb_parity_gerade_out : STD_LOGIC;
SIGNAL tb_parity_ungerade_out : STD_LOGIC;
COMPONENT parity
PORT(data_in : IN UNSIGNED ((X-1) DOWNTO 0);
parity_gerade_in : IN STD_LOGIC;
parity_ungerade_in : IN STD_LOGIC;
parity_gerade_out : OUT STD_LOGIC;
parity_ungerade_out : OUT STD_LOGIC
);
END COMPONENT;
BEGIN
UUT: parity -- einzige Schaltung
PORT MAP( tb_data_in,
tb_parity_gerade_in,
tb_parity_ungerade_in,
tb_parity_gerade_out,
tb_parity_ungerade_out);
stim: PROCESS
VARIABLE data_stim_int : INTEGER;
BEGIN
-- ###############################################################
-- # Betriebsmodus: erzeugen/ueberpruefen von #
-- # gerader Paritaet #
-- ###############################################################
tb_data_in <= CONV_UNSIGNED(0, tb_data_in'LENGTH);
tb_parity_gerade_in <= '1';
tb_parity_ungerade_in <= '0';
WAIT FOR 10 ns;
FOR i IN 0 TO (2**X-1) LOOP
data_stim_int := CONV_INTEGER(tb_data_in);
data_stim_int := data_stim_int + 1;
tb_data_in <= CONV_UNSIGNED(data_stim_int,
tb_data_in'LENGTH);
WAIT FOR 5 ns;
END LOOP;
-- ###############################################################
-- ###############################################################
-- # Betriebsmodus: erzeugen/ueberpruefen von #
-- # ungerader Paritaet #
-- ###############################################################
tb_data_in <= CONV_UNSIGNED(0, tb_data_in'LENGTH);
tb_parity_gerade_in <= '0';
tb_parity_ungerade_in <= '1';
WAIT FOR 10 ns;
FOR i IN 0 TO (2**X-1) LOOP
data_stim_int := CONV_INTEGER(tb_data_in);
data_stim_int := data_stim_int + 1;
tb_data_in <= CONV_UNSIGNED(data_stim_int,
tb_data_in'LENGTH);
WAIT FOR 5 ns;
END LOOP;
-- ################################################################
-- ###############################################################
-- # Betriebsmodus: undefiniert #
-- # #
-- ###############################################################
tb_data_in <= CONV_UNSIGNED(0, tb_data_in'LENGTH);
tb_parity_gerade_in <= '0';
tb_parity_ungerade_in <= '0';
WAIT FOR 10 ns;
FOR i IN 0 TO (2**X-1) LOOP
data_stim_int := CONV_INTEGER(tb_data_in);
data_stim_int := data_stim_int + 1;
tb_data_in <= CONV_UNSIGNED(data_stim_int,
tb_data_in'LENGTH);
WAIT FOR 5 ns;
END LOOP;
-- ###############################################################
-- ###############################################################
-- # Betriebsmodus: undefiniert #
-- # #
-- ###############################################################
tb_data_in <= CONV_UNSIGNED(0, tb_data_in'LENGTH);
tb_parity_gerade_in <= '0';
tb_parity_ungerade_in <= '1';
WAIT FOR 10 ns;
FOR i IN 0 TO (2**X-1) LOOP
data_stim_int := CONV_INTEGER(tb_data_in);
data_stim_int := data_stim_int + 1;
tb_data_in <= CONV_UNSIGNED(data_stim_int,
tb_data_in'LENGTH);
WAIT FOR 5 ns;
END LOOP;
-- ###############################################################
END PROCESS;
END verhalten;
CONFIGURATION CFG_TB_parity OF TB_parity IS
FOR verhalten
FOR UUT: parity
USE CONFIGURATION WORK.CFG_parity;
END FOR;
END FOR;
END CFG_TB_parity;
===== Synopsys VSS Trace =====
tr tb_data_in
tr tb_parity_gerade_in
tr tb_parity_ungerade_in
tr tb_parity_gerade_out
tr tb_parity_ungerade_out