2013-01-01 37 views
5

क्या आप मुझे बता सकते हैं कि अगर वीएचडीएल में प्राथमिकता एन्कोडर लिखने का बेहतर तरीका है तो बस-और कथन का उपयोग करने के बजाय? मेरा मतलब है, मुझे यह कोड मिला है और यह काम करता है, लेकिन क्या इसे छोटा लिखा जा सकता है? स्विच एक std_logic_vector है।वीएचडीएल प्राथमिकता एन्कोडर लिखने का संक्षिप्त तरीका

आपकी मदद के लिए धन्यवाद!

shifting : PROCESS(CLK_IN, new_length_ready, switch) 

    VARIABLE highest_switch :  INTEGER RANGE 0 TO 15 := 15; 

BEGIN 

    -- priority encoder, changes the length of the snake track 
    -- (i.e., number of leds for the snake to move) 

    IF switch(15) = '1' THEN 
     highest_switch := 15; 
    ELSIF switch(14) = '1' THEN 
     highest_switch := 14; 
    ELSIF switch(13) = '1' THEN 
     highest_switch := 13; 
    ELSIF switch(12) = '1' THEN 
     highest_switch := 12; 
    ELSIF switch(11) = '1' THEN 
     highest_switch := 11; 
    ELSIF switch(10) = '1' THEN 
     highest_switch := 10; 
    ELSIF switch(9) = '1' THEN 
     highest_switch := 9; 
    ELSIF switch(8) = '1' THEN 
     highest_switch := 8; 
    ELSIF switch(7) = '1' THEN 
     highest_switch := 7; 
    ELSIF switch(6) = '1' THEN 
     highest_switch := 6; 
    ELSIF switch(5) = '1' THEN 
     highest_switch := 5; 
    ELSIF switch(4) = '1' THEN 
     highest_switch := 4; 
    ELSIF switch(3) = '1' THEN 
     highest_switch := 3; 
    ELSIF switch(2) = '1' THEN 
     highest_switch := 2; 
    ELSIF switch(1) = '1' THEN 
     highest_switch := 1; 
    ELSIF switch(0) = '1' THEN 
     highest_switch := 0; 
    ELSE 
     highest_switch := 15; 
    END IF 

उत्तर

8

एक प्रक्रिया के भीतर, आप एक लूप का उपयोग कर सकते हैं।

type Switches is range 0 to 15; 

shifting : PROCESS(switch) 
    VARIABLE highest_switch : Switches := 15; 
begin 
    for i in Switches loop 
     if switch(i) = '1' then 
     highest_switch := i; 
     end if; 
    end loop 
... 
end process; 

ध्यान दें कि यदि कई स्विच सेट हैं, तो चर को कई बार असाइन किया जाता है। हालांकि, लूप को बढ़ते क्रम में निष्पादित किया जाता है, अंतिम (उच्चतम) असाइनमेंट जीतता है।

संयोग से यह प्रक्रिया आपके जैसे संयोजन है, लेकिन मैंने संवेदनशीलता सूची से अनावश्यक संकेत हटा दिए हैं। यह तुल्यकालिक बनाना बेहतर होगा;

shifting : PROCESS(clk) 
begin 
    if rising_edge(clk) then 
     for i in ... 
    end if; 
end process;