तर्क या रीसेट और स्पष्ट?
मैं एक रीसेट लागू करने के लिए सर्वोत्तम अभ्यास का पता लगाने की कोशिश कर रहा हूं (async लागू, सिंक क्लियर) और एक स्पष्ट इनपुट। मेरे पास एक ऐसी प्रक्रिया है जो एक लॉजिक-व्युत्पन्न घड़ी (NCO) को बंद कर देती है, जिसे code_clk, धीमे लेकिन वास्तविक clk के तुल्यकालिक कहा जाता है। इस प्रक्रिया में एक लीनियर फीडबैक शिफ्ट रजिस्टर शामिल है, जिसे रीसेट करने के बाद कोड जनरेशन अनुक्रम शुरू करने के लिए सभी को रीसेट करना होगा। हालाँकि, पूरे ऑपरेशन के दौरान प्रक्रिया को सभी 1 पर भी रीसेट करना चाहिए, जब आउटपुट के लिए नल (T1 और T2) का एक नया सेट चुना जाता है, बेशक कोड पीढ़ी के अनुक्रम को रीसेट करने के लिए और सुनिश्चित करें कि नया कोड नए के साथ मान्य है नल। यह एक अलग, तुल्यकालिक clr इनपुट के साथ किया जाता है, जो एकल सिस्टम क्लॉक चक्र के लिए उच्च आयोजित किया जाता है, जबकि नल चारों ओर चले जाते हैं।
यहाँ मेरा कोड है:
process(code_clk, reset, clr)
begin
if(reset='0' or clr='1') then
-- EARLY LFSR
EG1(1 to 10) <= (others => '1');
EG2(1 to 10) <= (others => '1');
early_code <= '0';
delay_os <= '0';
elsif(falling_edge(code_clk)) then
if(delay_os='0') then
-- LFSR feedbacks for early code
EG1(2 to 10) <= EG1(1 to 9);
EG2(2 to 10) <= EG2(1 to 9);
EG1(1) <= EG1(3) xor EG1(10);
EG2(1) <= EG2(2) xor EG2(3) xor EG2(6) xor EG2(8) xor EG2(9) xor EG2(10);
early_code <= EG1(10) xor EG2(T1) xor EG2(T2); -- C/A output of early LFSR
else
-- delay of code chips commanded - do not shift this time
delay_os <= '0';
end if;
late_code <= early_code; -- one half chip delay from prompt code
elsif(rising_edge(code_clk)) then
prompt_code <= early code; -- one half chip delay from early code
end if;
end process;
सशर्त अगर (रीसेट = '0' या clr = '1') खराब शैली के रूप में मुझ पर कूदता है। यह सिर्फ उन स्थितियों में से एक लगता है जहां संश्लेषण अनावश्यक तर्क या समय देरी का उत्पादन करेगा क्योंकि रीसेट पथ उतना सीधा नहीं है। क्या मैं ऐसा कर सकता हूं या मुझे कुछ और करने की कोशिश करनी चाहिए? स्पष्ट रूप से तुरंत होने की आवश्यकता है इसलिए मुझे या तो प्रक्रिया को सिस्टम क्लॉक या कुछ और चलाने की आवश्यकता होगी। क्या यह अच्छा अभ्यास माना जाता है?
जवाब
सशर्त के लिए आपकी प्रवृत्ति सही है। कुछ संश्लेषण उपकरण यह समझ सकते हैं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन बहुत से जो आपने लिखे हैं वह एक स्थापित पैटर्न नहीं है, इसलिए उपकरण आप जो चाहते हैं, उस तरीके से अनुमान नहीं लगा सकते हैं। मानक (अगर ऐसी कोई चीज है) / जो आप प्राप्त करने की कोशिश कर रहे हैं उसे लिखने का तरीका इस तरह है:
process(clk, reset)
begin
if reset = '1' then -- async reset
-- your code here
elsif Rising_edge(clk) then
if sync_clr = '1' then -- sync clear
-- your code here
end if;
end if;
end process;
मैं ध्यान देता हूं कि आपका रीसेट सक्रिय कम है जो FPGA के भीतर जमा हो जाता है (वास्तविक वास्तु मुद्दों की तुलना में कोड पठनीयता के साथ अधिक करने के लिए)।
पर रुको! इसमें से कोई भी वास्तव में क्यों मायने रखता है?
यह आपके द्वारा उपयोग किए जा रहे FPGA की व्यक्तिगत वास्तुकला के लिए नीचे आता है। नीचे एक चक्रवात V अनुकूली तर्क मॉड्यूल के लिए ब्लॉक आरेख का एक स्निपेट है।
रजिस्टरों को देखकर आप देख सकते हैं कि उनका केवल एक ही नियंत्रण है - सीएलआर। आरेख के शीर्ष पर आप संकेतों को देख सकते हैं [1: 0] ALM में आ रहा है। जब आप एक async रीसेट करते हैं, तो यह सेट होता है। ध्यान दें कि इस ALM में 4 रजिस्टर हैं लेकिन जोड़े द्वारा साझा किए गए केवल 2 रीसेट सिग्नल हैं। इसका एक निहितार्थ है कि कितने ALM का उपयोग किया जाता है।
आप ALM में आने वाला एक सिंक्रोनस क्लियर सिग्नल ( sclr ) और एक सिंक्रोनस लोड सिग्नल ( सिंकलोड ) भी देख सकते हैं । ये सभी 4 रजिस्टरों द्वारा साझा किए गए हैं। इन सर्किट का उपयोग कोड में अनुमान लगाने पर किया जाएगा। आरेख यह समझने के लिए पर्याप्त है कि सिग्नल कैसे काम करते हैं।
sclr का उद्देश्य सक्रिय उच्च होना है। यह उलटा और एंडेड है डेटा के साथ जो रजिस्टरों के डी इनपुट को फीड करता है। इसका मतलब है कि जब उच्च, 0 डी इनपुट को खिलाया जाता है और क्यू अगले घड़ी चक्र पर 0 को अद्यतन करता है।
Syncload एक मल्टीप्लेक्स ड्राइव करता है जो LUTs या datae0 से या तो आउटपुट का चयन करता है जो ALM के बाहर उत्पन्न होता है।
ध्यान दें कि कैसे कोई एसिंक्रोनस सेट नहीं है। यदि आपने यह लिखा है, तो उपकरण इसे डिवाइस आर्किटेक्चर से मेल नहीं कर पाएंगे और इसके बजाय LUT का उपयोग करके लागू कर सकते हैं। यह हर नियंत्रण के लिए समान है जो उपकरणों के आर्किटेक्चर का हिस्सा नहीं है।
Xilinx के पास एक श्वेत पत्र है जो इसे और अधिक विस्तार से बताता है: https://www.xilinx.com/support/documentation/white_papers/wp275.pdf