kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Bitmuster-Vergleicher

(EN google-translate)

(PL google-translate)

Es soll eine logische Schaltung über VHDL formuliert werden, die zwei Bitmuster miteinander vergleicht und bei gleichen Mustern 1 liefert, sonst 0.

Die beiden Muster A und B bestehen hier nur aus jeweils zwei Bits. Die entsprechende Wahrheitstabelle ist:

Bit A-1 Bit A-0 Bit B-1 Bit B-0 Ausgang C
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 0 1 1 0
0 1 0 0 0
0 1 0 1 1
0 1 1 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 1 0
1 0 1 0 1
1 0 1 1 0
1 1 0 0 0
1 1 0 1 0
1 1 1 0 0
1 1 1 1 1

Tabelle 0-1: Logiktabelle Bitmuster-Vergleicher.

Eine Realisierung mit Logikbausteinen kann folgendermaßen erfolgen:

Realisierung mit Logikbausteinen.

Bild 0-1: Realisierung mit Logikbausteinen.

Auf dem DLP-FPGA-Board soll das System mittels vierer DIP-Schalter (Bits A-1, A-0, B-1, B-0) und einer Ausgangs-LED realisiert werden (Ausgang C):

Die DIP-Schalter schalten die Eingänge gegen Masse, da interne Pullup-Widerstände aktiviert werden.

Die physikalische Zuordnung der 4 Bits soll sein:

Bit A-1:   IO25    P135  
Bit A-0:   IO26    P139
Bit B-1:   IO27    P140
Bit B-0:   IO28    P142  
Ausgang C: IO19    P125

Code 0-1: Pinzuordnung

Die jeweils korrespondierenden Bits werden mit einem Äquivalenz-Logikbaustein verglichen. Die Ergebnisse aus den Äquivalenz-Logikbausteinen werden UND-Verknüpft.

Bezeichner Bedeutung
and UND
nand Negativ-UND
or ODER
nor Negativ-ODER
xor Exklusiv Oder / Antivalenz
xnor Negativ-Exklusiv Oder / Äquivalenz

Tabelle 0-2: Logische Operatoren in VHDL.

Bit 1 Bit 0 and nand or nor xor xnor
0 0 0 1 0 1 0 1
0 1 0 1 1 0 1 0
1 0 0 1 1 0 1 0
1 1 1 0 1 0 0 1

Tabelle 0-3: Ausgang der verschiedenen logischen Operatoren bei zwei Bits als Eingang.

Operatoren haben in VHDL jeweils die gleiche Priorität, weshalb Klammerungen unabdingbar sind.

Projekt-Download

mustervergleich.zip - Download des Beispiels als ISE-Projekt.

Beschaltung

Foto der gesamten Testschaltung. Alle nachfolgenden Programm-Varianten können damit getestet werden.

Bild 0-2: Foto der gesamten Testschaltung. Alle nachfolgenden Programm-Varianten können damit getestet werden.

Äußere Beschaltung des DLP-FPGA-Boards.

Bild 0-3: Ä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 0-2: 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 0-3: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei mustervergleich.ucf

Version 2 - Automatischer Binärzähler

mustervergleich2.zip - Download des Beispiels als ISE-Projekt.
Beschaltung für diese Projektvariante.

Bild 0-4: Beschaltung für diese Projektvariante.

Nun soll der Binärzähler automatisch hochzählen, statt Werte über die DIP-Schalter einzustellen.

Die Architektur mit den vielen Hilfsvariablen (signal) mag überflüssig aufwändig wirken, aber beispielsweise kann der Ausgangsvektor VIERBIT nicht gelesen werden. D.h. man kann damit keine Zuweisungen der Form x = VIERBIT(0); formulieren. Darum mußte der Hilfsvektor wort eingeführt werden.

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

entity mustervergleich2 is
    Port ( MEINECLOCK : in   STD_LOGIC;
            MEINELED  : out  STD_LOGIC;
            VIERBIT   : out  STD_LOGIC_VECTOR(3 downto 0)
		    );
end mustervergleich2;
-- Clock-In == 6MHz, Toggeln nach 3000000 Schritten ergibt 1Hz Blinkfrequenz.
architecture Behavioral of mustervergleich2 is
    signal zaehler    : integer range 0 to 2999999 := 0;
    signal kleinerzaehler : integer range 0 to 15 := 0;
    signal logikpegel : std_logic := '0';
	 signal wort : std_logic_vector(3 downto 0);
	 signal A1,A0,B1,B0,C : std_logic;
    begin
        process begin
            wait until rising_edge(MEINECLOCK);
            if (zaehler<2999999) then
                zaehler <= zaehler+1;
            else
                zaehler <= 0;
                logikpegel <= not logikpegel;
					 if (kleinerzaehler<15) then
                    kleinerzaehler <= kleinerzaehler+1;
                else
                    kleinerzaehler <= 0;
                end if;					 
            end if;
        end process;

	wort <= conv_std_logic_vector(kleinerzaehler,VIERBIT'length);
	A1 <= wort(0);
	A0 <= wort(1);
	B1 <= wort(2);
	B0 <= wort(3);
        C <= (A1 xnor B1) and (A0 xnor B0);
		  
	VIERBIT <= wort;
        MEINELED <= C;
		  
    end Behavioral;

Code 0-4: Umsetzung mit VHDL in der Projektdatei mustervergleich2.vhd

## GCLK6 ist auf FPGA-Chip Pin 56
NET "MEINECLOCK" LOC = "P56";
## IO_L05P_0 ist auf FPGA-Chip Pin 125
NET "MEINELED"   LOC = "P125";

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

NET "MEINECLOCK" IOSTANDARD = LVCMOS25;
NET "MEINELED"   IOSTANDARD = LVCMOS33; 

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

Code 0-5: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei mustervergleich2.ucf

Version 3 - Modularisierung

mustervergleich3.zip - Download des Beispiels als ISE-Projekt.

Hat man einmal eine etwas kompliziertere Architektur erstellt, die in verschiedenen Projekten gebraucht werden kann, so macht es Sinn, diese als ein Modul zu behandeln und deren Ein- und Ausgänge auf die Signale eines "Gastprojektes" zu mappen.

Die folgende Variante des Mustervergleichers soll demonstrieren wie dies in ISE-Projekten umgesetzt werden kann.

Das Modul vergleich wurde an den Beginn des gleichen Quelltextes gesetzt, wie mustervergleich3.

In diesem Fall ist es nötig die LIBRARY und USE - Angaben für jeden Part zu wiederholen.

Zwei Instanzen des einfachen Bitvergleichers werden im zweiten Programmteil erzeugt.

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

entity vergleich is
    Port (   
	          x : in   STD_LOGIC;
	          y : in   STD_LOGIC;
             z : out  STD_LOGIC
		    );
end vergleich;

architecture vergleich_arch of vergleich is    
begin
    z <= (x and y) or ((not x) and (not y));
end vergleich_arch;

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

entity mustervergleich3 is
    Port ( MEINECLOCK : in   STD_LOGIC;
            MEINELED  : out  STD_LOGIC;
            VIERBIT   : out  STD_LOGIC_VECTOR(3 downto 0)
		    );
end mustervergleich3;
-- Clock-In == 6MHz, Toggeln nach 3000000 Schritten ergibt 1Hz Blinkfrequenz.
architecture Behavioral of mustervergleich3 is
    signal zaehler    : integer range 0 to 2999999 := 0;
    signal kleinerzaehler : integer range 0 to 15 := 0;
    signal logikpegel : std_logic := '0';
	 signal wort : std_logic_vector(3 downto 0);
	 signal A1,A0,B1,B0,C,C1,C0 : std_logic;
    begin
        process begin
            wait until rising_edge(MEINECLOCK);
            if (zaehler<2999999) then
                zaehler <= zaehler+1;
            else
                zaehler <= 0;
                logikpegel <= not logikpegel;
					 if (kleinerzaehler<15) then
                    kleinerzaehler <= kleinerzaehler+1;
                else
                    kleinerzaehler <= 0;
                end if;					 
            end if;
        end process;

	wort <= conv_std_logic_vector(kleinerzaehler,VIERBIT'length);
	A1 <= wort(0);
	A0 <= wort(1);
	B1 <= wort(2);
	B0 <= wort(3);
	
	--Zwei Instanzen des Vergleichers aus vergleicher.vhd
	--erzeugen und Ein- und Ausgänge passend mappen:
	--vergleicher1: entity work.vergleicher(vergleicher_arch)
	vergleicher1: entity vergleich
	    port map(x => A1, y => B1, z => C1);
	--vergleicher2: entity work.vergleicher(vergleicher_arch)
	vergleicher2: entity vergleich
	    port map(x => A0, y => B0, z => C0);
	
   C <= C1 and C0;
   -- alte Version: C <= (A1 xnor B1) and (A0 xnor B0);
		  
	VIERBIT <= wort;
        MEINELED <= C;
		  
    end Behavioral;

Code 0-6: Umsetzung mit VHDL in der Projektdatei mustervergleich3.vhd

## GCLK6 ist auf FPGA-Chip Pin 56
NET "MEINECLOCK" LOC = "P56";
## IO_L05P_0 ist auf FPGA-Chip Pin 125
NET "MEINELED"   LOC = "P125";

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

NET "MEINECLOCK" IOSTANDARD = LVCMOS25;
NET "MEINELED"   IOSTANDARD = LVCMOS33; 

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

Code 0-7: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei mustervergleich3.ucf - identisch zu mustervergleich2.ucf