How to make your own processor: Memory elements

Πως να φτιάξετε τον δικό σας επεξεργαστή: Στοιχεία μνήμης

· Electronics Ηλεκτρονική · processor επεξεργαστής logic λογική memory μνήμη

IntroductionΕισαγωγή

In our previous articles, we showed how we can use NAND gates to implement addition and subtraction and also comparators and (de-)multiplexers. In this article, we will show how we can create elements that have memory, i.e. elements in which we can store values and retrieve them in a later time. The implementations we present in this page are interactive (you can press buttons and change the inputs).

Στα προηγούμενα άρθρα μας δείξαμε πώς μπορούμε να χρησιμοποιήσουμε NAND πύλες για να υλοποιήσουμε την πρόσθεση και την αφαίρεση καθώς και συγκριτές και (απο-)πολυπλέκτες. Σε αυτό το άρθρο θα δείξουμε πώς μπορούμε να δημιουργήσουμε στοιχεία που έχουν μνήμη, δηλαδή στοιχεία στα οποία μπορούμε να αποθηκεύουμε τιμές και να τις ανακτούμε σε ύστερο χρόνο. Οι υλοποιήσεις που παρουσιάζουμε σε αυτή τη σελίδα είναι διαδραστικές (μπορείτε να πατάτε κουμπιά και να αλλάζετε τις εισόδους).

Bistable circuits (Latches and flip-flops)Δισταθή κυκλώματα (Μανδαλωτές και φλιπ-φλοπ)

Set-Reset (SR) latchΜανδαλωτής τοποθέτησης-επαναφοράς

A set-reset latch is a fundamental digital logic circuit used to store a single bit. It is an asynchronous device, meaning its output changes immediately in response to changes in its inputs, rather than waiting for a clock signal. The SR latch is typically constructed using two logic gates (either NAND or NOR) connected in a feedback loop: The output of one gate is fed back into the input of the other. When S (set) is 1, it sets the output to 1. When R (reset) is 1 it sets the output to 0. When both S and R are 1, the output remains unchanged (i.e. it outputs the previously value).

Ένας μανδαλωτής τοποθέτησης-επαναφοράς (set-reset latch) είναι ένα θεμελιώδες ψηφιακό λογικό κύκλωμα που χρησιμοποιείται για την αποθήκευση ενός μεμονωμένου δυαδικού ψηφίου. Πρόκειται για μια ασύγχρονη διάταξη, πράγμα που σημαίνει ότι η έξοδός της αλλάζει αμέσως ως απόκριση στις αλλαγές των εισόδων της, αντί να αναμένει κάποιο σήμα ρολογιού. Ο μανδαλωτής αυτός κατασκευάζεται τυπικά χρησιμοποιώντας δύο λογικές πύλες (είτε NAND είτε NOR) συνδεδεμένες σε βρόχο ανάδρασης: Η έξοδος της μίας πύλης ανατροφοδοτείται στην είσοδο της άλλης. Όταν το S (set/τοποθέτηση) είναι 1, θέτει την έξοδο στην τιμή 1. Όταν το R (reset/επαναφορά) είναι 1, θέτει την έξοδο στην τιμή 0. Όταν και το S και το R είναι 1, η έξοδος παραμένει αμετάβλητη (δηλαδή, διατηρεί την προηγούμενη της τιμή).

SROutput
00-
010
101
11Previous value
{ "width":300, "height":140, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"NumSrc","id":"dev0", "x":30, "y":30, "label":"S","state":{"direction":0,"on":false}}, {"type":"NumSrc","id":"dev1", "x":30, "y":90, "label":"R","state":{"direction":0,"on":false}}, {"type":"NAND", "id":"dev2", "x":130, "y":20, "label":"NAND"}, {"type":"NAND", "id":"dev3", "x":130, "y":80, "label":"NAND"}, {"type":"NumDsp","id":"dev4", "x":250, "y":50, "label":"Output","state":{"direction":2}}], "connectors":[{"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev3.out0","to":"dev2.in1"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}]}

Data (D) latchΜανδαλωτής δεδομένων

A data latch is a digital logic circuit that can store a single bit output. The difference from the previous SR latch is that it has separate inputs for the selector (S) and the data (D), and the data is stored only when the selector is active. Practically, it is equivalent to a multiplexer (data selector) that has its output connected as feedback to one of its inputs.

Ένας μανδαλωτής δεδομένων (data latch) είναι ψηφιακό λογικό κύκλωμα που μπορεί να αποθηκεύσει την τιμή ενός δυαδικού ψηφίου στην έξοδο του. Η διαφορά από τον προηγούμενο μανδαλωτή SR είναι ότι διαθέτει ξεχωριστές εισόδους για τον επιλογέα (S) και τα δεδομένα (D), και τα δεδομένα αποθηκεύονται μόνο όταν ο επιλογέας είναι ενεργός. Πρακτικά, είναι ισοδύναμος με έναν πολυπλέκτη (επιλογέα δεδομένων) που έχει την έξοδό του συνδεδεμένη ως ανατραφοδότηση σε μια από τις εισόδους του.

SDOutput
00Previous value
01Previous value
100
111
{ "width":275, "height":135, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dc", "x":20, "y":20, "label":"DC"}, {"type":"MUX", "id":"mux","x":130,"y":40, "label":"MUX"}, {"type":"Toggle","id":"sel","x":70, "y":20, "label":"Selector","state":{"on":false}}, {"type":"NumSrc","id":"d", "x":30, "y":90, "label":"D","state":{"direction":0,"on":true}}, {"type":"NumDsp","id":"out","x":230,"y":56, "label":"Output","state":{"direction":2}}], "connectors":[{"from":"dc.out0","to":"sel.in0"}, {"from":"sel.out0","to":"mux.in0"}, {"from":"mux.out0","to":"mux.in1"}, {"from":"mux.out0","to":"out.in0"}, {"from":"d.out0","to":"mux.in2"}]}
{ "width":275, "height":135, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dev0","x":20,"y":20, "label":"DC"}, {"type":"Toggle","id":"dev1","x":70,"y":20, "label":"Selector","state":{"on":false}}, {"type":"NumSrc","id":"dev3","x":30,"y":90,"label":"D","state":{"direction":0,"on":true}}, {"type":"NAND", "id":"dev4","x":120,"y":20,"label":"NAND"}, {"type":"NAND", "id":"dev5","x":170,"y":20,"label":"NAND"}, {"type":"NAND", "id":"dev6","x":170,"y":75,"label":"NAND"}, {"type":"NAND", "id":"dev7","x":120,"y":75,"label":"NAND"}, {"type":"NumDsp","id":"dev8","x":230,"y":83,"label":"Output","state":{"direction":2}}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev1.out0","to":"dev4.in1"}, {"from":"dev4.out0","to":"dev5.in0"}, {"from":"dev6.out0","to":"dev5.in1"}, {"from":"dev5.out0","to":"dev6.in0"}, {"from":"dev6.out0","to":"dev8.in0"}, {"from":"dev1.out0","to":"dev7.in0"}, {"from":"dev3.out0","to":"dev7.in1"}, {"from":"dev7.out0","to":"dev6.in1"}]}

Data (D) flip-flopΦλιπ-φλοπ δεδομένων

The data flip-flop (or D flip-flop) is a fundamental sequential logic circuit that serves as a one-bit memory cell in digital electronics. It has a selector (S) input, a single data input (D) and a clock (CLK) input. Its primary function is to store the value present at the D input when the selector is active, but only at a specific moment, either the rising or the falling edge of the CLK signal. If S is 1 when CLK changes to 1, the current value of D is stored. The stored value is not yet at the output. When CLK changes to 0 again, then the previously stored value is reflected at the output and held constant, regardless of any subsequent changes to the D input. This synchronous, edge-triggered behavior makes D flip-flops essential building blocks for data storage elements like registers in computer hardware.

Το φλιπ-φλοπ δεδομένων (data flip-flop) είναι ένα θεμελιώδες κύκλωμα διαδοχικής λογικής που λειτουργεί ως κύτταρο μνήμης ενός δυαδικού ψηφίου στα ψηφιακά ηλεκτρονικά. Έχει μια είσοδο επιλογέα (S), μία μοναδική είσοδο δεδομένων (D) και μία είσοδο ρολογιού (CLK). Η κύρια λειτουργία του είναι να αποθηκεύει την τιμή που υπάρχει στην είσοδο D, αλλά μόνο σε μια συγκεκριμένη χρονική στιγμή, είτε στην ανερχόμενη είτε στην κατερχόμενη ακμή του σήματος CLK. Αν S = 1 όταν το CLK αλλάζει στο 1, η τρέχουσα τιμή του D αποθηκεύεται. Η αποθηκευμένη τιμή δεν εμφανίζεται ακόμη στην έξοδο. Όταν το CLK αλλάζει σε 0 ξανά, τότε αυτή η αποθηκευμένη τιμή αντικατοπτρίζεται στην έξοδο και διατηρείται σταθερή, ανεξάρτητα από τυχόν μεταγενέστερες αλλαγές στην είσοδο D. Αυτή η σύγχρονη, ενεργοποιούμενη από ακμή (edge-triggered) συμπεριφορά καθιστά τα D φλιπ-φλοπ απαραίτητα δομικά στοιχεία για στοιχεία αποθήκευσης δεδομένων όπως οι καταχωρητές (registers) στο υλικό των υπολογιστών.

SDOutput
00Previous value
01Previous value
100
111
{ "width":310, "height":250, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dc","x":20,"y":20, "label":"DC"}, {"type":"Toggle", "id":"sel","x":70,"y":20, "label":"Selector","state":{"on":true}}, {"type":"NumSrc", "id":"d","x":28,"y":80, "label":"D","state":{"direction":0,"on":false}}, {"type":"OSC", "id":"clk","x":20,"y":120,"label":"Clock","freq":0.25}, {"type":"AND", "id":"and","x":120,"y":20,"label":"AND","color":"green","bgColor":"cyan"}, {"type":"NOT", "id":"not","x":120,"y":120,"label":"NOT","color":"red","bgColor":"yellow"}, {"type":"DLATCH","id":"dlatch1","x":170,"y":20, "label":"D-Latch"}, {"type":"DLATCH","id":"dlatch2","x":170,"y":120,"label":"D-Latch"}, {"type":"NumDsp", "id":"stored","x":260,"y":28,"label":"Stored","state":{"direction":2}}, {"type":"NumDsp", "id":"output","x":260,"y":128,"label":"Output","state":{"direction":2}}, {"type":"DSO", "id":"dso","x":30,"y":180,"label":"DSO", "numInputs":1}], "connectors":[{"from":"dc.out0","to":"sel.in0"}, {"from":"sel.out0","to":"and.in0"}, {"from":"clk.out0","to":"and.in1"}, {"from":"clk.out0","to":"dso.in0"}, {"from":"clk.out0","to":"not.in0"}, {"from":"and.out0","to":"dlatch1.in0"}, {"from":"not.out0","to":"dlatch2.in0"}, {"from":"d.out0","to":"dlatch1.in1"}, {"from":"dlatch1.out0","to":"stored.in0"}, {"from":"dlatch1.out0","to":"dlatch2.in1"}, {"from":"dlatch2.out0","to":"output.in0"}]}
{ "width":370, "height":290, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dev0","x":20,"y":20, "label":"DC"}, {"type":"Toggle","id":"dev1","x":70,"y":20, "label":"Selector","state":{"on":true}}, {"type":"OSC", "id":"dev2","x":20,"y":140,"label":"Clock","freq":0.25}, {"type":"NumSrc","id":"dev3","x":28,"y":87, "label":"D","state":{"direction":0,"on":false}}, {"type":"NAND", "id":"dev4","x":220,"y":20,"label":"NAND"}, {"type":"NAND", "id":"dev5","x":270,"y":20,"label":"NAND"}, {"type":"NAND", "id":"dev6","x":270,"y":70,"label":"NAND"}, {"type":"NAND", "id":"dev7","x":220,"y":70,"label":"NAND"}, {"type":"NumDsp","id":"dev8","x":330,"y":178,"label":"Output","state":{"direction":2}}, {"type":"NAND", "id":"dev9","x":120,"y":20,"label":"NAND","color":"green","bgColor":"cyan"}, {"type":"NAND", "id":"dev10","x":170,"y":20,"label":"NAND","color":"green","bgColor":"cyan"}, {"type":"NAND", "id":"dev11","x":170,"y":140,"label":"NAND","color":"red","bgColor":"yellow"}, {"type":"NAND", "id":"dev12","x":220,"y":120,"label":"NAND"}, {"type":"NAND", "id":"dev13","x":270,"y":120,"label":"NAND"}, {"type":"NAND", "id":"dev14","x":270,"y":170,"label":"NAND"}, {"type":"NAND", "id":"dev15","x":220,"y":170,"label":"NAND"}, {"type":"NumDsp","id":"Stored","x":330,"y":78,"label":"Stored","state":{"direction":2}}, {"type":"DSO", "id":"DSO","x":45,"y":220,"label":"DSO", "numInputs":1}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev1.out0","to":"dev9.in0"}, {"from":"dev2.out0","to":"dev9.in1"}, {"from":"dev10.out0","to":"dev4.in0"}, {"from":"dev10.out0","to":"dev4.in1"}, {"from":"dev4.out0","to":"dev5.in0"}, {"from":"dev5.out0","to":"dev6.in0"}, {"from":"dev14.out0","to":"dev8.in0"}, {"from":"dev6.out0","to":"dev5.in1"}, {"from":"dev10.out0","to":"dev7.in0"}, {"from":"dev3.out0","to":"dev7.in1"}, {"from":"dev7.out0","to":"dev6.in1"}, {"from":"dev9.out0","to":"dev10.in0"}, {"from":"dev9.out0","to":"dev10.in1"}, {"from":"dev13.out0","to":"dev14.in0"}, {"from":"dev14.out0","to":"dev13.in1"}, {"from":"dev12.out0","to":"dev13.in0"}, {"from":"dev15.out0","to":"dev14.in1"}, {"from":"dev6.out0","to":"dev15.in1"}, {"from":"dev11.out0","to":"dev12.in0"}, {"from":"dev11.out0","to":"dev12.in1"}, {"from":"dev11.out0","to":"dev15.in0"}, {"from":"dev2.out0","to":"dev11.in0"}, {"from":"dev2.out0","to":"dev11.in1"}, {"from":"dev2.out0","to":"DSO.in0"}, {"from":"dev6.out0","to":"Stored.in0"}]}

Memory elementsΣτοιχεία μνήμης

RegisterΚαταχωρητής

A register is a fundamental memory element in digital electronics and computer architecture, serving as a very fast, temporary storage element directly integrated within a digital circuit. Architecturally, a register is essentially a collection of flip-flops or latches, typically arranged to hold an n-bit binary word. Its primary function is to store data, instructions, or control information that the associated digital circuitry needs to access immediately for ongoing operations like arithmetic, logic, or control flow.

Ένας καταχωρητής (register) είναι ένα θεμελιώδες στοιχείο μνήμης στην ψηφιακή ηλεκτρονική και την αρχιτεκτονική υπολογιστών, χρησιμεύοντας ως ένα πολύ γρήγορο, προσωρινό στοιχείο αποθήκευσης που είναι άμεσα ενσωματωμένο σε ένα ψηφιακό κύκλωμα. Αρχιτεκτονικά, ένας καταχωρητής είναι ουσιαστικά μια συλλογή από φλιπ-φλοπ ή μανδαλωτές, συνήθως διατεταγμένα για να συγκρατούν μια δυαδική λέξη n-bit. Η κύρια λειτουργία του είναι να αποθηκεύει δεδομένα, εντολές ή πληροφορίες ελέγχου στις οποίες το σχετικό ψηφιακό κύκλωμα πρέπει να έχει άμεση πρόσβαση για συνεχιζόμενες λειτουργίες, όπως αριθμητικές, λογικές ή ροής ελέγχου.

{ "width":310, "height":310, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dc","x":20,"y":20, "label":"DC"}, {"type":"Toggle", "id":"sel","x":70,"y":20, "label":"Selector","state":{"on":true}}, {"type":"NumSrc", "id":"d0","x":28,"y":82, "label":"D0","state":{"direction":0,"on":true}}, {"type":"NumSrc", "id":"d1","x":28,"y":100, "label":"D1","state":{"direction":0,"on":false}}, {"type":"NumSrc", "id":"d2","x":28,"y":118, "label":"D2","state":{"direction":0,"on":false}}, {"type":"NumSrc", "id":"d3","x":28,"y":136, "label":"D","state":{"direction":0,"on":false}}, {"type":"OSC", "id":"clk","x":20,"y":180,"label":"Clock","freq":0.25}, {"type":"DFF", "id":"dff0","x":150,"y":20, "label":"DFF0"}, {"type":"DFF", "id":"dff1","x":150,"y":70,"label":"DFF1"}, {"type":"DFF", "id":"dff2","x":150,"y":120,"label":"DFF2"}, {"type":"DFF", "id":"dff3","x":150,"y":170,"label":"D-FF"}, {"type":"NumDsp", "id":"out0","x":265,"y":82,"label":"O0","state":{"direction":2}}, {"type":"NumDsp", "id":"out1","x":265,"y":100,"label":"O1","state":{"direction":2}}, {"type":"NumDsp", "id":"out2","x":265,"y":118,"label":"O2","state":{"direction":2}}, {"type":"NumDsp", "id":"out3","x":265,"y":136,"label":"Out","state":{"direction":2}}, {"type":"DSO", "id":"dso","x":30,"y":240,"label":"DSO", "numInputs":1}], "connectors":[ {"from":"dc.out0","to":"sel.in0"}, {"from":"sel.out0","to":"dff0.in0"}, {"from":"sel.out0","to":"dff1.in0"}, {"from":"sel.out0","to":"dff2.in0"}, {"from":"sel.out0","to":"dff3.in0"}, {"from":"d0.out0","to":"dff0.in1"}, {"from":"d1.out0","to":"dff1.in1"}, {"from":"d2.out0","to":"dff2.in1"}, {"from":"d3.out0","to":"dff3.in1"}, {"from":"clk.out0","to":"dff0.in2"}, {"from":"clk.out0","to":"dff1.in2"}, {"from":"clk.out0","to":"dff2.in2"}, {"from":"clk.out0","to":"dff3.in2"}, {"from":"clk.out0","to":"dso.in0"}, {"from":"dff0.out0","to":"out0.in0"}, {"from":"dff1.out0","to":"out1.in0"}, {"from":"dff2.out0","to":"out2.in0"}, {"from":"dff3.out0","to":"out3.in0"}]}

CounterΜετρητής

Now that we have a way to store information, we can combine this capability with the addition we learned about in the first part and construct a counter circuit! We take the output of a register, add a value to it (e.g. 1), and store the result back into the same register:"

Τώρα που διαθέτουμε έναν τρόπο να αποθηκεύουμε πληροφορία, μπορούμε να συνδυάσουμε αυτή τη δυνατότητα με την πρόσθεση που μάθαμε στο πρώτο μέρος και να κατασκευάσουμε ένα κύκλωμα μετρητή! Παίρνουμε την έξοδο ενός καταχωρητή, της προσθέτουμε μια τιμη (λ.χ. 1) και αποθηκεύουμε το αποτέλεσμα πίσω στον ίδιο καταχωρητή:

{ "width":370, "height":310, "editable": false, "showToolbox":false, "toolbox":[], "devices":[ {"type":"DC", "id":"dc","x":20,"y":20, "label":"DC"}, {"type":"Toggle", "id":"sel","x":80,"y":20, "label":"Selector","state":{"on":true}}, {"type":"NumSrc", "id":"d0","x":28,"y":82, "label":"D0","state":{"direction":0,"on":true}}, {"type":"NumSrc", "id":"d1","x":28,"y":100, "label":"D1","state":{"direction":0,"on":false}}, {"type":"NumSrc", "id":"d2","x":28,"y":118, "label":"D2","state":{"direction":0,"on":false}}, {"type":"NumSrc", "id":"d3","x":28,"y":136, "label":"Step","state":{"direction":0,"on":false}}, {"type":"OSC", "id":"clk","x":20,"y":180,"label":"Clock","freq":0.5}, {"type":"4bitReg","id":"reg","x":150,"y":20, "label":"Register"}, {"type":"4bit7seg","id":"seg","x":290,"y":20,"label":"Output"}, {"type":"4bitAdder","id":"add","x":290,"y":110,"label":"4bitAdder"}, {"type":"DSO", "id":"dso","x":20,"y":240,"label":"DSO", "numInputs":1}], "connectors":[{"from":"dc.out0","to":"sel.in0"}, {"from":"sel.out0","to":"reg.in0"}, {"from":"d0.out0","to":"add.in5"}, {"from":"d1.out0","to":"add.in6"}, {"from":"d2.out0","to":"add.in7"}, {"from":"d3.out0","to":"add.in8"}, {"from":"clk.out0","to":"reg.in5"}, {"from":"clk.out0","to":"dso.in0"}, {"from":"reg.out0","to":"add.in1"}, {"from":"reg.out1","to":"add.in2"}, {"from":"reg.out2","to":"add.in3"}, {"from":"reg.out3","to":"add.in4"}, {"from":"reg.out0","to":"seg.in0"}, {"from":"reg.out1","to":"seg.in1"}, {"from":"reg.out2","to":"seg.in2"}, {"from":"reg.out3","to":"seg.in3"}, {"from":"add.out0","to":"reg.in1"}, {"from":"add.out1","to":"reg.in2"}, {"from":"add.out2","to":"reg.in3"}, {"from":"add.out3","to":"reg.in4"} ]}

See also...

Δείτε επίσης...