2012-11-27 4 views
14

पर मैं मुसीबत की तरहरिवर्स बिट क्रम जब मैं ghdl साथ यह संकलन VHDL

b(0 to 7) <= a(7 downto 0) 

कुछ कर रही है, इसलिए मैं एक आदेश त्रुटि है।

library ieee; 
use ieee.std_logic_1164.all; 
entity reverser is 
    port(
     a: in std_logic_vector(7 downto 0); 
     y: out std_logic_vector(7 downto 0); 
     rev: in std_logic 
     ); 
end reverser; 

architecture rtl of reverser is 
    signal b: std_logic_vector (7 downto 0); 

begin 

    b(7) <= a(0); 
    b(6) <= a(1); 
    b(5) <= a(2); 
    b(4) <= a(3); 
    b(3) <= a(4); 
    b(2) <= a(5); 
    b(1) <= a(6); 
    b(0) <= a(7); 

    y <= b when rev = '1' else a; 

end rtl; 

सुझाव: एक ही रास्ता मैं अपने सर्किट काम करने के लिए मिल गया है निम्नलिखित है? अग्रिम धन्यवाद

+0

हालांकि यह थोड़ा-रिवर्स ऑपरेशन के लिए मदद नहीं करेगा, उतरते रेंज कीवर्ड 'downto' है (यानी नहीं' नीचे to')। – wap26

+0

गलती के लिए खेद है कि मेरा मतलब क्या था। बी (0 से 7) <= ए (7 से 0 0) – titockmente

उत्तर

22

इसकी अनुमति नहीं है - वीएचडीएल इतनी दृढ़ता से टाइप किया गया है कि यदि आप बिट ऑर्डर को रिवर्स करना चाहते हैं, तो आपको इसे स्पष्ट रूप से करना होगा।

मानक समाधान एक समारोह का उपयोग करने के लिए है (मैं इस बारे में नहीं किया - Jonathan Bromley did):

function reverse_any_vector (a: in std_logic_vector) 
return std_logic_vector is 
    variable result: std_logic_vector(a'RANGE); 
    alias aa: std_logic_vector(a'REVERSE_RANGE) is a; 
begin 
    for i in aa'RANGE loop 
    result(i) := aa(i); 
    end loop; 
    return result; 
end; -- function reverse_any_vector 
4

सवाल नीचे ख (0 से 7) < एक = (7 के साथ विशेष रूप से निपटने के लिए कैसे पूछता है 0)। मुझे कारणों से पता नहीं है, लेकिन कभी-कभी यह असाइनमेंट मेरे लिए काम करता है (स्लाइसिंग के बावजूद बाएं से दाएं चीजें निर्दिष्ट करता है) और कभी-कभी यह असाइनमेंट कंपाइलर त्रुटियों को फेंकता है (बेमेल स्लाइसिंग या कुछ)।

सौभाग्य से आपको बेमेल स्लाइसिंग को संभालने के लिए किसी फ़ंक्शन का उपयोग करने की आवश्यकता नहीं है। यदि आपको इस विशिष्ट समस्या के लिए कंपाइलर त्रुटियां मिल रही हैं तो आप बी को असाइन करने के लिए जेनरेट लूप का उपयोग कर सकते हैं।

for i in a'range generate 
    b(i) <= a(i) 
    --when i is 0, you assign a's right-most bit to b's left-most bit 
end generate; 

यह अपने उदाहरण के रूप में मूलतः एक ही unrolled काम करता है, सिर्फ तंग और बड़े पैमाने करने योग्य।

मैंने इस पैटर्न का भी उपयोग किया है जब मेरे पास असाइनमेंट के दायीं तरफ झुका हुआ टुकड़ा है। उदाहरण के लिए:

signal a : std_logic_vector(0 to 7); 
signal b : std_logic_vector(7 downto 0); 
signal c : std_logic_vector(0 to 7); 

... 

for i in a'range generate 
    c(i) <= a(i) xor b(i); 
end generate; 

बराबर है कौन सा करने के लिए:

c(0) <= a(0) xor b(0); 
c(1) <= a(1) xor b(1); 
c(2) <= a(2) xor b(2); 
c(3) <= a(3) xor b(3); 
c(4) <= a(4) xor b(4); 
c(5) <= a(5) xor b(5); 
c(6) <= a(6) xor b(6); 
c(7) <= a(7) xor b(7); 
+1

डिफ़ॉल्ट रूप से, ऊपर दिए गए ए/बी वैक्टर जिन्हें आपने परिभाषित किया है और "बी <= ए" (या पोर्ट एमएपी में समकक्ष), VHDL नंबरिंग के बावजूद बाएं से दाएं क्रम में वेक्टर बिट्स को असाइन करेगा।यह बड़े-एंडियन और छोटे-एंडियन बिट ऑर्डरिंग के मिश्रण का उपयोग करते समय एमएसबी == एमएसबी को संरक्षित करता है। (यानी बी (7) <= ए (0) इत्यादि) यदि आप "ए (एक्स डाउन वाई)" या बी (एक्स से वाई) "का उपयोग करने का प्रयास करते हैं तो आपको त्रुटि मिलती है - यानी यदि आप उलटा करने का प्रयास करते हैं एक विशिष्ट संकेत के घोषित आदेश। आप जानबूझकर बिट्स मैप करने के लिए चाहते हैं, तो बाहर आदेश की तो आप एक उत्पन्न या समारोह के रूप में इन उत्तरों में दिखाया गया है उपयोग करने के लिए की जरूरत है। – Miral

4

इस समस्या के लिए कई समाधान कर रहे हैं।

gen: for i in 0 to 7 generate 
    y(i) <= a(i) when rev='0' else a(7-i); 
end generate; 
-6

OUT_PUT (7 0 downto) < = IN_PUT (0 downto 7)

0

सुझाव: एक संभावना यह पीछा कर रहा है?

अपने उदाहरण निश्चित लंबाई निर्दिष्ट करता है क्योंकि:

architecture rtl of reverser is 
    -- signal b: std_logic_vector (7 downto 0); 

begin 

    -- b(7) <= a(0); 
    -- b(6) <= a(1); 
    -- b(5) <= a(2); 
    -- b(4) <= a(3); 
    -- b(3) <= a(4); 
    -- b(2) <= a(5); 
    -- b(1) <= a(6); 
    -- b(0) <= a(7); 

    -- y <= b when rev = '1' else a; 

    y <= a(0)&a(1)&a(2)&a(3)&a(4)&a(5)&a(6)&a(7) when rev = '1' else a; 

end rtl; 

सिद्धांत जा रहा है कि यह एक समारोह कॉल या पाश बयान की तुलना में कम भूमि के ऊपर होना चाहिए।

+1

हैं कि सिंथेसाइज़र एक पाश या एक समारोह के लिए किसी भी अलग से बाहर आता है कॉल करें, मैं एक बग लॉगिंग कर रहा हूं! –

+0

सिमुलेशन का प्रयास करें। – user1155120

+0

आह, ठीक है, मैं देखता हूं कि आपका क्या मतलब है! –

2

सच inverting:

for i in 0 to intermediate_data'left loop 

    inverted_vector(i) <= intermediate_data(intermediate_data'left - i); 

end loop; 
संबंधित मुद्दे