I-EDV-HOME

  1. Einleitung

  2. Die Umgebung der Bits

  3. Was ist ein 'Bit'?

  4. Digitale Grundschaltungen

  5. Eine einfache Dekodierschaltung

  6. Ein 1-Bit-Volladdierer

  7. Testfragen und Übungsaufgabe

  8. Anhang: C-Demoprogramm für digitale Basisschaltungen


GRUNDLAGEN DER INFORMATIK WS 0203 - Vorlesung
VL9: Digitale Signale; einfache Schaltungen

                       Achtung: dieses Skript gibt nur einen Teil des mündlichen Vortrags wieder !!!
                       

AUTHOR: Gerd Döben-Henisch
DATE OF FIRST GENERATION: Nov-19, 2002
DATE OF LAST CHANGE: Nov-19, 2002
EMAIL: Gerd Döben-Henisch



1. Einleitung


In den letzten Vorlesungen wurden grundlegende Eigenschaften einer Kommunikation in Netzwerken besprochen. Dabei wurde u.a. herausgearbeitet, dass diese Kommunikation in unterschiedlichen Schichten ('Layers') organisiert ist. Jede Schicht leistet eine bestimmte Arbeit und übergibt dann ihr Ergebnis zur Verarbeitung an eine andere Schicht. Bei dem Weg 'von oben nach unten' in einem solchen Schichtenmodell (-man spricht auch vom 'Protokollstack'- führt das dazu, dass jede Schicht ganze spezielle Informationen als 'Kopf' ('header') vor die eigentlich zu verarbeitenden Daten packt. Solche Header sind als Bitfelder organisiert, in denen bestimmte Teilfelder für bestimmte Eigenschaften stehen.

Wir werden an diesem Punkt die Darstellung der Kommunikation in Netzwerken verlassen und uns nun jener Schicht im Computer zuwenden, die dafür verantwortlich ist, dass solche Bitfelder überhaupt verarbeitet werden können; dies ist die sogenannte Hardware des Computers.


START

2. Die Umgebung der Bits


'Bits' treten nicht isoliert auf, sondern als Zuständen von Signalleitungen oder als Zuständen an Eingängen/ Ausgängen von Chips bzw. innerhalb von Chips. Die folgenden Grafiken lokalisieren die Umgebungen von 'Bits':



PC-Bus

Komponenten eines PCs, verbunden durch Busse



Ein Bus besteht vereinfachend aus einer Menge von Leitungen für den Transport von definierten Signalen mit definierten Schnittstellen zu den angeschlossenen Komponenten.

Komponenten am Bus bestehen in der Regel aus mehreren Chips. Ein Chip ist ein Baustein mit diversen Eingängen und Ausgängen. Mit zu den komplexesten Chips zählen Bausteine für CPUs ('Central Processing Units'). Das folgende Bild gibt einen Überblick über die Eingangs- und Ausgangssignale des Pentium II Chips von Intel.



Pentium2

Pemtium II




START

3. Was ist ein 'Bit'?


Als nächstes muss geklärt werden, was genau man unter einem 'Bit' als der kleinsten Informationeinheit im Computer verstehen soll.

Im Zusammenhang mit einem Bit spricht man immer auch von '1' und '0'. Was entspricht diesen Bezeichnungen auf der Ebene der Hardware?

Auf der Ebene der Hardware hat man es mit 'Signalen' zu tun, das sind definierte Ereignisse z.B. im Bereich von elektrischen Spannungen gemessen in Volt [V]. Verwendet man also Begriffe wie '1' oder '0' bzw. 'High' oder 'Low' zur Bezeichnung von Signalzuständen, dann muss festgelegt werden, welche physikalischen Werte den logischen Bezeichnungen '1' oder '0' entsprechen sollen. In der sogenannten positiven Logik wird die Bezeichnung high dem Wert '+5V' (oder auch '+3.5V') zugeordnet und die Bezeichnung low dem Wert 0V. In der sogenannten negativen Logik ist dies genau umgekehrt.

Um Signalstörungen zu minimieren, wurden bestimmte Signalpegel vereinbart, so dass das H-Signal in einem vereinbarten Störabstand zum L-Signal liegt. Bei standard CMOS-Bausteinen liegt der verbotene Bereich z.B. zwischen +1.5V und +3.5V.

Ferner ist aufgrund physikalischer Gegebenheiten davon auszugehen, dass der Übergang von einem L-Zustand in einen H-Zustand eine gewisse Zeit benötigt. Diese Signalanstiegszeit ta wird gemessen zwischen 10% und zwischen 90% der Signalspannung. Entsprechend gibt es eine Signalabfallzeit tf sowie die eigentliche Signaldauer td.

signalpegel

Logik-Signalpegel und Signalzeiten



Empfängt eine digitale Schaltstufe ein Signal, dann benötigt die Verarbeitung des Signals grundsätzlich auch Zeit, d.h. das Signal am Ausgang der Schaltstufe ist um eine gewisse Zeit verzögert. Diese Impulsverzögerungszeit td (d:= delay) wird einmal gemessen zwischen den Zeitpunkten, an denen die ansteigenden Flanken des Eingangssignals und des Ausgangssignals 50% ihrer maximalen Höhe erreicht haben (= td1) oder an jenen Zeitpunkten, an denen die abfallenden Flanken des Eingangs und des Ausgangssignals 50% ihrer maximalen Höhe erreicht haben (= td2).

delaytime

Signalverzögerung durch Gatterlaufzeiten



Für den weiteren Verlauf gehen wir also davon aus, dass es technisch möglich ist, auf der Hardwareebene Signale zur Verfügung zu stellen, bei denen man zwischen den zwei Signalzuständen 'High = 1' bzw. 'Low = 0' unterscheiden kann.


START

4. Digitale Grundschaltungen


Unter Voraussetzung von den Signalzuständen High = H = 1 und Low = L = 0 wurden digitale Basisschaltungen definiert, die sich zu nahezu beliebig komplexen Schaltungen kombinieren lassen. Einige dieser digitalen Basischaltungen werden in den folgenden Bildern gezeigt:



GATTER

Elementare Gatter




DINGATTER

Elementare Gatter: ANSI - DIN Formate



Die Linien links vom Schaltungssymbol repräsentieren Eingänge, die durch Buchstaben bezeichnet sind (z.B. A,B), und die Linien rechts von den SChaltungssymbolen repräsentieren einen Ausgang, dessen 'Wert' von den Werten an den eingängen sowie der Funktion der Schaltung abhängig ist.

An den Namen der digitalen Grundschaltungen kann man schon erkennen, dass sie im Prinzip aussagenlogische bzw. boolsche Funktionen realisieren.

So besteht die Funktion der Schaltung mit dem Namen 'NOT' darin, den Eingangswert A zu negieren, d.h. wenn A=1 dann ist der Ausgang X=0 und umgekehrt, bei A=0 ist X=1.

Die Funktion AND (UND) hat am ausgang den Wert X=1 nur dann, wenn beide Eingänge A=1 und B=1, ansonsten ist X=0. Entsprechend kann man sich die Verhaltensweisen der anderen Schaltungen rekonstruieren.


Statt 'NOT A' bzw. 'NOT(A)' kann man auch schreiben '¬A' oder '¬(A)'

Statt 'A AND B' bzw. 'AND(A,B)' kann man auch schreiben 'A & B' oder '&(A,B)'

Statt 'A NAND B' bzw. 'NAND(A,B)' kann man auch schreiben '¬(A & B)' oder '¬(&(A,B))'

Statt 'A OR B' bzw. 'OR(A,B)' kann man auch schreiben 'A | B' oder '|(A,B)'

Statt 'A NOR B' bzw. 'NOR(A,B)' kann man auch schreiben '¬(A | B)' oder '¬((|(A,B))'


Eine elementare Funktion, die noch oft auftritt, aber nicht in den Bildern repräsentiert ist, ist die Funktion 'XOR' (Exclusive OR). Mit den Eingängen A und B und dem Ausgang X kann man ihr Verhalten so beschreiben: X=1 wenn genau einer der Eingänge A oder B 1 ist; wenn sowohl A und B 0 oder 1 ist, ist X=0.

Statt 'A XOR B' bzw. 'XOR(A,B)' kann man auch schreiben 'A ^ B' oder '^(A,B'

Grafisch wird ein XOR im ANSI-Format durch ein OR mit doppelter Eingangslinie repräsentiert (siehe nachfolgend die grafische Darstellung des 1-Bit-Volladdierers mit zwei XOR-Schaltungen). Im DIN-Format ist XOR ein OR mit '=1' statt '< 1'.


START

5. Eine einfache Dekodierschaltung


Die folgende Schaltung realisiert mittels AND- und OR-Schaltungen eine sogenannte Multiplexer-Schaltung: aus 8 Datenleitungen D0, ..., D7 soll mittels dreier Adressleitungen A,B,C jeweils eine Leitung so ausgewählt werden, dass nur ihr Signal am Ausgang F erscheint. Dies wird dadurch erreicht, dass man jede Datenleitung über ein AND-Gatter führt, das drei weitere Eingänge besitzt, nämlich von jeder Adressleitung entweder das positive Signal oder die Negation. Und da ein AND-Gatter nur dann =1 ist, wenn alle Eingänge =1 sind, wird also das Signal der datenleitung nur dann weitergereicht, wenn alle drei Adressleitungen auch =1 sind. Das nachgeschaltete OR-Gatter 'sammelt' dann die aktiven AND-Ausgänge ein.



multiplexer

Multiplexer




START

6. Ein 1-Bit-Volladdierer


Diese Schaltung ermöglicht die binäre Addition von zwei Bits. Die binäre Rechenregeln für zwei Bits lauten:

  1. 0 + 0 ==> Su = 0; Carry out = 0

  2. 0 + 1 ==> Su = 1; Carry out = 0

  3. 1 + 0 ==> Su = 1; Carry out = 0

  4. 1 + 1 ==> Su = 0; Carry out = 1

Berücksichtigt man noch ein Carry in (für den Fall, dass man mehr als zwei 1-Bit-Zahlen addieren will), dann ergibt sich die Wertetabelle, wie sie in der Grafik dargestellt ist.



volladd

Volladdierer




START

7. Testfragen und Übungsaufgabe


Testfragen:

  1. Welche Aufgaben hat ein Bus?


  2. Was ist ein 'Bit'?


  3. Was bedeutet bei einem Signal der Zustand 'High' bzw. 'Low'?


  4. Nennen Sie 6 verschiedene digitale Basisschaltungen und geben Sie deren Wertetabelle an


  5. Was ist das Prinzip von Multiplexerschaltungen?


  6. Wie funktioniert ein Volladdierer?




Übungsaufgabe

  1. Bilden sie ein Team von max. 5 Mitgliedern

  2. Erstellung Sie gemeinsam einen Texte mit Namen und Matr.Nr. der AutorenInnen. Abgabe einer Kopie des Textes an den Dozenten vor Beginn der nächsten Vorlesung.

  3. Kurzpräsentation der Lösung als Team vor der gesamten Gruppe. Detailliertere Besprechung während der Übungsstunde.

  4. Versuchen Sie in dem Text Antworten auf folgende Aufgaben zu formulieren:

  5. Schreiben Sie ein kleines C-Programm, das einen Volladdierer für 4-Bit-Zahlen realisiert. Benutzen Sie dazu das Beispiel-C-Programm aus dem Anhang. Punktezahl: 1-2 Punkte.


  6. Schreiben Sie ein kleines C-Programm, das einen Subtrahierer für 4-Bit-Zahlen. Benutzen Sie dazu das 2er-Komplement, so dass Sie die Subtraktion auf die Addition zurückführen können. Punktezahl: 1-3 Punkte.



START

8. Anhang: C-Demoprogramm für digitale Basisschaltungen



/******************
 *
 * digi1.c
 *
 * author: gdh
 * first: nov-19,02
 * last:
 *
 * idea: Nutzung der Bitoperatoren zur Realisierung digitaler Schaltungen
 *
 * compilation: gcc -o digi1 digi1.c
 * usage: digi1
 *
 **************************/

#include <stdio.h>
int main(void){

  extern unsigned int not(unsigned int);
  extern unsigned int and(unsigned int, unsigned int);
  extern unsigned int or(unsigned int, unsigned int);
  extern unsigned int xor(unsigned int, unsigned int);

  unsigned int a, b,D0,D1,Cin, Cout,Su;
  int i;

  i=1;

  while(i == 1){

    printf("BASIS NOT, AND, OR -----> 1\n");
    printf("SELEKTION von DO,D1 --> 2\n");
    printf("ADDITION von A,B,Cin ---> 3\n");
    scanf("%d",&a);

    switch(a){

  case 1: { printf("Bitte zwei Zahlen {0,1}, getrennt durch Leerzeichen: ");
                 scanf("%d %d",&a,&b);

             printf("\n\nIhre Eingabe war: %d und %d\n", a,b);

            printf("\nDas NOT-Ergebnis von A= %d  und B= %d\n",not(a), not(b));
            printf("\nDas AND-Ergebnis ist: %d \n",and(a,b));
            printf("\nDas OR-Ergebnis ist: %d \n",or(a,b));  break;
            }

  case 2: { printf("Bitte drei Zahlen aus {0,1}, getrennt durch Leerzeichen: D0,Di,A:  ");
                  scanf("%d %d %d",&D0,&D1,&a);

                 printf("\n\nIhre Eingabe war: D0= %d und D1= %d und A= %d\n", D0,D1,a);

               printf("\nDas Schaltungs-Ergebnis ist %d\n", or(and(D0,a),and(D1,not(a)))); break;
  }
 case 3: { printf("Bitte drei Zahlen aus {0,1}, getrennt durch Leerzeichen: A,B,Cin:  ");
                  scanf("%d %d %d",&a,&b,&Cin);

                 printf("\n\nIhre Eingabe war: A= %d und B = %d und Cin = %d\n", a,b,Cin);

               printf("\nDas Schaltungs-Ergebnis Su = %d\n", xor(xor(a,b),Cin));
               printf("\nDas Schaltungs-Ergebnis Cout = %d\n", or(and(a,b),and(xor(a,b),Cin)));

break;
  }

  default: printf("FEHLER: Diese Option gibt es nicht!"); break;


    }/*End of switch */
  }/* End of while */
return 1;

}
/******************
 *
 * not()
 *
 * idea: negation of argument
 *
 *********************/

unsigned int not(unsigned int a){

  return(!a);
}
/******************
 *
 * and()
 *
 * idea: Executing bit-operation & on two arguments
 *
 *********************/

unsigned int and(unsigned int a, unsigned int b){

  if (a & b) {return 1;}
  else {return 0;}
}
/******************
 *
 * or()
 *
 * idea: Executing bit-operation |  on two arguments
 *
 *********************/

unsigned int or(unsigned int a, unsigned int b){

  if (a | b) {return 1;}
  else {return 0;}
}

/******************
 *
 * xor()
 *
 * idea: Executing bit-operation ^  on two arguments
 *
 *********************/

unsigned int xor(unsigned int a, unsigned int b){

  if (a ^ b) {return 1;}
  else {return 0;}
}


START