52 / 63 · अवधारणा
बैरल शिफ्टर और चरणवार MUX
परिवर्तनीय शिफ्ट को 1, 2, 4, 8 स्थानों वाले MUX चरणों से बनाएँ और दिशा साझाकरण, चिह्न भरने तथा सीमा से बड़े शिफ्ट सँभालें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
पूर्वज्ञान: MUXमल्टीप्लेक्सर चयन संकेत के अनुसार कई इनपुटों में से एक को आउटपुट से जोड़ने वाला संयोजन परिपथ। चयन बिट और इनपुट संख्या का संबंध विनिर्दिष्ट करना चाहिए। और जानें, तार्किक और अंकगणितीय शिफ्ट तथा संयोजी परिपथों का प्रसार विलंबप्रसार विलंब इनपुट बदलने के बाद आउटपुट सही मान पर स्थिर होने तक का समय। तार्किक समतुल्यता और समय-संबंधी गुण अलग हैं। और जानें समझना आवश्यक है।
परिवर्तनीय शिफ्ट को निश्चित तारों के चयन में बदलें
एक बार में एक बिट खिसकाने वाला शिफ्ट रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और जानें उतने ही क्लॉक चक्र लेता है जितने स्थान खिसकाने हैं। बैरल शिफ्टर, शिफ्ट की मात्रा को इनपुट लेकर एक संयोजी मार्ग से परिणाम बनाता है। बिट समय के साथ बार-बार नहीं चलते; वांछित स्थान के इनपुट बिट को आउटपुट से जोड़ने वाला तार-मार्ग चुना जाता है।
16-बिट मान को 0–15 स्थान खिसकाने पर मात्रा होती है। इसलिए 1, 2, 4 और 8 स्थान खिसकाने वाले चार चरण क्रम में लगाएँ। हर चरण MUX से “जैसा है वैसा पार करना” और “निर्धारित स्थानों से खिसकाना” में से एक चुनता है।
उदाहरण के लिए, 11 का बाइनरी रूप 1011 है, इसलिए 1, 2 और 8 स्थान वाले चरण चुनते हैं तथा 4 वाला चरण बिना बदलाव पार करते हैं। को तार्किक रूप से दाएँ खिसकाने पर क्रमशः 0x6952, 0x1A54, 0x1A54 और 0x001A मिलते हैं। ये चार क्लॉक के मान नहीं, चार संयोजी चरणों के मान हैं।
हर चरण में 16 MUX हैं: चार समूह, अर्थात कुल 64 एक-बिट 2:1 चयन बिंदु। यह तारों और स्थिर मानों के प्रसार का अनुकूलन करने से पहले की संरचनात्मक गिनती है। सामान्य में डेटा चयन संरचना और गहराई के अनुपात में होती है। हर आउटपुट पर अलग W:1 MUX लिखने पर भी संश्लेषण उसे वृक्ष में बदल सकता है, इसलिए RTL की पंक्तियाँ गिनकर क्षेत्रफल या आवृत्ति तय न करें।
नीचे इनपुट 0xD2A5 को 11 स्थान तार्किक रूप से दाएँ खिसकाते हैं। मात्रा 1011 के बिटों द्वारा चुने गए चार संयोजी चरण दिखाए गए हैं। यह चार क्लॉक में चलने वाला चित्र नहीं है।
- 1 स्थान का चरण · s0=1: D2A5 → 6952
- 2 स्थान का चरण · s1=1: 6952 → 1A54
- 4 स्थान का चरण · s2=0: 1A54 बिना बदलाव पार
- 8 स्थान का चरण · s3=1: 1A54 → 001A
दाएँ शिफ्ट के परिपथ से बायाँ शिफ्ट भी बनाएँ
बिट क्रम उलटें, s स्थान तार्किक दायाँ शिफ्ट करें और क्रम फिर उलटें: इससे तार्किक बायाँ शिफ्ट मिलता है। इस सममिति से चारों चरण साझा किए जा सकते हैं। लेकिन इनपुट और आउटपुट पर दिशा चुनने के MUX भी लगते हैं, इसलिए कुल लागत 64 पर समाप्त नहीं होती। निश्चित बिट-क्रम उलटना, जिसमें दिशा का चयन नहीं है, केवल तारों से होता है।
अंकगणितीय दायाँ शिफ्ट खाली ऊपरी बिटों में मूल इनपुट का चिह्न बिट भरता है। बाएँ शिफ्ट में अंकगणितीय मोड होने पर भी 0 भरते हैं। 2 के पूरकद्विपूरक निश्चित चौड़ाई के बिटों में चिह्नयुक्त पूर्णांक दर्शाने की विधि। n बिट की सीमा −2^(n−1) से 2^(n−1)−1 तक है। और जानें में अंकगणितीय और तार्किक बायाँ शिफ्ट बिटों को एक ही तरह से खिसकाते हैं; वे signed overflow अपने आप नहीं जाँचते।
शिफ्ट की मात्रा की सीमा भी परिपथ के अनुबंध का हिस्सा है। नीचे 5-बिट shamt से 0–31 स्वीकार होते हैं। 16 या अधिक पर तार्किक और बाएँ शिफ्ट का परिणाम 0 है; अंकगणितीय दाएँ शिफ्ट का परिणाम चिह्न बिट की 16 प्रतियों से बनता है। केवल shamt के निचले 4 बिट उपयोग करने पर 16 स्थान को 0 स्थान समझ लिया जाएगा, इसलिए अलग प्रबंधन चाहिए।
module barrel16 (
input wire [15:0] x,
input wire [4:0] shamt,
input wire left,
input wire arithmetic,
output wire [15:0] y
);
wire fill;
wire [15:0] stage [0:4];
assign fill = (!left) && arithmetic && x[15];
for (genvar i = 0; i < 16; i++) begin : direction
assign stage[0][i] = left ? x[15-i] : x[i];
assign y[i] = shamt[4] ? fill :
(left ? stage[4][15-i] : stage[4][i]);
end
for (genvar k = 0; k < 4; k++) begin : shift_stage
localparam int D = 1 << k;
assign stage[k+1] = shamt[k]
? {{D{fill}}, stage[k][15:D]}
: stage[k];
end
endmodulegenerate का k परिपथ बनाते समय तय होने वाला स्थिरांक है। यह रनटाइम में लूप चार बार चलाने वाला उपकरण नहीं है। हर चरण की part-select और दोहराए गए संयोजन की लंबाई निश्चित है, इसलिए चार निश्चित तार संरचनाएँ और MUX बनते हैं। fill हर चरण में समान रहता है, इसलिए कई चरण चुने जाने पर भी विस्तार उसी चिह्न से होता है।
यह RTL चिह्न भरना स्पष्ट रूप से लिखकर unsignedunsigned बिट अनुक्रम को गैर-ऋणात्मक पूर्णांक मानने का नियम। n बिट की सीमा 0 से 2^n−1 है और वही बिट signed व्याख्या में अलग मान दे सकते हैं। और जानें वेक्टर पर भी अंकगणितीय शिफ्ट करता है। इसे ऑपरेटर से संक्षिप्त करने पर अंकगणितीय दाएँ शिफ्ट के लिए signed ऑपरेंड और >>> दोनों चाहिए। केवल >>> लिख देना, या part-select के मूल चर को signed घोषित करना, पर्याप्त सुरक्षा नहीं है। Concatenation और कुछ चयन signed व्याख्या खो सकते हैं; पहले वांछित चौड़ाई के signed मान में बदलें। संश्लेषण उपकरण द्वारा समर्थित ऑपरेटर AMD के Verilog व्यंजक दस्तावेज में दिए गए हैं।
विलंब और सूचना की हानि अलग विषय हैं
चार संयोजी चरणों के साथ दिशा व सीमा के चयन तथा तारों का विलंब भी जुड़ता है। टाइमिंग पर्याप्त न हो तो बीच में रजिस्टर जोड़ सकते हैं, लेकिन डेटा के साथ शेष शिफ्ट मात्रा और दिशा नियंत्रण भी उतने ही क्लॉक से विलंबित होने चाहिए। इससे आउटपुट का विलंबविलंब इनपुट स्वीकार होने से उसके अनुरूप आउटपुट आने तक का समय या चक्रों की संख्या। यह प्रति इकाई समय में संसाधित काम की मात्रा, अर्थात थ्रूपुट, से अलग है। और जानें बदल जाता है; इंटरफेस को सरल संयोजी मॉड्यूल जैसा नहीं मान सकते।
शिफ्ट काटी गई सूचना वापस नहीं ला सकता। Unsigned बाएँ शिफ्ट में बाहर निकला कोई भी ऊपरी बिट 1 हो तो सीमा पार हुई है। Signed सीमा पार होने की जाँच में मूल चिह्न और कटने वाले बिट भी देखने होते हैं। यह मॉड्यूल ऐसे फ्लैग नहीं देता। ऋणात्मक मान का अंकगणितीय दायाँ शिफ्ट, से भाग को नीचे वाले पूर्णांक तक ले जाता है। इसलिए को एक स्थान खिसकाने पर मिलता है, जबकि 0 की ओर पूर्णांक भाग देता है।
खुद आज़माएँ
16-बिट x=0x8123 के लिए परिणाम निकालें: (1) 3 स्थान तार्किक दायाँ शिफ्ट, (2) 3 स्थान अंकगणितीय दायाँ शिफ्ट, (3) 16 स्थान तार्किक बायाँ शिफ्ट, (4) 20 स्थान अंकगणितीय दायाँ शिफ्ट। (2) में चुने गए चरण और (3) में shamt[4] का प्रबंधन छोड़ने पर होने वाली गलती भी बताएँ।
व्याख्या पढ़ें
परिणाम हैं: (1) 0x1024, (2) 0xF024, (3) 0x0000, (4) 0xFFFF। 3=1+2 है, इसलिए 1 और 2 स्थान वाले चरण चुने जाते हैं। अंकगणितीय शिफ्ट के मध्यवर्ती मान 0xC091→0xF024 हैं; मूल चिह्न 1 होने से ऊपरी बिटों में 1 भरते हैं। 16 के लिए shamt=10000 है। केवल निचले चार बिट उपयोग करने पर हर चरण बिना बदलाव पार होगा और मूल 0x8123 निकलेगा। इसलिए 16 या अधिक को अलग पहचानना आवश्यक है। अंकगणितीय मोड में भी बाएँ शिफ्ट के खाली निचले बिट 0 होते हैं।