kramann.info
© Guido Kramann

Login: Passwort:










7 Erstellen einer Testbench zur Simulation des Bit-Muster-Vergleichers

7 (EN google-translate)

7 (PL google-translate)

Um Entwürfe zunächst unabhängig von der Hardware testen zu können, ist es möglich eine Datei zu erstellen, die Tests mit dem VHDL-Programm ausführt, indem sie Signale an dessen Eingänge schickt und die sich ergebenden Ausgangssignale anzeigt.

Als Ausgangspunkt wird die erste Version des Mustervergleichers aus Kapitel 5.3 verwendet.

Um Verwechslungen zu vermeiden ist hier noch einmal das Ausgangsprojekt dargestellt und als Download verfügbar:

mustervergleich.zip - Download des Beispiels als ISE-Projekt.
mustervergleich_testbench.zip - Download des um die Testbench ergänzten Projektes. Achtung: Projekt trägt auch den Namen mustervergleich und ist mit XSE 14.7 erstellt worden.
Äußere Beschaltung des DLP-FPGA-Boards.

Bild 7-1: Äußere Beschaltung des DLP-FPGA-Boards.

Quelltext

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity mustervergleich is
    Port ( A1 : in  STD_LOGIC;
           A0 : in  STD_LOGIC;
           B1 : in  STD_LOGIC;
           B0 : in  STD_LOGIC;
           C : out  STD_LOGIC);
end mustervergleich;

architecture Behavioral of mustervergleich is
begin
    C <= (A1 xnor B1) and (A0 xnor B0);
end Behavioral;

Code 7-1: Umsetzung mit VHDL in der Projektdatei mustervergleich.vhd

NET "A1"  LOC = "P135" | PULLUP  | IOSTANDARD = LVCMOS33 ;
NET "A0"  LOC = "P139" | PULLUP  | IOSTANDARD = LVCMOS33 ;
NET "B1"  LOC = "P140" | PULLUP  | IOSTANDARD = LVCMOS33 ;
NET "B0"  LOC = "P142" | PULLUP  | IOSTANDARD = LVCMOS33 ;
NET "C"   LOC = "P125" | IOSTANDARD = LVCMOS33 | SLEW = SLOW ;

Code 7-2: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei mustervergleich.ucf

Erstellen der Testbench

Erstellen Sie in Ihrem Projektordner einen Unterordner "erstetestbench" und entpacken Sie dort das Projekt mustervergleich.zip.

Öffnen Sie dann dieses Projekt, um hier die Testbench hinzuzufügen.

1. Erzeugen Sie einen neuen Quelltext vom Typ "VHDL Testbench"
Gehen Sie dazu zunächst mit der rechten Maustaste auf den Quelltext Ihrer VHDL-Datei und wählen

Bild 7-2: Gehen Sie dazu zunächst mit der rechten Maustaste auf den Quelltext Ihrer VHDL-Datei und wählen "New Source" aus.

Erzeugen Sie dann eine Datei

Bild 7-3: Erzeugen Sie dann eine Datei "musterbench" (Beispielname) vom Typ "VHDL Test Bench".

Die neue Testbench wird mit dem VHDL-Quelltext verknüpft.

Bild 7-4: Die neue Testbench wird mit dem VHDL-Quelltext verknüpft.

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY musterbench_vhd IS
END musterbench_vhd;

ARCHITECTURE behavior OF musterbench_vhd IS 

	-- Component Declaration for the Unit Under Test (UUT)
	COMPONENT mustervergleich
	PORT(
		A1 : IN std_logic;
		A0 : IN std_logic;
		B1 : IN std_logic;
		B0 : IN std_logic;          
		C : OUT std_logic
		);
	END COMPONENT;

	--Inputs
	SIGNAL A1 :  std_logic := '0';
	SIGNAL A0 :  std_logic := '0';
	SIGNAL B1 :  std_logic := '0';
	SIGNAL B0 :  std_logic := '0';

	--Outputs
	SIGNAL C :  std_logic;

BEGIN

	-- Instantiate the Unit Under Test (UUT)
	uut: mustervergleich PORT MAP(
		A1 => A1,
		A0 => A0,
		B1 => B1,
		B0 => B0,
		C => C
	);

	tb : PROCESS
	BEGIN

		-- Wait 100 ns for global reset to finish
		wait for 100 ns;

		-- Place stimulus here

		wait; -- will wait forever
	END PROCESS;

END;

Code 7-3: Quelltext, der automatisch für musterbench.vhd generiert wird.

2. Umschalten von "Synthesis/Implementation" nach "Behavioral Simulation"

Über dem Design-Panel, in dem die eigenen Quelltexte als Baumstruktur angezeigt werden, muß nun von "Synthesis/Implementation" nach "Behavioral Simulation" umgeschaltet werden. Siehe nachfolgendes Bild:

Umschaltung in den Simulations-Modus.

Bild 7-5: Umschaltung in den Simulations-Modus.

Umschaltung in den Simulations-Modus in neueren ISE-Versionen, aktuell 14.7, läuft über Radio-Buttons bei

Bild 7-6: Umschaltung in den Simulations-Modus in neueren ISE-Versionen, aktuell 14.7, läuft über Radio-Buttons bei "View".

Nun erscheint musterbench.vhd als oberster Eintrag in der Hierarchie, weil dieses Programm das darunterliegende Programm mustervergleich.vhd testet.

3. Kodierung der Testsignale
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY musterbench_vhd IS
END musterbench_vhd;

ARCHITECTURE behavior OF musterbench_vhd IS 

	-- Component Declaration for the Unit Under Test (UUT)
	COMPONENT mustervergleich
	PORT(
		A1 : IN std_logic;
		A0 : IN std_logic;
		B1 : IN std_logic;
		B0 : IN std_logic;          
		C : OUT std_logic
		);
	END COMPONENT;

	--Inputs
	SIGNAL A1 :  std_logic := '0';
	SIGNAL A0 :  std_logic := '0';
	SIGNAL B1 :  std_logic := '0';
	SIGNAL B0 :  std_logic := '0';

	--Outputs
	SIGNAL C :  std_logic;

BEGIN

	-- Instantiate the Unit Under Test (UUT)
	uut: mustervergleich PORT MAP(
		A1 => A1,
		A0 => A0,
		B1 => B1,
		B0 => B0,
		C => C
	);

	tb : PROCESS
	BEGIN

		-- Wait 100 ns for global reset to finish
		wait for 100 ns;

		-- Place stimulus here
      -- Hier folgt der eigene Quelltext
		-- +++++++++++++++++++++++++++++++
      A1 <= '0';A0 <= '0';B1 <= '0';B0 <= '0';
		wait for 200 ns;
      A1 <= '0';A0 <= '0';B1 <= '0';B0 <= '1';
		wait for 200 ns;
      A1 <= '0';A0 <= '0';B1 <= '1';B0 <= '0';
		wait for 200 ns;
      A1 <= '0';A0 <= '0';B1 <= '1';B0 <= '1';
		wait for 200 ns;
      
      A1 <= '0';A0 <= '1';B1 <= '0';B0 <= '0';
		wait for 200 ns;
      A1 <= '0';A0 <= '1';B1 <= '0';B0 <= '1';
		wait for 200 ns;
      A1 <= '0';A0 <= '1';B1 <= '1';B0 <= '0';
		wait for 200 ns;
      A1 <= '0';A0 <= '1';B1 <= '1';B0 <= '1';
		wait for 200 ns;
      
      A1 <= '1';A0 <= '0';B1 <= '0';B0 <= '0';
		wait for 200 ns;
      A1 <= '1';A0 <= '0';B1 <= '0';B0 <= '1';
		wait for 200 ns;
      A1 <= '1';A0 <= '0';B1 <= '1';B0 <= '0';
		wait for 200 ns;
      A1 <= '1';A0 <= '0';B1 <= '1';B0 <= '1';
		wait for 200 ns;
      
      A1 <= '1';A0 <= '1';B1 <= '0';B0 <= '0';
		wait for 200 ns;
      A1 <= '1';A0 <= '1';B1 <= '0';B0 <= '1';
		wait for 200 ns;
      A1 <= '1';A0 <= '1';B1 <= '1';B0 <= '0';
		wait for 200 ns;
      A1 <= '1';A0 <= '1';B1 <= '1';B0 <= '1';
		wait for 200 ns;
            		
		-- +++++++++++++++++++++++++++++++
      -- Ende des eigenen Quelltextes
		wait; -- will wait forever
	END PROCESS;

END;

Code 7-4: Um die benötigten Testsignale ergänzte Testbench.

Nun kann das Testbench-File musterbench.vhd editiert werden. Es können zeitlich nacheinander die Eingangsmuster variiert werden, um später in der Simulation zu kontrollieren, ob dazu das richtige Ausgangssignal erzeugt wird.

4. Starten der Simulation
Vor der Simulation sollte die Syntax in der Testbench geprüft werden.

Bild 7-7: Vor der Simulation sollte die Syntax in der Testbench geprüft werden.

Nun kann die Simulation gestartet werden.

Bild 7-8: Nun kann die Simulation gestartet werden.

4b. Probleme mit Version 9, Umstieg auf Version 14.7

Auch das noch nicht editierte Testbench-File liefert den Fehler:

ERROR:Simulator:607 - ISE Simulator is unable to elaborate this design due to specific coding constructs used in the design.

Code 7-5: Fehler nach Start des Testbench-Files bei XSE 9.

Nach Umstieg auf Version ISE 14.7 und Durchführen der Simulation, werden die Signalverläufe der Eingänge und des Ausgangs grafisch dargestellt:

Ergebnis der Simulation.

Bild 7-9: Ergebnis der Simulation.

Das Licence-File sollte unter 
/home/fhbstud/.Xilinx/Xilinx.lic
liegen (Home-Ordner).

Im Terminal ausführen (Pfad anpassen, je nach Installationsort):

source /home/fhbstud/xse14_install/14.7/ISE_DS/settings32.sh 
ise


Code 7-6: Starten von ISE 14.7