2009-05-12 9 views
11

क्यों बढ़ा नहीं सकता हूं यहां क्या हो रहा है? मुझे 'ऑपरेटर तर्क प्रकार मिस्चैच' क्यों मिल रहा है, और मैं इसे ठीक करने के लिए क्या कर सकता हूं?मैं इस `std_logic_vector`

-- 
-- 32-bit counter with enable and async reset 
-- 
architecture synthesis1 of counter_32bit is  
signal nextvalue : std_logic_vector (31 downto 0);  
begin 

    -- 
    -- combo 
    -- 
    nextvalue <= value + 1; -- here 

    -- 
    -- sequential 
    -- 
    ff:process(clk, rst) 
    begin 

    if(rst = '1') then 
     value <= 0; -- and here... 
    elsif(clk'event and (clk ='1')) then 
     if(ena = '1') then 
     value <= nextvalue; 
     end if; 
    end if; 

    end process ff;  

end synthesis1; 

धन्यवाद

+0

'मूल्य' के प्रारंभिकरण के लिए, या तो' to_stdlogicvector (bit_vector '(X "0")) या केवल' एक्स "0" 'अगर सिम्युलेटर पर -v93 स्विच फिसल गया है। – Marty

उत्तर

24

आप std_logic को नहीं बढ़ाया जा सकता है सीधे, आप numeric_std पैकेज का उपयोग करने के लिए std_logic_vectorunsigned और परिणाम वापस करने के लिए इसे बदलना होगा।

use ieee.numeric_std.all 
... 
nextvalue <= std_logic_vector(unsigned(value) + 1); 

उदाहरण के लिए How Do Perform STD_LOGIC_VECTOR Addition Using IEEE.NUMERIC_STD देखें।

+0

धन्यवाद! यह वीएचडीएल सामान बहुत उग्र है ... – Marty

+3

वास्तव में यह उबाऊ नहीं है, वास्तव में यह बहुत स्पष्ट है। 'std_logic_vector' बिट्स की एक सरणी है, इसलिए इसका कोई संख्यात्मक मूल्य नहीं है। वीएचडीएल -2008 में 'IEEE.Numeric_Std_Unsigned' और 'IEEE.Numeric_Std_Signed' नामक दो पैकेज हैं जो आपको सीधे' std_logic_vector' पर अंकगणित करने देंगे। मुझे यकीन नहीं है कि मुझे लगता है कि यह एक अच्छी बात है क्योंकि वीएचडीएल के मजबूत पहलुओं में से एक स्पष्टीकरण है। लेकिन कम से कम यह वहां है यदि आप इसे Verilog शैली में करना चाहते हैं। – trondd

+0

ध्यान दें कि वीएचडीएल -2008 केवल IEEE.numeric_std_unsigned जोड़ता है। –

3

एक और जिस तरह से आप लिख सकते हैं इस मामले में '+' ओवरलोड है:

function "+" (a : std_logic_vector; b : integer) return std_logic_vector is 
    variable result : unsigned(a'range); 
begin 
    result := unsigned(a) + 1 ; 
    return std_logic_vector(result) ; 
end function ; 

एक पैकेज बना सकते हैं और है कि पैकेज में इस समारोह में शामिल है और इस चाल करना होगा। एक और बात में IEI numeric_std पैकेज शामिल है क्योंकि इसमें रूपांतरण फ़ंक्शन शामिल हैं।

1

जो पहले से ही दिए गए उत्तरों के अलावा, आप को unsigned डेटा प्रकार (नीचे) के रूप में परिभाषित करते हुए कोड को फिर से लिख सकते हैं। काउंटर को साफ़ करने के लिए nextvalue <= to_unsigned(0, 32); का उपयोग ध्यान दें, और बढ़ते किनारे से ट्रिगर करने के लिए rising_edge(clk) का उपयोग करें।

-- 32-bit counter with enable and async reset 
architecture synthesis1 of counter_32bit is  
    signal nextvalue : unsigned (31 downto 0);  
begin 

    ff:process(clk, rst) 
    begin 

     if(rst = '1') then 
      nextvalue <= to_unsigned(0, 32); -- reset the count 
     elsif rising_edge(clk) then 
      if(ena = '1') then 
       nextvalue <= nextvalue + 1; -- increment the count 
      end if; 
     end if; 

    end process ff; 

    -- Concurrent assignment statement 
    value <= std_logic_vector(nextvalue); 

end synthesis1; 

समवर्ती काम का यह रूप मैं क्या किताबों में और ऑनलाइन पाया है से एक काउंटर को अद्यतन करने का पसंदीदा तरीका हो रहा है।

इसके अलावा, अगर आप nextvalue के लिए std_logic_vector प्रकार का उपयोग करने के लिए जारी है, यह साफ़ करने के लिए पसंदीदा तरीका nextvalue <= (others => '0'); बजाय nextvalue <= 0; हो रहा है।

1

संक्षेप में, STD_LOGIC_VECTOR बस बिट्स का वेक्टर है। इसका मतलब यह नहीं है कि आप स्वयं से कुछ भी नहीं कर सकते हैं ताकि आप उम्मीद नहीं कर सकें कि vhdl को अर्थात् यह मानना ​​है कि एक वृद्धि कार्य इस पर काम करेगा। इसे यहां पर हस्ताक्षर किए जाने के बारे में अन्य पोस्टों को चाल करना चाहिए।

0

यह भी काम करेगा:

nextvalue <= value + '1'; 

न बताएं कि क्या आप वास्तव में अच्छी तरह VHDL में निपुण है। निम्न सिंटैक्स IST logicaly सही आप std_logic_arith पैकेज

1

उपयोग कर रहे हैं इस कोड का प्रयास करें:

use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
... 
nextvalue <= value + "1"; 

मेरे मामले में इस समाधान काम करता है!

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