Δημοκρίτειο Πανεπιστήμιο Θράκης Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Γ. Δημητρακόπουλος Ολοκληρωμένα κυκλώματα 1 ο σετ ασκήσεων Άσκηση 1 Καλείστε να σχεδιάσετε ένα κύκλωμα το οποίο θα δέχεται στην είσοδό του 4 λέξεις των 4 bits η καθεμία A, B, C, D καθώς και δύο σήματα ελέγχου S 1 και S 0. Το κύκλωμα αυτό θα ανακατανέμει τα δεδομένα των εισόδων A, B, C, D στις τέσσερις εξόδους του κυκλώματος ανάλογα με τις τιμές των σημάτων ελέγχου. S 1S 0 = 00 : A, B, C, D A, B, C, D S 1S 0 = 01 : A, B, C, D D, A, B, C S 1S 0 = 10 : A, B, C, D C, B, A, D S 1S 0 = 11 : A, B, C, D A, D, C, B Απάντηση 1 Θα πρέπει να δοθεί προσοχή στο γεγονός πως οι είσοδοι του κυκλώματος είναι των 4 bits η κάθε μία, και όχι του 1 bit. Έτσι, η δομή του κυκλώματός μας θα είναι όπως φαίνεται παρακάτω: Χρησιμοποιώντας πολυπλέκτες 4-σε-1 των 4 bit μπορούμε να διαμοιράσουμε τις εισόδους A, B, C και D στις εξόδους ως εξής:
Ένας πολυπλέκτης 4-σε-1 των k bits αποτελείται από k 4-σε-1 πολυπλέκτες του 1 bit, οι οποίοι ελέγχονται όλοι από τα ίδια σήματα επιλογής. Η δομή καθενός από τους τέσσερις 4-σε-1 πολυπλέκτες των 4 bits φαίνεται παρακάτω: Τέλος, η δομή ενός 4-σε-1 πολυπλέκτη φαίνεται παρακάτω:
Άσκηση 2 Σχεδιάστε ένα κύκλωμα συνδυαστικής λογικής, το οποίο θα μηδενίζει το λιγότερο σημαντικό 1 που υπάρχει στη λέξη εισόδου. Για παράδειγμα στην περίπτωση των τεσσάρων bits, αν η λέξη εισόδου ήταν η A 3A 2A 1A 0=1010 η έξοδος θα ήταν ίση με Z 3Z 2Z 1Z 0=1000 όπου το λιγότερο σημαντικό 1 (αυτό που βρισκόταν στην θέση A 1) έχει μηδενιστεί. Αντίστοιχα, στην περίπτωση της εισόδου 1100 η έξοδος θα ήταν και πάλι 1000. a) Γράψτε σε ψευδοκώδικα τον αλγόριθμο που θα υλοποιούσε στη γενική περίπτωση την παραπάνω λειτουργία, θεωρώντας είσοδο και έξοδο των n bits. b) Υλοποιήστε τον αλγόριθμο σας με μια επαναληπτική δομή. c) Αν είχατε έτοιμο ένα κύκλωμα διαιτησίας (arbiter), σαν αυτό που δείξαμε στο μάθημα, πώς θα μπορούσατε να το χρησιμοποιήσετε, μαζί με λίγη επιπλέον λογική, ώστε να πετύχετε την ίδια λειτουργία; Απάντηση 2 a) Ο ψευδοκώδικας που θα υλοποιούσε την παραπάνω λειτουργία είναι ο ακόλουθος. found = 0 for (i = 0; i < n; ++i) { Z[i] = A[i] if (A[i] &&!found) { Z[i] = 0 found = 1 } } Αρχικοποιούμε την λογική μεταβλητή found σε 0 (false), και αντιγράφουμε επαναληπτικά στο Z τα περιεχόμενα του A, μέχρι να συναντήσουμε το πρώτο 1. Όταν εντοπίσουμε το πρώτο 1 στο A, αλλάζουμε την τιμή του Z σε αυτή τη θέση σε 0, και το found σε 1 (true). Συνεχίζουμε αντιγράφοντας τις τιμές του A στο Z. b) Μια επαναληπτική δομή που υλοποιεί τον παραπάνω αλγόριθμο είναι το ακόλουθο κύκλωμα ριπής.
Κάθε ένα από τα τετράγωνα του παραπάνω κυκλώματος αποτελείται από το ακόλουθο υποκύκλωμα: Είναι εμφανές πως όταν το old_found είναι 0, το Z[i] θα είναι 0, ενώ όταν είναι 1 το Z[i] θα είναι ότι και το A[i]. Το new_found είναι 1 είτε όταν το Α[i] γίνει για πρώτη φορά 1, είτε όταν το old_found είναι 1. c) Αν είχαμε ένα κύκλωμα διαιτησίας το οποίο θα έδινε στην έξοδό του ένα 1 σε μία από τις n εξόδους του, τότε θα μπορούσαμε να υλοποιήσουμε την ζητούμενη λειτουργία με τον ακόλουθο τρόπο: Ο arbiter που χρησιμοποιούμε στο κύκλωμα δίνει προτεραιότητα στο λιγότερο σημαντικό bit (LSB) της εισόδου του, δηλαδή θα δώσει grand στο 1 που βρίσκεται πιο δεξιά. Το bit που θα κερδίσει το grand θα είναι το μόνο με τιμή 1, και λόγω της πύλης ΝΟΤ θα γίνει 0 «μασκάροντας» το αντίστοιχο bit εξόδου. Τα υπόλοιπα bit θα έχουν τιμή 0 στην έξοδο του arbiter και επομένως 1 μετά την πύλη NOT, επιτρέποντας την διέλευση της εισόδου στην έξοδο ανεπηρέαστη.