Λογική Σχεδίαση Ψηφιακών Συστημάτων

Theory Notes


Digital Number Systems

Υπάρχουν πολλά συστήματα μέτρησης, το πιο γνωστό και αυτό που χρησιμοποιούμε καθημερινά είναι το δεκαδικό σύστημα.

Οι υπολογιστές όμως χρησιμοποιούν το δυαδικό σύστημα και το δεκαεξαδικό σύστημα.

  • Δεκαδικό Σύστημα

    Το δεκαδικό σύστημα αποτελείται από δέκα αριθμούς. Είναι οι αριθμοί από το \(0\) έως \(9\). Το σύστημα αυτό ονομάζεται αλλιώς και ως base-10 γιατί χρησιμοποιεί δέκα ψηφία.

    Νομίζω όλοι γνωρίζουμε να μετράμε οπότε δεν θα μπω σε λεπτομέρεια.

  • Δυαδικό Σύστημα

    Στο δυαδικό σύστημα υπάρχουν μόνο δύο αριθμοί. Είναι οι αριθμοί \(0\) και \(1\). Το σύστημα αυτό ονομάζεται αλλιώς και ως base-2 γιατί χρησιμοποιεί δύο ψηφία.


Binary to Decimal

Όλοι οι δυαδικοί αριθμοί μπορούν να μετατραπούν σε δεκαδικούς αριθμούς. Ας αρχίσουμε με ένα απλό παράδειγμα:

Έστω ότι έχουμε τον δυαδικό αριθμό \(\textbf{11011}_{2}\) και θέλουμε να το μετατρέψουμε σε δεκαδικό αριθμό.

MSB         LSB
 1  1  0  1  1

\(2^{4}\) \(1\)

\(2^{3}\) \(1\)

\(2^{2}\) \(0\)

\(2^{1}\) \(1\)

\(2^{0}\) \(1\)

Τώρα απλά τα προσθέτουμε:

\[2^{0}*1+2^{1}*1+2^{2}*0+2^{3}*1+2^{4}*1=1+2+0+8+16=27_{10}\]

Σημείωση: Το \(10\) δίπλα στον αριθμό \(27\) μας δείχνει ότι πρόκειται για δεκαδικό σύστημα ενώ το \(2\) για δυαδικό. Δλδ το \(\textbf{27}\) είναι βάση-10.

Υπάρχει και πιο εύκολος τρόπος από το να προσθέτουμε τις δυνάμεις του 2 για να βρούμε το αποτέλεσμα.

Η διαδικασία είναι η εξής:

1. Γράφουμε το τέρμα πιο αριστερό 1 του δυαδικού αριθμού.

2. Το διπλασιάζουμε και προσθέτουμε σε αυτό το δεξί bit (είτε είναι 0 είτε 1).

3. Γράφουμε το αποτέλεσμα κάτω από το επόμενο bit.

4. Επαναλαμβάνουμε το βήμα 2 και 3 μέχρι να τελειώσουμε με τον δυαδικό αριθμό.

Ας πάρουμε τον ίδιο δυαδικό αριθμό και ας τον μετατρέψουμε με τον από πάνω τρόπο.

Έχουμε τον αριθμό: 1  1  0  1  1

Τον μετατρέπουμε σε δεκαδικό αριθμό:
				    
					1       1       0        1         1

Βήμα 1:             1 * 2 = 2
Βήμα 2:                   + 1
----
Βήμα 3:                     3 * 2 = 6
Βήμα 2:                           + 0
                                  ----
Βήμα 3:                             6 * 2 = 12
Βήμα 2:                                   +  1
                                          ------
Βήμα 3:                                      13 * 2 = 26
Βήμα 2:                                             +  1
                                                    ------
Τέλος:                                                 27


Decimal to Binary

Σε αυτές τις περιπτώσεις αν και υπάρχουν δύο τρόποι για την μετατροπή, εμείς θα χρησιμοποιούμε τον πιο εύκολο, αυτόν της διαίρεσης.

Έστω ότι έχουμε τον δεκαδικό αριθμό \(\textbf{29}_{10}\).

Το μόνο που κάνουμε είναι να διαιρούμε τον αριθμό αυτό με το \(2\) και να κρατάμε το υπόλοιπο του μέχρι να έχουμε πηλίκο \(0\).

Έχουμε τον αριθμό: 29

Τον μετατρέπουμε σε δεκαδικό αριθμό:

29 div 2 = 14  <-- επόμενος αριθμός που θα διαιρέσουμε
29 mod 2 =  1  <-- κρατάμε το bit

14 div 2 = 7  <-- επόμενος αριθμός που θα διαιρέσουμε
14 mod 2 = 0  <-- κρατάμε το bit

7 div 2 = 3  <-- επόμενος αριθμός που θα διαιρέσουμε
7 mod 2 = 1  <-- κρατάμε το bit

3 div 2 = 1  <-- επόμενος αριθμός που θα διαιρέσουμε
3 mod 2 = 1  <-- κρατάμε το bit

1 div 2 = 0  <-- πηλίκο 0 άρα σταματάμε
1 mod 2 = 1  <-- κρατάμε το bit

Τώρα που βρήκαμε τα bit πρέπει να τα βάλουμε με την σωστή σειρά. Αυτό το κάνουμε από την αντίθετη μεριά από ότι τα υπολογίσαμε. Ο λόγος που γίνεται έτσι είναι γιατί πάντα το LSB είναι το πρώτο που υπολογίζουμε ενώ το MSB είναι το τελευταίο.

1  LSB

0

1

1

1  MSB

Άρα \(\textbf{29}_{10}=\textbf{11101}_2\).


Range

Όταν έχουμε N bits μπορούμε να μετρήσουμε μέχρι και \(2^N\) διαφορετικούς δεκαδικούς αριθμούς οι οποίοι έχουν range από \(0\) μέχρι και \(2^{Ν} - 1\).

Δηλαδή έστω ότι έχουμε N = 4 bits, αυτό σημαίνει ότι μπορούμε να μετρήσουμε από το \(0000_2\) μέχρι και το \(1111_2\) δλδ από \(0_{10}\) μέχρι και \(15_{10}\).

Σε αυτή την περίπτωση η μεγαλύερη τιμή που μπορούμε να έχουμε είναι:

\[2^{Ν} - 1 = 2^{4} -1 = 15\]

Και μπορούμε να μετρήσουμε \(2^4\) διαφορετικούς δεκαδικούς αριθμούς.


Hexadecimal Numbers

Ας δούμε τους αριθμούς από το \(0\) μέχρι το \(15\) στο δυαδικό, δεκαδικό αλλά και στο δεκαεξαδικό σύστημα.

Binary Decimal Hexadecimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F

Οι δεκαεξαδικοί αριθμοί χρησιμοποιούνται αρκετά στους υπολογιστές καθώς κάνουν πιο εύκολη την αναπαράσταση μεγάλων δυαδικών αριθμών.

Όλοι οι δεκαεξαδικοί αριθμοί μετατρέπονται σε δυαδικούς και δεκαδικούς. Αλλά ισχυεί και το αντίστροφο.


Hex to Decimal

Η διαδικασία είναι πολύ όμοια με την μετατροπή δυαδικού σε δεκαδικό αριθμό.

Παράδειγμα:

\(356_{16}\) \(= 3 * 16^2 + 5 * 16^1 + 6 *16^0 = 768 + 80 + 6 = 854_{10}\)

\(\textrm{4BC}_{16}\) \(= 4* 16^2 + 11 * 16^1 + 12 * 16^0 = 1024 +176 + 12= 1212_{10}\)

Για κάθε ψηφίο του δεκαεξαδικού αριθμού έχουμε και μία νέα δύναμη του \(16\).


Decimal to Hex

Η διαδικασία αυτή είναι επίσης όμοια με την μετατροπή του δεκαδικού σε δυαδικό. Απλά κάνουμε συνεχόμενες διαιρέσεις με το \(16\) μέχρι το πηλίκο να είναι \(0\).

Για παράδειγμα ας μετατρέψουμε τον αριθμό \(748_{10}\) σε δεκαεξαδικό:

Έχουμε τον αριθμό: 748

748 div 16 = 46     <-- επόμενος αριθμός που θα διαιρέσουμε
748 mod 16 = 12     <-- κρατάμε το ψηφίο αυτό

46 div 16 = 2       <-- επόμενος αριθμός που θα διαιρέσουμε
46 mod 16 = 14      <-- κρατάμε το ψηφίο αυτό

2 div 16 = 0        <-- τέλος γιατί το πηλίκο είναι μηδέν
2 mod 16 = 2        <-- κρατάμε το ψηφίο αυτό

Και πρέπει να θυμόμαστε ότι το πρώτο ψηφίο που βρήκαμε είναι το MSB ενώ το τελευταίο είναι το LSB άρα ο αριθμός \(748_{10}\) σε δεκαδικό είναι:

12 --> C στο δεκαεξαδικό

14 --> Ε στο δεκαεξαδικό

LSB     MSB
 2   E   C

Άρα \(\textbf{2EC}_{16}\) είναι το αποτέλεσμα.


Hex to Binary

Αυτή η μετατροπή είναι πολύ εύκολη αν κάποιος έχει μάθει τον από πάνω πίνακα απέξω. Για να μετατρέψουμε έναν δεκαεξαδικό αριθμό σε δυαδικό απλά μετατρέπουμε ένα-ένα τα ψηφία του σε δυαδικούς αριθμούς και μετά τους ενώνουμε.

Παράδειγμα ας μετατρέψουμε τον δεκαεξαδικό αριθμό \(\textrm{5DF}_{16}\) σε δυαδικό :

Έχουμε τον δεκαεξαδικό αριθμό: 5DF

5 --> 0101

D --> 1101

F --> 1111

Άμα τα ενώσουμε έχουμε τον δυαδικό αριθμό \(10111011111_{2}\).

Ως εξάσκηση μετατρέψτε τους ακόλουθους δεκαεξαδικούς αριθμούς σε δυαδικούς:

α) \(\textrm{46C}_{16}\)

β) \(\textrm{3A5E}_{16}\)


Binary to Hex

Επίσης πολύ απλή μετατροπή καθώς είναι η αντίστροφη διαδικασία από την από πάνω μετατροπή. Απλά σπάμε τον δυαδικό αριθμό ανά \(4\) bit αρχίζοντας από το τέλος και μετατρέπουμε κάθε ομάδα στον αντίστοιχο δεκαεξαδικό αριθμό.

Ας μετατρέψουμε τον αριθμό \(10101100011101_{2}\) σε δεκαεξαδικό:

Έχουμε τον αριθμό: 10 1011 0001 1101

Τον σπάμε ανά 4 bit:

1101 --> D

0001 --> 1

1011 --> B

10   --> 0010 --> 2

Άρα είναι ο αριθμός \(\textrm{2B1D}\).