10 / 37 · अवधारणा
संयोजन RTL और पूर्ण असाइनमेंट
conditional ऑपरेटर और always_comb से एक ही फलन लिखें तथा लैच बनाने वाली छूटी असाइनमेंट खोजें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
संयोजन परिपथ का आउटपुट वर्तमान इनपुट तय करता है
MUXमल्टीप्लेक्सर चयन संकेत के अनुसार कई इनपुटों में से एक को आउटपुट से जोड़ने वाला संयोजन परिपथ। चयन बिट और इनपुट संख्या का संबंध विनिर्दिष्ट करना चाहिए। विस्तार से पढ़ें लिखने का सीधा तरीका assign y = sel ? b : a; है। कई आउटपुट साथ गणना करने के लिए always_comb उपयोग कर सकते हैं।
always_comb begin
y = a;
if (sel) y = b;
endपहले डिफ़ॉल्ट असाइन करने से sel=0 पथ भी परिभाषित है। केवल if (sel) y = b; छोड़ें तो sel=0 पर पुराना y रखना पड़ेगा, इसलिए वह शुद्ध संयोजन फलन नहीं होगा। उपकरण की चेतावनी अनदेखी न करें और केवल always_comb शब्द पर भरोसा न रखें।
पहले y=a देकर केवल sel=1 पर b चुनने वाला कोड नीचे के परिपथ जैसा 0/1 संयोजन कार्य करता है। sel=0 पर भी आउटपुट निश्चित होना चाहिए।
y = sel ? b : a
प्रक्रियात्मक वाक्यरचना को केवल सॉफ़्टवेयर क्रम न समझें
संयोजन ब्लॉक में सामान्यतः blocking असाइनमेंट = से मध्यवर्ती परिणाम निकालते हैं। उसी ब्लॉक में नीचे का व्यंजक पहले असाइन किए मान को पढ़े तो वह निर्भरता संयोजन पथ बनती है। इसे अनुक्रमिक रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। विस्तार से पढ़ें अद्यतन वाले nonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। विस्तार से पढ़ें <= से अलग रखें।
always_comb begin
next_y = sel ? b : a;
inverted_y = ~next_y;
endएक आउटपुट को कई ब्लॉकों से ड्राइव न करना भी मूल नियम है। मॉड्यूल बाँटते समय इंटरफ़ेस में पता रखें कि हर संकेत का एकमात्र ड्राइवर कौन है।
अलग चौड़ाई के डेटा पहले समान करें
आठ-बिट और बारह-बिट डेटा में चयन हो तो y की चौड़ाई और चिह्न विस्तार स्पष्ट करें। निहित विस्तार सही है या नहीं, यह संयोग से तरंगरूप में देखने के बजाय डिज़ाइन में इनपुट सीमा तय करें। 0/1 मॉडल से बाहर sel=X पर conditional ऑपरेटर का अर्थ साधारण if से अलग हो सकता है; इस पाठ्यक्रम के दो-अवस्था परिणाम को पूर्ण चार-अवस्था व्यवहार पर लागू न मानें।
खुद आज़माएँ
always_comb में केवल if(en) y=d; लिखा है। enable न होने पर 0 देने वाला संयोजन परिपथ बनाने के लिए क्या बदलेंगे?
व्याख्या पढ़ें
ब्लॉक की शुरुआत में y=0 दें और en होने पर d से बदलें, या assign y = en ? d : 0 के समतुल्य स्पष्ट चौड़ाई वाला व्यंजक लिखें। en=0 पर पुराना मान रखना रजिस्टर या लैच का अलग विनिर्देश है; यह 0 आउटपुट देने के समान नहीं।