2013-01-01 9 views
5

Potresti dirmi se esiste un modo migliore per scrivere un codificatore di priorità in VHDL piuttosto che utilizzare le istruzioni if-else? Voglio dire, ho questo codice e funziona, ma potrebbe essere scritto più breve? Switch è un file std_logic_vector.breve modo per scrivere l'encoder di priorità VHDL

Grazie per il vostro aiuto!

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 

risposta

8

All'interno di un processo, è possibile utilizzare un ciclo.

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; 

Si noti che se sono impostati più interruttori, la variabile viene assegnata più volte. Tuttavia, poiché il ciclo viene eseguito in ordine crescente, vince l'ultimo (più alto) compito.

Incidentalmente questo processo, come il vostro, è combinatorio, ma ho rimosso i segnali non necessari dalla lista di sensibilità. Sarebbe meglio renderlo sincrono;

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