kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Verwendung der Library UNISIM von Xilinx

(EN google-translate)

(PL google-translate)


Typische Digitale Schaltkreise wie beispielsweise Flip-Flops, Schieberegister, Multiplexer, aber auch Elemente, die eine direkte physikalische Entsprechung auf dem FPGA haben, wie beispielsweise Lookup-Table oder RAM-Elemente, werden als direkt verwendbare Elemente (entities) in der UNISIM-Bibliothek von Xilinx zur Verfügung gestellt.


Die Verwendung der UNISIM-Elemente hilft eigene Programmierfehler zu vermeiden und gewährleistet eine auf die Hardware bezogene optimale Implementierung.


Während bis zu diesem Punkt alle benötigten Elemente von scratch auf mit VHDL formuliert wurden, um ein Grundverständnis hierfür zu bekommen, soll nun damit begonnen werden, die Bibliotheks-Elemente der UNISIM-Library mit einzubeziehen.

Erste Schritte mit UNISIM: Schieberegister

schieberegister_unisim.zip - Download des nachfolgenden Projektes mit ISE9.

In der Übung in Kapitel 9 wurde ein D-FlipFlop als Unterprogramm verwendet. Dieses soll nun durch ein UNISIM-Element ersetzt werden.

Die in UNISIM verfügbaren Elemente werden in dem Datenblatt "Spartan-3E Libraries Guide for HDL Designs" (spartan3e_hdl.pdf) beschrieben.


spartan3e_hdl.pdf - Download bei Xilinx.

Auch verfügbar bei Xilinx: Template-Files Spartan3e_Library_Guide_14.7_HDL_Templates.zip.

Seite 22 gibt eine Übersicht über die verfügbaren D-FlipFlop-Varianten. Ein einfachste D-FlipFlop-Variante, die als Beispiel im folgenden Projekt benutzt wird, wird ab Seite 46 genauer beschrieben.

Übersicht der D-FlipFlop-Varianten aus dem Datenblatt

Bild 0-1: Übersicht der D-FlipFlop-Varianten aus dem Datenblatt "Spartan-3E Libraries Guide for HDL Designs" (spartan3e_hdl.pdf)

Beschreibung des Elements FDCE - ein D-Flip-Flop mit Clock-Enable und asynchronem Reset.

Bild 0-2: Beschreibung des Elements FDCE - ein D-Flip-Flop mit Clock-Enable und asynchronem Reset.

Port-Pin Beschreibung
D Eingang
Q Ausgang
CE Clock-Enable
C Clock
CLR Asynchroner Reset

Tabelle 0-1: Beschreibung der Port-Pins von FDCE (vergl. spartan3e_hdl.pdf, S. 46ff.)

Vorgehen

Das Element FDCE soll nun in dem bestehenden Projekt "schieberegister" (Musterlösung zu Aufgabe 3 in Kapitel 9) statt des selbst geschriebenen D-FlipFlops verwendet werden.

Um mit dem vorhandenen Projekt weiter arbeiten zu können, wird dieses zunächst einfach in einen Unterordner "schieberegister_unisim" kopiert und dann die Kopie geöffnet.

Dann wird die UNISIM-Library verfügbar gemacht und es werden statt der entities von dflipflop entities von FDCE verwendet.

Im Unterschied zu "dflipflop" besitzt "FDCE" einen Clock-Enable-Eingang CE. Dieser muß zu Anpassung dauerhaft auf High gesetzt werden.

Was ändert sich? - Nachfolgend ist der wesentliche Unterschied im Quelltext zu sehen: OHNE DAS SCHLÜSSELWORT "entity" wird ein FDCE-Element instanziiert:

Außerdem wurde in dflipflop.vhd der Reset-Eingang bereits invers definiert. Dies muß bei FDCE durch das äußere Mapping angepaßt werden.

	FLIP3: entity dflipflop
	    port map(D => sig_d(3), CLOCK => clock1Hz, RESET => all_reset, Q => sig_q(3));

Code 0-1: Alte Version am Beispiel des dritten Flip-Flops.

	FLIP3: FDCE
	    port map(D => sig_d(3), C => clock1Hz, CLR => not all_reset, Q => sig_q(3), CE => eins);

Code 0-2: Neue Version am Beispiel des dritten Flip-Flops unter Verwendung von FDCE.

Hier folgt nun der gesamte Quelltext des Projektes (die Datei dflipflop.vhd wurde nach Umstellung auf FDCE entfernt):

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

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
library UNISIM;
use UNISIM.VComponents.all;

entity schieberegister is
    Port ( CLOCK6MHZ : in  STD_LOGIC;
           RESET : in  STD_LOGIC;
           BITIN : in  STD_LOGIC;
           VIERBIT : out  STD_LOGIC_VECTOR (3 downto 0));
end schieberegister;

architecture Verhalten_Schieberegister of schieberegister is
    signal sig_d       : std_logic_vector (3 downto 0) := "0000";
    signal sig_q       : std_logic_vector (3 downto 0) := "0000";
	 signal clock1Hz    : std_logic := '0';
	 signal all_reset   : std_logic := '1';
    signal zaehler     : integer range 0 to 2999999 := 0;	 
	 
	 --Dauerhaftes Logisch-High-Signal, um den Enable-Eingang CE des FDCE dauerhaft High zu setzen.
	 signal eins        : std_logic := '1';
begin						
-- Erzeugen der 1Hz-Clock mit Hilfe eines Prozesses (vergl. Blink-LED)
   process begin
        wait until rising_edge(CLOCK6MHZ);
        if (zaehler<2999999) then
            zaehler <= zaehler+1;
        else
            zaehler <= 0;
            clock1Hz <= not clock1Hz;
        end if;
   end process;
-- Vier D-FlipFlops instanziieren
--	FLIP3: entity FDCE_instanz
	FLIP3: FDCE
	    port map(D => sig_d(3), C => clock1Hz, CLR => not all_reset, Q => sig_q(3), CE => eins);
	FLIP2: FDCE
	    port map(D => sig_d(2), C => clock1Hz, CLR => not all_reset, Q => sig_q(2), CE => eins);
	FLIP1: FDCE
	    port map(D => sig_d(1), C => clock1Hz, CLR => not all_reset, Q => sig_q(1), CE => eins);
	FLIP0: FDCE
	    port map(D => sig_d(0), C => clock1Hz, CLR => not all_reset, Q => sig_q(0), CE => eins);
-- Signalwege / Verbindungen laut Schaltplan beschreiben
   -- Verbindungen zwischen den D-FlipFlops und zum Eingangsschalter
   sig_d(0) <= not BITIN;
	sig_d(1) <= sig_q(0);
	sig_d(2) <= sig_q(1);
	sig_d(3) <= sig_q(2);
	-- Verbindungen zu den LEDs
	VIERBIT(3) <= sig_q(3);
	VIERBIT(2) <= sig_q(2);
	VIERBIT(1) <= sig_q(1);
	VIERBIT(0) <= sig_q(0);
end Verhalten_Schieberegister;

Code 0-3: schieberegister.vhd - Modifiziertes Projekt unter Verwendung von FDCE als D-FlipFlop aus der UNISIM-Library.


## GCLK6 ist auf FPGA-Chip Pin 56
NET "CLOCK6MHZ" LOC = "P56";

NET "VIERBIT<3>"   LOC = "P126";
NET "VIERBIT<2>"   LOC = "P130";
NET "VIERBIT<1>"   LOC = "P131";
NET "VIERBIT<0>"   LOC = "P132";

NET "CLOCK6MHZ" IOSTANDARD = LVCMOS25;

NET "VIERBIT<3>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<2>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<1>" IOSTANDARD = LVCMOS33; 
NET "VIERBIT<0>" IOSTANDARD = LVCMOS33; 

NET "RESET"  LOC = "P12"  | PULLUP | IOSTANDARD = LVCMOS33;

NET "BITIN"  LOC = "P135" | PULLUP | IOSTANDARD = LVCMOS33;

Code 0-4: Beim Constraints-File schieberegister.ucf gibt es keine Änderungen gegenüber der ursprünglichen Version.