Ein Komparator in der Digitaltechnik ist ein elektronischer Schaltkreis, der zwei digitale Werte vergleicht.

Identitäts-Komparator

Bearbeiten
 
Aufbau eines Identitäts-Komparators

Identitäts-Komparatoren (englisch Identity Comparator) testen zwei Bits auf Gleichheit, was mit Hilfe eines XNOR-Gatters erfolgt. Für den Vergleich von Bytes werden je zwei gleichwertige Bits miteinander verglichen und das Ergebnis mit einem Und-Gatter verknüpft.

einfache Komparatoren
Vergleicht Familie Bezeichnung
2×8-bit-Byte TTL SN74LS688 (von TI)
2×9-bit-Byte TTL AM29809 (von AMD)

Größen-Komparator

Bearbeiten
 
Aufbau eines 1-Bit Größen-Komparators

Größen-Komparatoren (engl. Magnitude Comparator) können zusätzlich zur Gleichheit auch auf die Relationen Größer und Kleiner testen. Um den Größenvergleich durchführen zu können, müssen die beiden Zahlen auf die gleiche Weise codiert sein. Zusätzlich muss der Größen-Komparator auf den jeweils verwendeten Code ausgelegt werden.

Wahrheitstabelle für 1-Bit-Größen-Komparator
a b ya>b ya=b ya<b
0 0 0 1 0
0 1 0 0 1
1 0 1 0 0
1 1 0 1 0

n-bit-Größen-Komparator

Bearbeiten

Ein n-bit-Größen-Komparator beruht auf der Grundlage, dass die Differenz aus den zu vergleichenden Größen gebildet wird und das Ergebnis auf 0, <0, >0 geprüft wird. Das Addierwerk beruht im Dualcode auf der Addition des Zweierkomplement, also (-B) ist dasselbe wie (+!B + 1). Bei der Addition einer Zahl mit ihrer invertierten Zahl (zum Beispiel 1001101 + 0110010 = 1111111) sind im Ergebnis alle Bits 1. Wird eine Zahl von sich selber abgezogen, (A − A = A + (!A + 1) = 0, carry=1) ist das Ergebnis 0, mit Übertrag 1.

Soll A mit B verglichen werden, dann gilt:

Bedingung Hinweis Äquivalent Zwischenergebnis Carry Ergebnis
A == B A = B B +!B + 1 b'1..11 + 1 1 0
A > B A = B + d B + d +!B + 1 b'1..11 + 1 + d 1 d
A < B A = B - d B - d +!B + 1 b1..11 + 1 -d 0 -d
 
Schematischer Aufbau eines n-Bit Größenkomparators
Größen-Komparatoren für Dualcode
Vergleicht Familie Bezeichnung
2×5-bit-Byte ECL MC10166
2×8-bit-Byte TTL SN74LS682 bis SN74LS689

Erweiterung

Bearbeiten

Zum Vergleich von Bytes, die mehr Stellen aufweisen, als dies vom Komparator-Baustein vorgegeben ist, kann man mehrere Komparatoren seriell oder parallel verschalten. Die parallele Lösung hat hierbei bei Bytes mit vielen Stellen den Vorteil einer geringeren Latenz, wodurch eine höhere Geschwindigkeit resultiert. Der serielle Aufbau empfiehlt sich lediglich, wenn dadurch weniger Komparator-Bausteine verwendet werden müssen.

 
Serieller Aufbau eines 7-Bit-Byte-Größen-Komparators
 
Paralleler Aufbau eines 8-Bit-Byte-Größen-Komparators

Implementierung in Verilog

Bearbeiten

Das folgende Beispiel zeigt die Implementierung eines 8-bit Größen-Komparators in Verilog:

module comparator_2x8bit(
    input [7:0] A,     // A: 8-bit Eingabewert
    input [7:0] B,     // B: 8-bit Eingabewert
    output reg A_gt_B, // Ausgabebit für A > B
    output reg A_eq_B, // Ausgabebit für A == B
    output reg A_lt_B  // Ausgabebit für A < B
);

always @(*) begin
    // Ausgabe auf 0 setzen
    A_gt_B = 0;
    A_eq_B = 0;
    A_lt_B = 0;

    if (A > B)
        A_gt_B = 1;
    else if (A == B)
        A_eq_B = 1;
    else if (A < B)
        A_lt_B = 1;
end

endmodule

Implementierung in VHDL

Bearbeiten

Das folgende Beispiel zeigt die Implementierung eines 8-bit Größen-Komparators in VHDL:

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

entity comparator_2x8bit is
    Port (
        A : in  STD_LOGIC_VECTOR (7 downto 0); -- A: 8-bit Eingabewert
        B : in  STD_LOGIC_VECTOR (7 downto 0); -- B: 8-bit Eingabewert
        A_gt_B : out STD_LOGIC; -- Ausgabebit für A > B
        A_eq_B : out STD_LOGIC; -- Ausgabebit für A == B
        A_lt_B : out STD_LOGIC -- Ausgabebit für A < B
    );
end comparator_2x8bit;

architecture Behavioral of comparator_2x8bit is
begin
    process(A, B)
    begin
        if A > B then
            A_gt_B <= '1';
            A_eq_B <= '0';
            A_lt_B <= '0';
        elsif A = B then
            A_gt_B <= '0';
            A_eq_B <= '1';
            A_lt_B <= '0';
        else
            A_gt_B <= '0';
            A_eq_B <= '0';
            A_lt_B <= '1';
        end if;
    end process;
end Behavioral;