2013-01-01 13 views
5

Czy możesz mi powiedzieć, czy istnieje lepszy sposób na napisanie kodera priorytetowego w VHDL, niż użycie instrukcji if-else? Mam na myśli, że mam ten kod i działa, ale czy można go napisać krótszy? Przełącznik to std_logic_vector.Krótka droga do pisania enkodera priorytetowego VHDL

Dzięki za pomoc!

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 

Odpowiedz

8

W ramach procesu można użyć pętli.

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; 

Zauważ, że jeśli kilka przełączniki są ustawione, zmienna jest przypisana wielokrotnie. Jednak ponieważ pętla jest wykonywana w porządku rosnącym, wygrywa ostatnie (najwyższe) zadanie.

Nawiasem mówiąc, ten proces, podobnie jak twój, jest kombinacyjny, ale usunąłem niepotrzebne sygnały z listy czułości. Lepiej uczynić to synchronicznym;

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