53 / 63 · अवधारणा
स्थिर बिंदु, पूर्णांकन और संतृप्ति
W,F से संख्यात्मक सीमा तय करें और guard/sticky पर आधारित ties-to-even पूर्णांकन के बाद संतृप्ति लागू करें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
पूर्वज्ञान: signed जोड़ और गुणा की बिट चौड़ाई, अंकगणितीय दायाँ शिफ्ट तथा overflow समझना आवश्यक है।
बिट पैटर्न में बिंदु का स्थान तय करें
स्थिर बिंदुस्थिर-बिंदु निरूपण बिंदु की स्थिति पहले तय करके पूर्णांक बिट अनुक्रम पर निश्चित पैमाना लागू करना। चौड़ाई, चिह्न और भिन्नांश बिटों की संख्या साथ तय करनी होती है। निरूपण में पूर्णांक X को पढ़ते हैं। हार्डवेयर में बिंदु का कोई बिट संग्रहीत नहीं होता। इस पाठ में signed कुल चौड़ाई W में चिह्न बिट शामिल है और F भिन्नात्मक बिटों की संख्या है। Q संकेत की परंपराएँ इस बात में अलग होती हैं कि पूर्णांक भाग में चिह्न बिट गिना गया है या नहीं; इसलिए इंटरफेस में W,F साथ लिखना अधिक स्पष्ट है।
W=8,F=4 हो तो अंतराल 1/16 और सीमा -8 से 7.9375 तक है। इस अनुबंध में 0x18 पूर्णांक 24 नहीं, 1.5 है। वही 0x18 यदि F=3 से पढ़ें तो 3 होता है। तार जोड़ने से संख्यात्मक अर्थ का मेल सुनिश्चित नहीं होता, इसलिए हर पोर्ट का पैमाना लिखें।
जोड़ से पहले बिंदु के स्थान मिलाने होते हैं। F अलग हों तो छोटे F वाले मान को पर्याप्त चौड़ा करके बाएँ खिसकाएँ, या बड़े F वाले मान को निर्धारित पूर्णांकन नियम से घटाएँ। समान W,F वाली दो संख्याओं के सटीक योग के लिए W+1 बिट और वही F चाहिए। गुणा में raw पूर्णांक गुणा होते हैं और भिन्नात्मक बिटों की संख्याएँ जुड़ती हैं।
8-बिट F=4 की दो संख्याओं का पूरा गुणनफल signed 16-बिट F=8 है। उसे फिर 8-बिट F=4 में निकालने के लिए पहले चार भिन्नात्मक बिट घटाएँ, फिर signed 8-बिट सीमा जाँचें। गुणनफल को पहले ही 8 बिट तक काट देने पर बाद का संतृप्ति परिपथ मूल परिमाण नहीं जान सकता।
काटने और पूर्णांकन का अंतर
d बिट हटाने वाला अंकगणितीय दायाँ शिफ्ट देता है। ऋणात्मक मान भी नीचे की ओर जाते हैं। उदाहरण के लिए, में सटीक भागफल -1.5 है, लेकिन q=-2 मिलता है। यह 0 की ओर काटने से अलग है। धनात्मक मान पर सही लगने वाला “ऊपरी बिट बस चुन लें” नियम ऋणात्मक मान पर भी समान त्रुटि गुण देगा, ऐसा न मानें।
निकटतम पूर्णांक चुनने और ठीक मध्य में सम पूर्णांक चुनने वाला round-to-nearest, ties-to-even बनाएँ। हटाए जा रहे भाग का सबसे ऊपरी बिट guard g, बाकी हटने वाले बिटों का OR sticky t और बचने वाले q का सबसे निचला बिट l है।
g=0 पर भिन्न आधे से कम है, इसलिए q न बदलें। g=1,t=1 पर आधे से अधिक है, इसलिए बढ़ाएँ। g=1,t=0 ठीक आधा है, इसलिए केवल q विषम होने पर 1 जोड़ें। यही नियम ऋणात्मक मानों पर भी लागू है: floor भागफल q और शेष के लिए हमेशा रहता है।
उदाहरण के लिए, -24/16=-1.5 में q=-2 सम है, इसलिए -2 ही रहता है। -40/16=-2.5 में q=-3 विषम है, इसलिए -2 हो जाता है। “ऋणात्मक हो तो हमेशा 1 घटाएँ” जैसा अलग नियम गलत होगा। संतृप्ति न होने पर अंतिम संख्यात्मक त्रुटि आउटपुट LSBLSB सबसे कम स्थानिक भार वाला बिट। लिखने की दिशा और इंडेक्स के नियम साथ जाँचने चाहिए। और जानें के आधे से अधिक नहीं होती। Ties-to-even हर इनपुट वितरण पर औसत त्रुटि शून्य होने की गारंटी नहीं देता, लेकिन बराबरी को हमेशा एक दिशा में भेजने का पक्षपात घटाता है।
नीचे 16-बिट F=8 का raw P=2040, 8-बिट F=4 में बदलता है। 127.5 पहले सम 128 तक पूर्णांकित होता है, फिर signed 8-बिट अधिकतम 127 पर सीमित होता है। अंतिम भंडारण तक पर्याप्त चौड़ाई बनाए रखें।
- इनपुट P=2040: 16 बिट · F=8
- पैमाना घटाएँ: 2040 / 16 = 127.5
- मध्य पर सम चुनें: पूर्णांकित raw = 128
- संतृप्ति के बाद रखें: raw 127 → 7.9375
पूर्णांकन पूरा होने के बाद संतृप्ति करें
संतृप्ति में अधिकतम से बड़े मान को अधिकतम और न्यूनतम से छोटे मान को न्यूनतम पर सीमित करते हैं। Wrap के विपरीत, बड़ा धनात्मक मान ऋणात्मक नहीं बनता। लेकिन पहले ही संकीर्ण होकर wrap हुए मान पर सही संतृप्ति लागू नहीं की जा सकती।
नीचे signed 16-बिट F=8 से signed 8-बिट F=4 में बदलने वाला पूरा संयोजी मॉड्यूल है। d=4 निश्चित होने से guard, p[3] है और sticky के बिट p[2:0] हैं। पूर्णांकन की वृद्धि और सीमा की तुलना 17-बिट signed स्थान में होती है; केवल अंत में 8 बिट लिए जाते हैं।
module requantize (
input logic signed [15:0] p,
output logic signed [7:0] y,
output logic saturated
);
logic signed [16:0] wide, q, rounded;
logic inc;
always_comb begin
wide = {p[15], p};
q = wide >>> 4;
inc = p[3] & ((|p[2:0]) | q[0]);
rounded = q + (inc ? 17'sd1 : 17'sd0);
saturated = 1'b0;
if (rounded > 17'sd127) begin
y = 8'sh7f;
saturated = 1'b1;
end else if (rounded < -17'sd128) begin
y = 8'sh80;
saturated = 1'b1;
end else begin
y = rounded[7:0];
end
end
endmoduleP=2040 में P/16=127.5 है। पहले 128 तक पूर्णांकन, फिर 127 तक संतृप्ति होती है; अंतिम मान 7.9375 है। पूर्णांकन से पहले केवल q=127 जाँचने पर यह सीमा उल्लंघन छूट जाएगा। saturated का अर्थ है कि संख्या सीमा से बाहर जाकर सीमित हुई है, केवल निचले भिन्नात्मक बिट खोना नहीं।
सामान्य मॉड्यूल बनाते समय d=0 में हटाने के लिए कोई बिट नहीं और d=1 में sticky क्षेत्र नहीं होता—इन मामलों को अलग सँभालें। अमान्य part-select को केवल if के भीतर छिपाने पर भी elaboration त्रुटि आ सकती है।
पूर्णांकन और संतृप्ति अलग नीतियाँ हैं, जो योजक, तुलनित्र और MUXमल्टीप्लेक्सर चयन संकेत के अनुसार कई इनपुटों में से एक को आउटपुट से जोड़ने वाला संयोजन परिपथ। चयन बिट और इनपुट संख्या का संबंध विनिर्दिष्ट करना चाहिए। और जानें की लागत व विलंब जोड़ती हैं। यह अंतर AMD के स्थिर-बिंदु प्रारूप दस्तावेज में भी दिखता है। कई पद संचित करते समय पहले तय करें कि मध्यवर्ती चौड़ाई बनाए रखकर अंत में एक बार रूपांतरण करेंगे या नहीं। हर चरण पर संतृप्ति जोड़ के साहचर्य नियम को तोड़ सकती है, और हर चरण पर पूर्णांकन छोटी त्रुटियाँ बार-बार जमा कर सकता है।
खुद आज़माएँ
Signed 16-बिट F=8 इनपुट P को signed 8-बिट F=4 में बदलें। P=24,40,−24,−40,2040 के लिए floor भागफल q, guard/sticky, पूर्णांकित पूर्णांक, अंतिम raw आउटपुट और वास्तविक मान निकालें। 2040 पर संतृप्ति की जाँच पहले करने से क्या समस्या होगी?
व्याख्या पढ़ें
सभी इनपुटों के निचले चार बिट 1000 हैं, इसलिए guard=1,sticky=0 है। P=24: q=1 विषम→2, raw=2, वास्तविक मान=0.125। P=40: q=2 सम→2, raw=2, मान=0.125। P=−24: q=−2 सम→−2, raw=−2, मान=−0.125। P=−40: q=−3 विषम→−2, raw=−2, मान=−0.125। P=2040: q=127 विषम→128, जो signed 8-बिट अधिकतम पार करता है; इसलिए raw=127, वास्तविक मान=7.9375,saturated=1। पहले केवल q=127 जाँचकर 8 बिट में 1 जोड़ने पर 0x80 में wrap होकर −8 निकल सकता है। वृद्धि और तुलना पर्याप्त चौड़े signed मान में पूरी करें।