51 / 63 · अवधारणा
ALU और zero, negative, carry, overflow फ्लैग
साझा योजक से ADD/SUB बनाएँ, carry और signed overflow अलग रखें और तुलना की शर्तें व्युत्पन्न करें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
पूर्वज्ञान: 2 का पूरकद्विपूरक निश्चित चौड़ाई के बिटों में चिह्नयुक्त पूर्णांक दर्शाने की विधि। n बिट की सीमा −2^(n−1) से 2^(n−1)−1 तक है। और जानें, योजक, संयोजी MUXमल्टीप्लेक्सर चयन संकेत के अनुसार कई इनपुटों में से एक को आउटपुट से जोड़ने वाला संयोजन परिपथ। चयन बिट और इनपुट संख्या का संबंध विनिर्दिष्ट करना चाहिए। और जानें और बिट चौड़ाई का विस्तार समझना आवश्यक है।
परिणाम और अवस्था साथ बनाने वाला ALU
ALU अलग-अलग संक्रियाओं के परिपथों में से परिणाम चुनता है और उसकी व्याख्या के लिए आवश्यक अवस्था बिट देता है। इस डिजाइन के इनपुट और परिणाम की चौड़ाई बिट है। यह ADD, SUB, AND, OR और XOR का समर्थन करता है। अंकगणितीय परिणाम हमेशा निचले बिट तक काटे जाते हैं। उसी बिट पैटर्न को unsignedunsigned बिट अनुक्रम को गैर-ऋणात्मक पूर्णांक मानने का नियम। n बिट की सीमा 0 से 2^n−1 है और वही बिट signed व्याख्या में अलग मान दे सकते हैं। और जानें या 2 के पूरक वाले signed मान के रूप में पढ़ा जा सकता है, इसलिए carry और overflow अलग आउटपुट हैं। चिह्न की अलग व्याख्या के लिए दो योजक बनाने की आवश्यकता नहीं है।
फ्लैग और हैं। Z चुने हुए पूरे परिणाम का reduction NOR है और N सबसे ऊपरी बिट है। N=1 का अर्थ है कि संग्रहीत पैटर्न की signed व्याख्या ऋणात्मक है। Overflow होने पर यह असीमित परिशुद्धता से निकाले गए वास्तविक योग के चिह्न से अलग हो सकता है।
Carry और overflow अलग करें
जोड़ में विस्तारित योग का सबसे ऊपरी बिट C है।
दोनों इनपुटों के चिह्न समान हों लेकिन परिणाम का चिह्न बदल जाए, तो V=1 होता है। उनके सबसे ऊपरी बिट हों, तो:
8 बिट में से R=0, C=1, V=0 मिलता है। Signed अर्थ में यह है, जो सीमा के भीतर है। इसके विपरीत, से R=0x80, C=0, V=1 मिलता है। Unsigned योग 128 समा जाता है, लेकिन signed अधिकतम 127 पार हो जाता है। C और V को एक मानने पर इन दोनों स्थितियों का अंतर खो जाता है।
घटाव में केवल W-बिट B को उलटेंनिषेध NOT संक्रिया 0 को 1 और 1 को 0 बनाती है। सूत्र के ऊपर की रेखा उसके नीचे के पूरे व्यंजक पर NOT लगाती है। और जानें, फिर आगे 0 जोड़कर विस्तार करें: । पूरे W+1 बिट उलटने से ऊपरी carry का अर्थ बदल जाता है। इस पाठ में C=1 का अर्थ borrow नहीं हुआ है। इसलिए unsigned तुलना में का परिणाम है।
Signed घटाव में overflow केवल अलग चिह्न वाले ऑपरेंडों के बीच संभव है। तुलना आदेश SUB का R सहेजे बिना केवल फ्लैग उपयोग कर सकता है। Signed के लिए और signed के लिए उपयोग होता है। उदाहरण के लिए, का संग्रहीत परिणाम +127 है, लेकिन V=1 केवल N देखने से होने वाली गलती सुधारता है।
नीचे 8-बिट ADD का उदाहरण है। Unsigned परिणाम दर्शाया जा सकता है, लेकिन signed परिणाम सीमा से बाहर है। ध्यान दें कि एक ही योग में C=0 और V=1 एक साथ संभव हैं।
- A=7F · B=01: signed 127 + 1
- 9-बिट योग T: 0_10000000
- 8-बिट परिणाम R: 80 → signed −128
- अवस्था फ्लैग: Z=0 · N=1 · C=0 · V=1
साझा योजक और स्पष्ट आउटपुट नियम
नीचे का RTL W≥2 मानता है। Opcode 0–4 क्रमशः ADD, SUB, AND, OR, XOR हैं। तार्किक संक्रियाओं में C,V को 0 रखा जाता है। अप्रयुक्त opcode के लिए R=0 है, इसलिए Z=1 और बाकी फ्लैग 0 हैं। ये नियम किसी विशेष CPU के निर्देश समुच्चय की नकल नहीं, इस ALU के इंटरफेस का अनुबंध हैं।
module alu #(parameter int W = 8) (
input logic [W-1:0] a, b,
input logic [2:0] op,
output logic [W-1:0] y,
output logic z, n, c, v
);
logic sub;
logic [W-1:0] bx;
logic [W:0] sum;
always_comb begin
sub = (op == 3'd1);
bx = b ^ {W{sub}};
sum = {1'b0, a} + {1'b0, bx}
+ {{W{1'b0}}, sub};
y = '0;
c = 1'b0;
v = 1'b0;
case (op)
3'd0, 3'd1: begin
y = sum[W-1:0];
c = sum[W];
if (sub)
v = (a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
else
v = ~(a[W-1] ^ b[W-1]) & (a[W-1] ^ y[W-1]);
end
3'd2: y = a & b;
3'd3: y = a | b;
3'd4: y = a ^ b;
default: y = '0;
endcase
z = ~(|y);
n = y[W-1];
end
endmoduleB का सशर्त उलटना और आरंभिक carry, ADD/SUB को एक साझा योजक संरचना में व्यक्त करते हैं। हर शाखा पहले y तय करती है और फिर Z,N निकाले जाते हैं, इसलिए तार्किक संक्रियाओं पर भी अवस्था के नियम एक समान रहते हैं। आरंभिक असाइनमेंट सभी आउटपुट मार्ग परिभाषित करती हैं और लैचलैच नियंत्रण सक्रिय रहने पर इनपुट का अनुसरण और निष्क्रिय होने पर मान बनाए रखने वाला स्मृति अवयव। यह केवल एज पर संग्रहित करने वाले फ्लिप-फ्लॉप से अलग है। और जानें बनने से रोकती हैं। यहाँ रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और जानें नहीं है, इसलिए क्लॉक चक्रों में गणना का विलंब नहीं है, लेकिन वास्तविक संकेत प्रसार में समय लगता है। संक्रिया चुनने वाले MUX और zero पहचान परिपथ सहित पूरे मार्ग से संकेत अगले रजिस्टर की setup समय-सीमा के भीतर पहुँचने चाहिए।
सत्यापन में 0, unsigned अधिकतम, signed अधिकतम और न्यूनतम तथा सीमाओं के दोनों ओर के मानों के जोड़े जाँचें। R की तुलना modulo संदर्भ से, C की unsigned विस्तारित योग से और V की signed सीमा पार होने से अलग-अलग करें। R सही होने पर भी फ्लैग की परिभाषा गलत हो सकती है।
परिणाम के चिह्न, शून्य, unsigned carry और signed overflow को अलग फ्लैग में बाँटने का वास्तविक उदाहरण Arm के condition flags विवरण में मिलता है।
खुद आज़माएँ
8-बिट ALU में (1) 0x7F+0x01, (2) 0xFF+0x01, (3) 0x00−0x01 और (4) 0x80−0x01 के R,Z,N,C,V निकालें। (4) के इनपुटों की signed तुलना में केवल N का उपयोग गलत क्यों है?
व्याख्या पढ़ें
(R,Z,N,C,V) क्रम में उत्तर हैं: (1) (0x80,0,1,0,1), (2) (0x00,1,0,1,0), (3) (0xFF,0,1,0,0), (4) (0x7F,0,0,1,1)। (3) में unsigned घटाव को borrow चाहिए, इसलिए C=0 है, जबकि signed −1 दर्शाया जा सकता है। (4) में unsigned 128−1=127 को borrow नहीं चाहिए, इसलिए C=1 है। Signed रूप में −128−1=−129 सीमा से बाहर है, इसलिए V=1 है; संग्रहीत R का N=0 वास्तविक अंतर का चिह्न नहीं बताता। Signed A<B के लिए N xor V=1 सही रूप से सत्य देता है।