2012-12-10 13 views
5

द्वारा एक std_logic_vector मैं इस तरह एक std_logic_vector है।कैसे सूचकांक करने के लिए गणन

constant CLK_SIG:integer := 0; 
constant EN_SIG:integer := 1; 
constant FOO_SIG:integer := 2; 
constant BAR_SIG:integer := 3; 
constant BAZ_SIG:integer := 4; 

विचार वेक्टर को इंडेक्स करने के लिए इनका उपयोग करना है।

cntrl_signals <= (CLK_SIG=>1,EN_SIG=>1,others=>0); 

मेरा प्रश्न अगर वहाँ (सी में एक enum की तरह) अनुक्रमित घोषित करने का एक अच्छा आशुलिपि तरीका है?

उत्तर

11

अच्छी तरह से आप गणनाओं का उपयोग कर सकते हैं, सबसे अच्छा तरीका std_logic का अपना वेक्टर घोषित करना होगा, जो पूर्णांक के बजाय गणना द्वारा अनुक्रमित किया गया है।

type Control_Signals is record 
    Clk : std_logic, 
    En : std_logic, 
    Foo : std_logic, 
    Bar : std_logic, 
    Baz : std_logic 
end record; 

अधिक जानकारी के लिए संपादन, टिप्पणी निम्नलिखित:

std_logic_vector (और सामान्य में VHDL के प्रकार प्रणाली) का ख़याल से बाहर उपयोग कर रहा है VHDL

लेकिन शायद बेहतर एक वेक्टर के बजाय एक रिकार्ड होगा पीछे ...

यदि यह शीर्ष स्तर की इकाई है, तो std_logic_vector पोर्ट आपको शीर्ष स्तर testbench में अपने संश्लेषित डिज़ाइन के लिए पोस्ट-संश्लेषण नेटलिस्ट को प्रतिस्थापित करने की अनुमति देता है। या आपको antdated कोडिंग शैली दिशानिर्देशों का पालन करना पड़ सकता है जो std_logic_vector बंदरगाहों पर जोर देते हैं।

लेकिन किसी अन्य परिस्थिति में मैं एक पैकेज में रिकॉर्ड घोषित करता हूं, पूरे पैकेज में उस पैकेज का उपयोग करता हूं, और रिकॉर्ड प्रकार के बंदरगाहों का उपयोग करता हूं। जब आपको वास्तव में std_logic_vectors की आवश्यकता होती है तो पैकेज में to_slv और to_control_sigs फ़ंक्शन शामिल होना चाहिए (दुर्लभ, यदि आपको यह सही लगता है) अवसरों के लिए।

ही enumerations के साथ लागू होता है:

type Controls is (Clk, En, Foo, Bar, Baz); 
type Control_Signals is array(Controls) of std_logic; 
My_Bus_Ctrl : Control_Signals := (Clk => '1', En => '1', others => '0'); 
My_External_SLV_Port <= std_logic_vector(My_Bus_Ctrl); 

और बेशक, enumerations में थोड़ा और अधिक सी में ज्यादा शक्तिशाली हैं; साथ ही सरणी इंडेक्स प्रकारों के रूप में उनका उपयोग करके, आप उन पर लूप कर सकते हैं। जब भी आप गणना अद्यतन करते हैं, जो आपके लूप को लाइन में रखता है!

रिकॉर्ड्स या सरणी दोनों कार्यों द्वारा अनुक्रमित अनुक्रमित; मैं ऑब्जेक्ट उन्मुख अभ्यास के साथ रिकॉर्ड को थोड़ा क्लीनर और अधिक पसंद करता हूं।

किसी भी मामले में यदि आप इकाई बंदरगाहों के लिए इसका उपयोग करते हैं तो यह अधिक उपयोगी हो जाता है। आउटगोइंग बस सिग्नल (पता और डेटा सहित) और दूसरे आने वाले सिग्नल के लिए एक रिकॉर्ड (या सरणी!) घोषित करें, क्योंकि आप एक ही बंदरगाह में दिशानिर्देशों को मिश्रण नहीं कर सकते ... (इन दिनों एफपीजीए में कोई द्विपक्षीय सिग्नल नहीं हैं, इसलिए तीसरे बंदरगाह की कोई आवश्यकता नहीं है)

अब आपका डिज़ाइन बस संरचना में परिवर्तनों के विरुद्ध संरक्षित है; पता चौड़ाई बदलना या एक इंटरप्ट सिग्नल जोड़ना केवल रिकॉर्ड घोषणा और किसी भी वास्तविक उपयोगकर्ता को बदलता है; पूरे पदानुक्रम में नया सिग्नल जोड़ने की जरूरत नहीं है ...

+0

पहला सुझाव कैसा दिखता है? साथ ही, cntrl_signals को std_logic_vector होने की आवश्यकता है क्योंकि यह इकाई बंदरगाह घोषणा में है और बाहर के लिए दृश्यमान है। – c0m4

+3

+1: 'std_logic_vector (और सामान्य रूप से वीएचडीएल की प्रकार प्रणाली) का आकस्मिक उपयोग वीएचडीएल को वापस रख रहा है ... ' –

+0

वाह, अच्छी जानकारी! धन्यवाद! – c0m4

1

ब्रायन सर्वश्रेष्ठ उत्तर है, लेकिन जानकारी का एक और बिट:

आप इस तरह एक गणना बना सकते हैं: यदि आप एक signal या उस प्रकार के variable है

type some_type is (clk, en, foo, bar, baz); 

, तो आप उपयोग कर सकते हैं 'pos विशेषता इसे वापस कन्वर्ट करने के लिए एक संख्या में:

variable v : some_type := foo; 

v'pos पूर्णांक वापस आ जाएगी 2

+2

काफी सही, जवाब लंबा हो रहा था! लेकिन 'pos और उल्टा, some_type'val (2) जो foo लौटाता है बहुत उपयोगी हो सकता है। –

+0

क्या होता है यदि यह एक-गर्म के रूप में संश्लेषित करता है, तो क्या आपको तत्व या मूल्य की संख्या मिल जाएगी? यानी अगर यह एक गर्म है तो क्या बाज 4 या 16 देता है? –

+0

'pos हमेशा आपको टाइप सरणी (VHDL-2008 की धारा 16.2.2) में स्थिति देता है। यदि सिंथेसाइज़र उन मानों को एक अलग प्रतिनिधित्व के लिए मानचित्रित करता है, तो जब आप 'pos' के मान के लिए पूछते हैं तो इसे फिर से परिवर्तित करने के लिए तर्क प्रदान करना होगा। –

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