synthesizeable_vhdl-model-library:parity-generator

Parity-Generator

Eine kurze Funktions- und Schnittstellenbeschreibung:

  • Das Modell ist in der Bitbreite (@BITBR) parametrisierbar.
  • Das Moddell überprüft ob ein Datenstrom gerade oder ungerade ist.

Parity-Generator block diagram

  • 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
parity.vhd
-- ############################################################################
-- # 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;
tb_parity.vhd
-- ############################################################################
-- # 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;
trace_parity.vhd
tr tb_data_in
tr tb_parity_gerade_in
tr tb_parity_ungerade_in
tr tb_parity_gerade_out
tr tb_parity_ungerade_out