How to make your own processor: Logic gates and addition

Πως να φτιάξετε τον δικό σας επεξεργαστή: Λογικές πύλες και πρόσθεση

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

IntroductionΕισαγωγή

Ever wondered what truly powers the computer sitting in front of you? It's not magic, it's logic. Logic built from billions of tiny electronic switches. In this series of articles, we'll show how we can create a functional processor from the ground up, starting with the simplest elements: humble NAND gates. These gates (and NOR also) are universal gates. This means that any other logical operation and every complex circuit required for arithmetic or memory operations can be created using logical NAND gates only.

Αναρωτηθήκατε ποτέ πώς πραγματικά δουλεύει ένας υπολογιστής; Δεν είναι μαγεία, είναι λογική. Λογική χτισμένη από δισεκατομμύρια μικροσκοπικούς ηλεκτρονικούς διακόπτες. Σε αυτή τη σειρά άρθρων, θα δείξουμε πως μπορούμε να δημιουργήσουμε έναν λειτουργικό επεξεργαστή από το μηδέν, ξεκινώντας από τα πιο απλά στοιχεία: ταπεινές πύλες NAND. Αυτές οι πύλες (όπως και οι NOR) είναι καθολικές πύλες. Αυτό σημαίνει ότι κάθε άλλη λογική πράξη και κάθε σύνθετο κύκλωμα που απαιτείται για αριθμητικές ή μνημονικές λειτουργίες μπορεί να δημιουργηθεί χρησιμοποιώντας μόνο λογικές πύλες NAND.

This theoretical simplicity of the universal NAND gate translates into highly practical real-world implementations, making it the most common and essential building block in digital electronics. In its most basic form, before modern microchips, a NAND gate could be constructed using simple electromechanical relays. However, the dominant implementation today uses semiconductors (transistors). This highly efficient, low-power, design is the foundation of virtually all modern integrated circuits, from simple chips to complex processor cores.

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

Logic gatesΛογικές πύλες

Let's see first how we can implement other logical gates usign only NAND gates. For each gate, we present its truth table and interactive implementations. You can press the input buttons to toggle their status.

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

NAND

Input AInput BOutput
001
011
011
110
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":100,"y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":100,"y":80,"label":"B","state":{"on":false}}, {"type":"NAND", "id":"dev3","x":180,"y":50,"label":"NAND", "color":"#4B0082", "bgColor":"white"}, {"type":"LED", "id":"dev4","x":250,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}] }

NOT

InputOutput
01
10
{ "width":300, "height":100, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":30,"label":"DC"}, {"type":"Toggle","id":"dev1","x":100,"y":30,"label":"Input","state":{"on":false}}, {"type":"NOT", "id":"dev2","x":180,"y":30,"label":"NOT","color":"red", "bgColor":"yellow"}, {"type":"LED", "id":"dev3","x":250,"y":30,"label":"Output"} ], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev1.out0","to":"dev2.in0"}, {"from":"dev2.out0","to":"dev3.in0"} ] }
{ "width":300, "height":100, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":30,"label":"DC"}, {"type":"Toggle","id":"dev1","x":100,"y":30,"label":"Input","state":{"on":false}}, {"type":"NAND", "id":"dev2","x":180,"y":30,"label":"NAND","color":"red", "bgColor":"yellow"}, {"type":"LED", "id":"dev3","x":250,"y":30,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev1.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev2.in1"}, {"from":"dev2.out0","to":"dev3.in0"}] }

AND

Input AInput BOutput
000
010
010
111
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":80, "y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":80, "y":80,"label":"B","state":{"on":false}}, {"type":"AND", "id":"dev3","x":170,"y":50,"label":"AND","color":"green","bgColor":"cyan"}, {"type":"LED", "id":"dev4","x":250,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}]}
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":80, "y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":80, "y":80,"label":"B","state":{"on":false}}, {"type":"NAND", "id":"dev3","x":140,"y":50,"label":"NAND","color":"green","bgColor":"cyan"}, {"type":"NAND", "id":"dev4","x":200,"y":50,"label":"NAND","color":"green","bgColor":"cyan"}, {"type":"LED", "id":"dev5","x":250,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}, {"from":"dev3.out0","to":"dev4.in1"}, {"from":"dev4.out0","to":"dev5.in0"}]}

OR

Input AInput BOutput
000
011
011
111
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":80 ,"y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":80 ,"y":80,"label":"B","state":{"on":false}}, {"type":"OR", "id":"dev3","x":170,"y":50,"label":"OR","color":"blue","bgColor":"gold"}, {"type":"LED", "id":"dev4","x":250,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}]}
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":20, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":80, "y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":80, "y":80,"label":"B","state":{"on":false}}, {"type":"NAND", "id":"dev3","x":140,"y":20,"label":"NAND","color":"blue","bgColor":"gold"}, {"type":"NAND", "id":"dev4","x":140,"y":80,"label":"NAND","color":"blue","bgColor":"gold"}, {"type":"NAND", "id":"dev5","x":200,"y":50,"label":"NAND","color":"blue","bgColor":"gold"}, {"type":"LED", "id":"dev6","x":250,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev1.out0","to":"dev3.in1"}, {"from":"dev2.out0","to":"dev4.in0"}, {"from":"dev2.out0","to":"dev4.in1"}, {"from":"dev3.out0","to":"dev5.in0"}, {"from":"dev4.out0","to":"dev5.in1"}, {"from":"dev5.out0","to":"dev6.in0"}]}

XOR

Input AInput BOutput
000
011
011
110
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":10, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":60, "y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":60, "y":80,"label":"B","state":{"on":false}}, {"type":"XOR", "id":"dev3","x":160,"y":50,"label":"XOR","color":"black","bgColor":"lightsalmon"}, {"type":"LED", "id":"dev4","x":260,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in0"}]}
{ "width":300, "height":140, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":10, "y":50,"label":"DC"}, {"type":"Toggle","id":"dev1","x":60, "y":20,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":60, "y":80,"label":"B","state":{"on":false}}, {"type":"NAND", "id":"dev3","x":110,"y":50,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev4","x":160,"y":20,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev5","x":160,"y":80,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev6","x":210,"y":50,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"LED", "id":"dev7","x":260,"y":50,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev5.in1"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in1"}, {"from":"dev3.out0","to":"dev5.in0"}, {"from":"dev4.out0","to":"dev6.in0"}, {"from":"dev5.out0","to":"dev6.in1"}, {"from":"dev6.out0","to":"dev7.in0"}]}

AdditionΠρόσθεση

Binary adders are the essential digital circuits that enable computers to perform arithmetic.

Οι δυαδικοί αθροιστές (binary adders) είναι τα απαραίτητα ψηφιακά κυκλώματα που επιτρέπουν στους υπολογιστές να εκτελούν αριθμητικές πράξεις.

Half AdderΗμιαθροιστής

The simplest binary adder is the Half Adder (HA), which adds two single-bit inputs (A and B). However, it lacks the ability to receive a carry from a previous stage.

Ο απλούστερος δυαδικός αθροιστής είναι ο Ημιαθροιστής (Half Adder, HA), ο οποίος προσθέτει δύο μονοψήφιες δυαδικές εισόδους (A και B). Ωστόσο, του λείπει η ικανότητα να δέχεται κρατούμενο από προηγούμενο στάδιο.

Input AInput BOutput
0000
0101
1001
1110
{ "width":300, "height":120, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":10, "y":40,"label":"DC"}, {"type":"Toggle","id":"dev1","x":55, "y":15,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":55, "y":65,"label":"B","state":{"on":false}}, {"type":"XOR", "id":"dev3","x":150,"y":15,"label":"XOR","color":"black","bgColor":"lightsalmon"}, {"type":"AND", "id":"dev4","x":150,"y":65,"label":"AND","color":"green","bgColor":"cyan"}, {"type":"LED", "id":"dev5","x":250,"y":15,"label":"Output 0"}, {"type":"LED", "id":"dev6","x":250,"y":65,"label":"Output 1"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev2.out0","to":"dev4.in1"}, {"from":"dev3.out0","to":"dev5.in0"}, {"from":"dev4.out0","to":"dev6.in0"}]}
{ "width":300, "height":170, "editable": false, "showToolbox":false, "devices":[ {"type":"DC", "id":"dev0","x":10, "y":40,"label":"DC"}, {"type":"Toggle","id":"dev1","x":55, "y":15,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":55, "y":65,"label":"B","state":{"on":false}}, {"type":"NAND", "id":"dev3","x":100,"y":40,"label":"NAND","color":"#005000","bgColor":"violet"}, {"type":"NAND", "id":"dev4","x":150,"y":15,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev5","x":150,"y":65,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev6","x":200,"y":40,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev7","x":150,"y":115,"label":"NAND","color":"green","bgColor":"cyan"}, {"type":"LED", "id":"dev8","x":250,"y":40, "label":"Output 0"}, {"type":"LED", "id":"dev9","x":250,"y":115,"label":"Output 1"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev1.out0","to":"dev3.in0"}, {"from":"dev2.out0","to":"dev5.in1"}, {"from":"dev2.out0","to":"dev3.in1"}, {"from":"dev3.out0","to":"dev4.in1"}, {"from":"dev3.out0","to":"dev5.in0"}, {"from":"dev3.out0","to":"dev7.in0"}, {"from":"dev3.out0","to":"dev7.in1"}, {"from":"dev4.out0","to":"dev6.in0"}, {"from":"dev5.out0","to":"dev6.in1"}, {"from":"dev6.out0","to":"dev8.in0"}, {"from":"dev7.out0","to":"dev9.in0"}]}

Full AdderΠλήρης Αθροιστής

The limitation of half adders to receive a carry is solved by the Full Adder (FA), which adds three inputs (A, B, and a carry C), making it the fundamental building block for adding larger numbers.

H αδυναμία των ημιαθροιστών να δέχονται κρατούμενο λύνεται από τον Πλήρη Αθροιστή (Full Adder - FA), ο οποίος προσθέτει τρεις εισόδους (A, B, και κρατούμενο C), καθιστώντας τον το θεμελιώδες δομικό στοιχείο για την πρόσθεση μεγαλύτερων αριθμών.

Input AInput BInput COutput
00000
00101
01001
01110
10001
10110
11010
11111
{ "width":300, "height":170, "editable": false, "showToolbox":false, "devices":[ {"type":"DC","id":"dev0","x":10,"y":65,"label":"DC"}, {"type":"Toggle","id":"dev1","x":60,"y":15,"label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2","x":60,"y":65,"label":"B","state":{"on":false}}, {"type":"Toggle","id":"dev3","x":60,"y":115,"label":"C","state":{"on":false}}, {"type":"HalfAdder","id":"dev4","x":115,"y":40,"label":"HalfAdder"}, {"type":"HalfAdder","id":"dev5","x":115,"y":100,"label":"HalfAdder"}, {"type":"OR","id":"dev7","x":200,"y":100,"label":"OR","color":"blue","bgColor":"gold"}, {"type":"LED","id":"dev8","x":250,"y":40,"label":"Output 0"}, {"type":"LED","id":"dev9","x":250,"y":100,"label":"Output 1"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev0.out0","to":"dev3.in0"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev2.out0","to":"dev4.in1"}, {"from":"dev3.out0","to":"dev5.in1"}, {"from":"dev4.out0","to":"dev5.in0"}, {"from":"dev4.out1","to":"dev7.in0"}, {"from":"dev5.out0","to":"dev8.in0"}, {"from":"dev5.out1","to":"dev7.in1"}, {"from":"dev7.out0","to":"dev9.in0"} ]}
{ "width":300, "height":220, "editable": false, "showToolbox":false, "devices":[ {"type":"DC","id":"dev0","x":10,"y":90,"label":"DC"}, {"type":"Toggle","id":"dev1" ,"x":55,"y":30, "label":"A","state":{"on":false}}, {"type":"Toggle","id":"dev2" ,"x":55,"y":90, "label":"B","state":{"on":false}}, {"type":"Toggle","id":"dev3" ,"x":55,"y":150,"label":"C","state":{"on":false}}, {"type":"NAND", "id":"dev4" ,"x":105,"y":50,"label":"NAND","color":"#005000","bgColor":"violet"}, {"type":"NAND", "id":"dev5" ,"x":155,"y":10,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev6" ,"x":155,"y":60,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev7" ,"x":205,"y":35,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev8" ,"x":105,"y":130,"label":"NAND","color":"#005000","bgColor":"violet"}, {"type":"NAND", "id":"dev9" ,"x":155,"y":120,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev10","x":155,"y":170,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev11","x":205,"y":145,"label":"NAND","color":"black","bgColor":"lightsalmon"}, {"type":"NAND", "id":"dev12","x":205,"y":90, "label":"NAND","color":"#005000","bgColor":"GreenYellow"}, {"type":"LED", "id":"dev13","x":255,"y":60, "label":"Output 0"}, {"type":"LED", "id":"dev14","x":255,"y":120,"label":"Output 1"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev0.out0","to":"dev3.in0"}, {"from":"dev1.out0","to":"dev4.in0"}, {"from":"dev2.out0","to":"dev4.in1"}, {"from":"dev1.out0","to":"dev5.in0"}, {"from":"dev4.out0","to":"dev5.in1"}, {"from":"dev4.out0","to":"dev6.in0"}, {"from":"dev2.out0","to":"dev6.in1"}, {"from":"dev5.out0","to":"dev7.in0"}, {"from":"dev6.out0","to":"dev7.in1"}, {"from":"dev7.out0","to":"dev8.in0"}, {"from":"dev3.out0","to":"dev8.in1"}, {"from":"dev7.out0","to":"dev9.in0"}, {"from":"dev3.out0","to":"dev10.in1"}, {"from":"dev8.out0","to":"dev9.in1"}, {"from":"dev8.out0","to":"dev10.in0"}, {"from":"dev9.out0","to":"dev11.in0"}, {"from":"dev10.out0","to":"dev11.in1"}, {"from":"dev4.out0","to":"dev12.in0"}, {"from":"dev8.out0","to":"dev12.in1"}, {"from":"dev11.out0","to":"dev13.in0"}, {"from":"dev12.out0","to":"dev14.in0"}]}

Multi-bit AdderΠολυψήφιος Αθροιστής

By cascading multiple Full Adders, we can create a Multi-bit Adder, capable of performing addition on multi-bit binary words, a functionality that is essential for any modern processor.

Με τη διαδοχική σύνδεση πολλαπλών Πλήρων Αθροιστών μπορούμε να δημιουργήσουμε έναν Πολυψήφιο Αθροιστή (Multi-bit Adder), ικανό να εκτελεί πρόσθεση σε πολυψήφιες δυαδικές λέξεις, μια απαραίτητη λειτουργία για κάθε σύγχρονο επεξεργαστή.

Input A1A0Input B1B0Input COutput
00000000
00010001
00100010
00110011
01010010
01100011
01110100
10100100
10110101
11110110
11111111
{ "width":350, "height":280, "editable": false, "showToolbox":false, "devices":[ {"type":"DC","id":"dev0","x":15,"y":120,"label":"DC"}, {"type":"Toggle", "id":"dev1", "x":70,"y":10, "label":"A0","state":{"on":false}}, {"type":"Toggle", "id":"dev2", "x":70,"y":60, "label":"A1","state":{"on":false}}, {"type":"Toggle", "id":"dev3", "x":70,"y":120, "label":"B0","state":{"on":false}}, {"type":"Toggle", "id":"dev4", "x":70,"y":170, "label":"B1","state":{"on":false}}, {"type":"Toggle", "id":"dev5", "x":70,"y":230, "label":"C", "state":{"on":false}}, {"type":"FullAdder","id":"dev6", "x":130,"y":60, "label":"FullAdder"}, {"type":"FullAdder","id":"dev7", "x":130,"y":150,"label":"FullAdder"}, {"type":"LED", "id":"dev8", "x":220,"y":60, "label":"Output 0"}, {"type":"LED", "id":"dev9", "x":220,"y":115,"label":"Output 1"}, {"type":"LED", "id":"dev10","x":220,"y":170,"label":"Output 2"}, {"type":"4bit7seg", "id":"dev11","x":270,"y":100,"label":"Output"}], "connectors":[ {"from":"dev0.out0","to":"dev1.in0"}, {"from":"dev0.out0","to":"dev2.in0"}, {"from":"dev0.out0","to":"dev3.in0"}, {"from":"dev0.out0","to":"dev4.in0"}, {"from":"dev0.out0","to":"dev5.in0"}, {"from":"dev5.out0","to":"dev6.in0"}, {"from":"dev1.out0","to":"dev6.in1"}, {"from":"dev3.out0","to":"dev6.in2"}, {"from":"dev2.out0","to":"dev7.in1"}, {"from":"dev4.out0","to":"dev7.in2"}, {"from":"dev6.out1","to":"dev7.in0"}, {"from":"dev6.out0","to":"dev8.in0"}, {"from":"dev7.out0","to":"dev9.in0"}, {"from":"dev7.out1","to":"dev10.in0"}, {"from":"dev6.out0","to":"dev11.in0"}, {"from":"dev7.out0","to":"dev11.in1"}, {"from":"dev7.out1","to":"dev11.in2"} ]}

SubtractionΑφαίρεση

Representing negative numbers is a fundamental challenge in computer architecture because digital hardware only understands states of 0 and 1. While there have been several approaches historically, one method has emerged as the nearly universal industry standard for integer arithmetic: Τwo's complement. This method greatly simplifies the hardware design. In two's complement, positive numbers always start with 0 whereas negative numbers always start with 1. To get the negative of a number, we simply invert all the bits (i.e. flip 0s to 1s and 1s to 0s) and then we add 1 to the total number. This allows the processor to use the exact same circuitry for both addition and subtraction, regardless of whether the numbers are positive or negative. It also eliminates the «negative zero» issue that is present in other systems (i.e. having both +0 and -0). Therefore, to subtract, we just negate the second number and we add it (ignoring the final carry bit in case of overflow). For example, if we add +3 (11) and -3 (01) in binary, the result is 00. The math works naturally without extra logic circuits for signs.

Η αναπαράσταση αρνητικών αριθμών αποτελεί μια θεμελιώδη πρόκληση στην αρχιτεκτονική υπολογιστών, επειδή το ψηφιακό υλικό κατανοεί μόνο καταστάσεις 0 και 1. Ενώ ιστορικά έχουν υπάρξει διάφορες προσεγγίσεις, μία μέθοδος έχει αναδειχθεί πρακτικά ως το (σχεδόν) καθολικό βιομηχανικό πρότυπο για την αριθμητική ακεραίων: το συμπλήρωμα ως προς 2 (Two's complement). Αυτή η μέθοδος απλοποιεί εξαιρετικά τον σχεδιασμό του υλικού. Στο συμπλήρωμα ως προς 2, οι θετικοί αριθμοί ξεκινούν πάντα με 0, ενώ οι αρνητικοί αριθμοί ξεκινούν πάντα με 1. Για να πάρουμε τον αρνητικό ενός αριθμού, απλώς αντιστρέφουμε όλα του τα δυαδικά ψηφία (αλλάζουμε δηλαδή τα 0 σε 1 και τα 1 σε 0) και κατόπιν προσθέτουμε στο συνολικό αποτέλεσμα 1. Αυτό επιτρέπει στον επεξεργαστή να χρησιμοποιεί ακριβώς τα ίδια κυκλώματα τόσο για την πρόσθεση όσο και για την αφαίρεση, ανεξάρτητα από το αν οι αριθμοί είναι θετικοί ή αρνητικοί. Επίσης, εξαλείφει το πρόβλημα του «αρνητικού μηδενός» που παρουσιάζεται σε άλλα συστήματα (δηλαδή την ύπαρξη τόσο του +0 όσο και του -0). Έτσι λοιπόν, για να πραγματοποιήσουμε αφαίρεση, απλώς παίρνουμε την αρνητική τιμή του δεύτερου αριθμού και την προσθέτουμε (αγνοώντας το τελικό κρατούμενο σε περίπτωση υπερχείλισης). Παράδειγμα: Αν προσθέσουμε το +3 (11) και το -3 (01), το αποτέλεσμα είναι 00. Τα μαθηματικά λειτουργούν φυσικά, χωρίς την ανάγκη για επιπλέον λογικά κυκλώματα διαχείρισης προσήμων.

Input A1A0Input B1B0Output
000000
000111
001010
001101
010001
010100
011011
011110
100010
100101
101000
101111
110011
110110
111001
111100
{ "width":300, "height":220, "editable": false, "showToolbox":false, "devices":[ {"type":"DC","id":"dev0","x":22,"y":20,"label":"C","state":{"direction":2}}, {"type":"NumSrc","id":"dev1","x":30,"y":80, "label":"A0","state":{"direction":0,"on":false}}, {"type":"NumSrc","id":"dev2","x":30,"y":110,"label":"Α1","state":{"direction":0,"on":false}}, {"type":"NumSrc","id":"dev3","x":30,"y":150,"label":"B0","state":{"direction":0,"on":false}}, {"type":"NumSrc","id":"dev4","x":30,"y":180,"label":"B1","state":{"direction":0,"on":false}}, {"type":"NAND", "id":"dev5","x":85,"y":110,"label":"NAND","color":"red","bgColor":"yellow"}, {"type":"NAND", "id":"dev11","x":85,"y":160,"label":"NAND","color":"red","bgColor":"yellow"}, {"type":"FullAdder","id":"dev6", "x":145,"y":40, "label":"FullAdder"}, {"type":"FullAdder","id":"dev7", "x":145,"y":135,"label":"FullAdder"}, {"type":"NumDsp", "id":"dev8" ,"x":250, "y":90, "label":"Output 0","state":{"direction":2}}, {"type":"NumDsp", "id":"dev9" ,"x":250, "y":120, "label":"Output 1","state":{"direction":2}}], "connectors":[ {"from":"dev0.out0","to":"dev6.in0"}, {"from":"dev1.out0","to":"dev6.in1"}, {"from":"dev3.out0","to":"dev5.in0"}, {"from":"dev3.out0","to":"dev5.in1"}, {"from":"dev5.out0","to":"dev6.in2"}, {"from":"dev2.out0","to":"dev7.in1"}, {"from":"dev4.out0","to":"dev11.in0"}, {"from":"dev4.out0","to":"dev11.in1"}, {"from":"dev11.out0","to":"dev7.in2"}, {"from":"dev6.out1","to":"dev7.in0"}, {"from":"dev6.out0","to":"dev8.in0"}, {"from":"dev7.out0","to":"dev9.in0"}]}

In our next article, we will see how we can use subtraction to compare two numbers.

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


See also...

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