Βιβλιοθήκη Δομικών Στοιχείων σε Verilog
γιά τις Ασκήσεις Υλοποίησης Επεξεργαστή
Γιά τις σειρές ασκήσεων που αφορούν την υλοποίηση του επεξεργαστή
θα χρησιμοποιείστε τη βιβλιοθήκη έτοιμων δομικών στοιχείων
που βρίσκεται στο αρχείο
~hy225/verilog/lib/lib6.v
και η οποία περιέχει τα παρακάτω modules.
1. Reg (Καταχωρητής)
-
module Reg (q, d, lden, clk);
- Είναι ο τυπικός ακμοπυροδότητος καταχωρητής, τύπου D.
-
Παράμετροι - Πόρτες:
- N
- Παράμετρος: το πλάτος του καταχωρητή, σε bits.
- q
- Εξοδος (N bits): έξοδος δεδομένων.
- d
- Είσοδος (N bits): είσοδος δεδομένων.
- lden
- Είσοδος (1 bit): έλεγχος επίτρεψης φόρτωσης (load enable)
θετικής πολικότητας (1: φόρτωσε, 0: κράτα τα παλαιά περιεχόμενα).
- ck
- Είσοδος (1 bit): ρολόϊ θετικής ακμοπυροδότησης.
Οι είσοδοι d και lden πρέπει να έχουν σταθεροποιηθεί
τουλάχιστο 0.2 ns (χρόνος προετοιμασίας, set-up time)
πριν τη θετική ακμή του ρολογιού.
Ο χρόνος κρατήματος (hold time) είναι μηδέν.
Η έξοδος q αλλάζει τιμή
το αργότερο μέσα σε 0.1 ns (καθυστέρηση εξόδου, output delay)
από τη θετική ακμή του ρολογιού (όταν lden=1).
-
Παράδειγμα χρήσης:
- Reg #32 pcreg (pc, nxtpc, pcld, clk);
2. Mux2, Mux4, Mux8 (Πολυπλέκτες)
-
module Mux2 (out, in0, in1, sel);
-
module Mux4 (out, in0, in1, in2, in3, sel);
-
module Mux8 (out, in0, in1, in2, in3, in4, in5, in6, in7, sel);
- Πολυπλέκτες 2-σε-1, 4-σε-1, και 8-σε-1 αντίστοιχα.
-
Παράμετροι - Πόρτες:
- N
- Παράμετρος: το πλάτος του πολυπλέκτη, σε bits.
- out
- Εξοδος (N bits): πολυπλεγμένη έξοδος.
Η καθυστέρηση της εξόδου,
σε σχέση με την τελευταία των εισόδων (δεδομένα ή επιλογή),
είναι το πολύ
0.2 ns στο Mux2, 0.3 ns στο Mux4, και 0.4 ns στο Mux8.
- in0
- Είσοδος (N bits): είσοδος που επιλέγεται όταν sel=0.
- in1
- Είσοδος (N bits): είσοδος που επιλέγεται όταν sel=1.
- ...
- ...
- in7
- Είσοδος (N bits): είσοδος που επιλέγεται όταν sel=7.
- sel
- Είσοδος (1 bit στο Mux2, 2 bits στο Mux4, 3 bits στο Mux8):
είσοδος επιλογής.
-
Παράδειγμα χρήσης:
- Mux2 #32 muxaddr (ma, pc, ALUout, IorD);
3. ALU (Αριθμητική-Λογική Μονάδα)
-
module ALU (out, inA, inB, op);
- Απλή 32-μπιτη αριθμητική/λογική μονάδα.
Εκτελεί πρόσθεση ή αφαίρεση ακεραίων
(συμπλήρωμα ως προς 2, 2's complement),
ή τις λογικές πράξεις AND/OR.
-
Πόρτες:
- out
- Εξοδος (32 bits): έξοδος δεδομένων.
Η καθυστέρηση της εξόδου,
σε σχέση με την τελευταία των εισόδων (δεδομένα ή επιλογή),
είναι το πολύ 1.5 ns.
- inA
- Είσοδος (32 bits): πρώτη είσοδος δεδομένων.
- inB
- Είσοδος (32 bits): δεύτερη είσοδος δεδομένων.
- op
- Είσοδος (2 bits): είσοδος επιλογής πράξης:
- 00
- πρόσθεση: out = inA + inB.
- 01
- αφαίρεση: out = inA - inB.
- 10
- bitwise OR: out = inA OR inB.
- 11
- bitwise AND: out = inA AND inB.
-
Παράδειγμα χρήσης:
- ALU alu0 (ALUarith, ALUinA, ALUinB, ALUop);
4. Memory (Μνήμη)
-
module Memory (ren, wen, addr, din, dout);
- Γρήγορη ασύγχρονη μνήμη εντολών/δεδομένων.
-
Πόρτες:
- ren
- Είσοδος (1 bit): ενεργοποίηση ανάγνωσης (read enable).
- wen
- Είσοδος (1 bit): ενεργοποίηση εγγραφής (write enable).
- addr
- Είσοδος (32 bits): διεύθυνση προσπέλασης.
Η διεύθυνση αναφέρεται σε bytes (byte-addressable).
Δεδομένου ότι εμείς έχουμε μόνο λέξεις στην υλοποίησή μας,
τα δύο LS bits της διεύθυνσης αυτής πρέπει να είναι μηδέν,
και η πραγματική προσπέλαση γίνεται νε τα 30 MS bits.
Για πρακτικούς λόγους, κατά την προσομοίωση,
υλοποιούνται μόνο οι πρώτες 1024 λέξεις της μνήμης.
Επομένως, τα 20 MS bits της διεύθυνσης πρέπει να είναι μηδέν.
- din
- Είσοδος (32 bits): είσοδος δεδομένων προς εγγραφή.
- dout
- Εξοδος (32 bits): εξοδος δεδομένων ανάγνωσης.
-
Παράδειγμα χρήσης:
- Memory mem (memRd, memWr, ma, B, md);
Η μνήμη είναι ασύγχρονη,
δηλαδή ο χρονισμός των προσπελάσεων σε αυτήν
δεν καθορίζεται από το ρολόϊ του επεξεργαστή
(δεν έχει σαν είσοδο το ρολόϊ που έχουν οι ακμοπυροδότητοι καταχωρητές).
Για να λειτουργήσει η μνήμη σωστά,
ακολουθείται το πρωτόκολλο χρονισμού που φαίνεται στο εξής σχήμα:
Εγγραφή στη μνήμη:
γίνεται με βάση το σήμα wen --γιά κάθε εγγραφή:
- Σηκώνουμε το wen.
- To πολύ σε χρόνο 0.5 ns πρέπει να έχουν σταθεροποιηθεί
η διεύθυνση των δεδομένων που θα γράψουμε (addr)
και τα ίδια τα δεδομένα (din).
- Για ελάχιστο χρόνο 1.5 ns απο εκεί και πέρα,
τα wen, addr, και din πρέπει να παραμείνουν όπως είναι.
Ανάγνωση απο τη μνήμη:
γίνεται με βάση το ren --γιά κάθε ανάγνωση:
- Σηκώνουμε το ren.
- To πολύ σε χρόνο 0.5 ns πρέπει να έχει σταθεροποιηθεί
η διεύθυνση των δεδομένων που θα διαβάσουμε (addr).
- Μετά απο άλλα 1.5 ns, η μνήμη θα βάλει τα δεδομένα στο dout.
Τα δεδομένα θα παραμείνουν εκεί όσο το ren παραμένει 1
και η διεύθυνση παραμένει σταθερή.
Προσοχή:
Αν τυχόν χρειάζεται να κάνω δύο διαδοχικές εγγραφές,
πρέπει, αφού ολοκληρωθεί η πρώτη,
το wen να πέσει και μετά να ξανασηκωθεί για την δεύτερη.
Ομοίως και με δύο διαδοχικές αναγνώσεις και το ren.
5. RegFile (Αρχείο Καταχωρητών)
-
module RegFile (raA, raB, wa, wen, wd, rdA, rdB);
- Αρχείο τριανταδύο 32-μπιτων καταχωρητών,
με 2 πόρτες ασύγχρονης ανάγνωσης και 1 πόρτα ασύγχρονης εγγραφής.
-
Πόρτες:
- raA
- Είσοδος (5 bits): διεύθυνση ανάγνωσης πρώτης πόρτας.
Ανάγνωση απο τη διεύθυνση 0 δίνει πάντα 0.
- raB
- Είσοδος (5 bits): διεύθυνση ανάγνωσης δεύτερης πόρτας.
Ανάγνωση απο τη διεύθυνση 0 δίνει πάντα 0.
- wa
- Είσοδος (5 bits): διεύθυνση εγγραφής.
Εγγραφή στη διεύθυνση 0 δεν έχει αποτέλεσμα.
- wen
- Είσοδος (1 bit): ενεργοποίηση εγγραφής (write enable).
- wd
- Είσοδος (32 bits): είσοδος δεδομένων προς εγγραφή.
- rdA
- Εξοδος (32 bits): έξοδος δεδομένων ανάγνωσης πρώτης πόρτας.
- rdB
- Εξοδος (32 bits): έξοδος δεδομένων ανάγνωσης δεύτερης πόρτας.
-
Παράδειγμα χρήσης:
- RegFile rf (rs, rt, rWA, regWr, rWD, regA, regB);
Και η Register File, όπως και η μνήμη, είναι ασύγχρονη.
Οι αναγνώσεις γίνονται "συνδυαστικά",
απλώς τοποθετώντας τις διευθύνσεις προς ανάγνωση
και παίρνοντας μετά απο λίγο τα αποτελέσματα.
Η εγγραφή γίνεται όπως και στη μνήμη, με χρήση του wen.
Αναλυτικότερα, το πρωτόκολλο φαίνεται στο εξής σχήμα:
Εγγραφή στο Αρχείο καταχωρητών:
γίνεται με βάση το σήμα wen --γιά κάθε εγγραφή:
- Σηκώνουμε το wen.
- To πολύ σε χρόνο 0.5 ns πρέπει να έχουν σταθεροποιηθεί
η διεύθυνση των δεδομένων που θα γράψουμε (wa)
και τα ίδια τα δεδομένα (wd).
- Για ελάχιστο χρόνο 0.7 ns απο εκεί και πέρα,
τα wen, addr, και din πρέπει να παραμείνουν ως έχουν.
Ανάγνωση από το Αρχείο καταχωρητών:
γίνεται απλώς με τη διεύθυνση του καταχωρητή.
Στο σχήμα φαίνεται ένα παράδειγμα για την πρώτη πόρτα,
αλλά τα ίδια ακριβώς ισχύουν και γιά την δεύτερη.
Όταν αλλάζει η διεύθυνση, μετά από 1.2 ns (το πολύ)
εμφανίζεται στην έξοδο η τιμή του καταχωρητή.
Προσοχή: η έξοδος χαλάει αμέσως μόλις αλλάξει η διεύθυνση.
Εδώ, αντίθετα απο τη μνήμη,
μπορούμε να διαβάζουμε συνεχώς τιμές από μιά πόρτα,
απλώς αλλάζοντας διαδοχικά τη διεύθυνση.
Αναγνώσεις μπορούν να γίνονται και ταυτόχρονα με εγγραφή,
αρκεί να αφορούν διαφορετικό καταχωρητή
--αν διαβάζουμε έναν καταχωρητή την ίδια ώρα που τον γράφουμε
είναι ασαφές πότε εμφανίζονται τα νέα δεδομένα στην έξοδο.
6. NOR32
-
module NOR32 (in32, out);
- Πύλη NOR 32 εισόδων.
Οι είσοδοι έρχονται όλες μαζί, με τη μορφή ενός bus των 32 bits.
-
Πόρτες:
- in32
- Είσοδος (32 bits): τριανταδύο bits εισόδου.
- out
- Εξοδος (1 bit): το λογικό NOR των 32 bits εισόδου.
Η καθυστέρηση της εξόδου, είναι 0.3 ns (το πολύ).
-
Παράδειγμα χρήσης:
- NOR32 zerologic (ALUarith, zero);