2013-03-18 6 views
25

मैं वीएचडीएल प्रोग्रामिंग के बारे में एक पाठ पढ़ रहा हूं (इसे सामने नहीं है इसलिए शीर्षक नहीं दे सकता)। एक समस्या को पाठ से समझने में कठिनाई हो रही है जब एक चर बनाम एक चर का उपयोग करना है। मुझे लगता है कि मुझे सिग्नल (आंतरिक सिग्नल जो है) का उपयोग करने की स्पष्ट समझ है लेकिन एक चर के लिए इतना नहीं है।वीएचडीएल परिवर्तनीय बनाम। सिग्नल

मैं एक प्रक्रिया के अंदर है कि पाठ आम तौर पर यह घोषणा करता है और एक प्रक्रिया है, जबकि एक चर घोषित किया जाता है परिभाषित करने से पहले संकेत initializes नोटिस किया था (और मैं प्रारंभ कभी नहीं लगता है ..)।

वैसे भी इसे साफ़ करने के लिए, या तो परिभाषा या उदाहरण के द्वारा बहुत अच्छा होगा!

उत्तर

34

चर उपयोग किया जाता है जब आप धारावाहिक कोड बनाना चाहते हैं, सामान्य समानांतर कोड के विपरीत है। (सीरियलाइज्ड का मतलब है कि आदेश उनके क्रम में निष्पादित होते हैं, एक दूसरे के साथ एक के बाद)। एक चर केवल एक प्रक्रिया के अंदर मौजूद कर सकते हैं, और मूल्यों का काम समानांतर नहीं है। इससे पहले कि प्रक्रिया भाग गया

signal a,b : std_logic_vector(0 to 4); 

process (CLK) 
    begin 
     if (rising_edge(clk)) then 
      a <= '11111'; 
      b <= a; 
     end if; 
end process; 

a का मूल्य b में डाल दिया जाएगा, और नहीं '11111 ': उदाहरण के लिए, निम्नलिखित कोड पर विचार करें। दूसरी ओर, कोड:

signal a,b : std_logic_vector(0 to 4); 

process (CLK) 
    variable var : std_logic_vector(0 to 4); 
    begin 
     if (rising_edge(clk)) then 
      var := '11111'; 
      a <= var; 
      b <= var; 
     end if; 
end process; 

a और b दोनों में मूल्य '11111' डाल देंगे।

सच कहूं, मेरे अनुभव में, समय की सबसे आप चर का उपयोग करने की जरूरत नहीं है, केवल जगह मैं प्रयोग किया जाता एक पाश में था, जहां मैं अगर संकेतों के एक नंबर के किसी भी 1 है की जाँच करने के लिए आवश्यक:

type BitArray  is array (natural range <>) of std_logic; 

--... 

entity CAU_FARM is 
    port 
     (
      -- IN -- 
       REQUEST   : in BitArray(0 to (FLOW_num -1)); 
       --.. 
     ); 
end CAU_FARM; 
--... 

farm_proc: process(CLK_FARM, RESET) 
    variable request_was_made_var : std_logic; 
    begin 
    if RESET = C_INIT then 
     -- ... 

    elsif rising_edge(CLK_FARM) then 

      -- read state machine -- 
     case read_state is 
      when  st_read_idle => 

       request_was_made_var := '0'; 
       for i in 0 to (FLOW_num -1) loop 
        if (REQUEST(i) = '1') then 
         request_was_made_var := '1'; 
        end if; 
       end loop; 
       if (request_was_made_var = '1') and (chosen_cau_read_sig /= 8) then 
        read_state <= st_read_stage_1; 
        for i in 0 to (FLOW_num -1) loop 
         if (i = choice_out_sig) then 
          ACKNOWLEDGE(i) <= '1'; 
         end if; 
        end loop; 
       else 
        read_state <= st_read_idle; 
       end if; 
      ------------------------ 
      when  st_read_stage_1 => 
      --... 
+1

दोनों धन्यवाद! मैंने एलएलए के जवाब का चयन किया क्योंकि उत्तर स्पष्ट रूप से कहता है कि धारावाहिक ** केवल ** धारावाहिक कोड के लिए एक प्रक्रिया में मौजूद है। ऐसा लगता है कि आप दोनों एक ही बात कह रहे थे, लेकिन मेरे लिए महत्वपूर्ण शब्द 'केवल' ने इसे और अधिक स्पष्ट बना दिया। – doddy

12

चर का उपयोग किसी प्रक्रिया के भीतर मूल्य संग्रहीत करने के लिए किया जाता है। जैसे कि इसका दायरा सीमित है। संश्लेषित हार्डवेयर के लिए कम सीधा संबंध होता है।

वैरिएबल को तुरंत एक मूल्य मिलता है, जबकि सिग्नल नहीं होते हैं। निम्नलिखित दो प्रक्रियाओं में एक ही प्रभाव है:

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5); 

process (CLK) 
    Variable TEMP : STD_LOGIC_VECTOR(0 to 5); 
    begin 
     if (rising_edge(clk)) then 
      TEMP := IP; 
      IP <= NEXTP; 
      NEXTP <= TEMP(5) & TEMP(0 to 4); 
     end if; 
end process; 

signal IP, NEXTP : STD_LOGIC_VECTOR(0 to 5); 

process (CLK) 

    begin 
     if (rising_edge(clk)) then 
      IP <= NEXTP; 
      NEXTP <= IP(5) & IP(0 to 4); 
     end if; 
end process; 

इसका कारण यह है अद्यतन अनुसूचित हो, लेकिन वास्तव में अभी तक नहीं बदला है। <= में एक अस्थायी तत्व शामिल है।

7

चर: अस्थायी स्थान; वे "प्रक्रिया" के भीतर मध्यवर्ती मूल्यों को स्टोर करने के लिए उपयोग किया जाता है।

संकेतों: अद्यतन संकेत मान। प्रक्रिया चलाएं signal.While प्रक्रिया पर परिवर्तन से सक्रिय चल रहा है प्रणाली में सभी संकेतों अपरिवर्तित ही रहेंगे।

अंतर:

चर: वे स्थानीय कर रहे हैं; विलंब न करें; प्रक्रिया के भीतर घोषित

संकेत: वे वैश्विक हैं (शुरू होने से पहले); तार के कारण देरी; कुंजी शब्द शुरू होने से पहले घोषित

+0

यह सहायक है, धन्यवाद। – doddy

1

एक तरफ नोट वैरिएबल केवल प्रक्रियाओं में नहीं रह सकता है (लेकिन प्रक्रियाओं में भी), इसके अलावा उन्हें कई प्रक्रियाओं से सुलभ चर साझा किया जा सकता है (देखें: http://www.ics.uci.edu/~jmoorkan/vhdlref/var_dec.html)।

-1

चर - वे एक प्रक्रिया के लिए स्थानीय हैं, जैसे ही वैरिएबल को एक नया मान मिल जाता है, उनका मूल्य अपडेट किया जाता है।

साझा चर- चर की तरह हैं लेकिन उन्हें विभिन्न प्रक्रियाओं से एक्सेस किया जा सकता है।

सिग्नल- उनका दायरा बड़ा है, हर प्रक्रिया आर्किटेक्चर या एक विशिष्ट ब्लॉक (यदि वहां है) में घोषित संकेतों तक पहुंच सकती है। प्रक्रिया निलंबित होने के बाद या प्रतीक्षा विवरण का सामना करने के बाद मूल्य अपडेट होते हैं।

+0

वीएचडीएल -2000/2002 अपडेट के साथ, साझा चरों को नियमित प्रकारों के साथ उपयोग करने की अनुमति नहीं है। इसके बजाय वे केवल संरक्षित प्रकारों के साथ उपयोग किया जा सकता है। संरक्षित प्रकार असाइनमेंट की अनुमति नहीं देते हैं। इसलिए, साझा चर वस्तु के लिए हैंडल की तरह अधिक है, यह एक चर है। –

संबंधित मुद्दे