2012-11-27 5 views
14

Sto avendo difficoltà a fare qualcosa di simile aordine po 'inversa su VHDL

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

Quando compilo con ghdl, ho un errore di ordine. L'unico modo che ho trovato per far funzionare il mio circuito è il seguente:

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; 

Suggerimenti? Grazie in anticipo

+0

Anche se non aiuterà per l'operazione bit-inverso, la parola chiave gamma discendente è 'downto' (cioè non' to' verso il basso). – wap26

+0

scusa per l'errore, intendo quello. b (da 0 a 7) <= a (7 downto 0) – titockmente

risposta

22

Questo non è consentito - VHDL è così fortemente digitato che se si desidera invertire gli ordini di bit, è necessario farlo esplicitamente.

La soluzione standard è quella di utilizzare una funzione (non ho scritto questo - 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

La domanda chiede come affrontare specificamente con B (0-7) < = a (7 verso il basso 0). Non sono a conoscenza dei motivi, ma a volte questo compito funziona per me (assegna le cose da sinistra a destra indipendentemente dall'affettamento) ea volte questo compito genera errori del compilatore (affinamento non corrispondente o qualcosa del genere).

Fortunatamente non è necessario utilizzare una funzione per gestire l'affinamento non corrispondente. Se stai ricevendo errori del compilatore per questo problema specifico, puoi utilizzare un ciclo di generazione per assegnare a a b.

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; 

Lo fa praticamente la stessa assegnazione srotolato come nel tuo esempio, proprio stretto e scale-grado.

Ho anche usato questo modello quando ho sbagliato l'affettatura sul lato destro del compito. Per esempio:

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; 

che è equivalente a:

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

Per impostazione predefinita, dati i vettori a/b definiti sopra e l'istruzione "b <= a" (o l'equivalente in una MAP PORT), VHDL assegnerà i bit del vettore in ordine da sinistra a destra, indipendentemente dalla numerazione.Ciò preserva MSB == MSB quando si utilizza una combinazione di ordinamento di bit big-endian e little-endian. (es .: b (7) <= a (0) ecc.) Si ottiene l'errore se si tenta di usare "a (x giù a y)" o b (xey) "- cioè se si tenta di invertire l'ordine dichiarata di un segnale specifico. Se intenzionalmente desidera mappare i bit in ordine allora avete bisogno di utilizzare una generare o di una funzione, come mostrato in queste risposte. – Miral

4

Ci sono diverse soluzioni per questo problema. Una possibilità è la seguente:

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 downto 0) < = IN_PUT (0 DOWNTO 7)

0

Suggerimenti?

Perché il vostro esempio specifica lunghezza fissa:

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; 

La teoria è che questo dovrebbe essere meno overhead di una chiamata di funzione o di istruzione ciclica.

+1

Se che esce del sintetizzatore diverso per un ciclo o una funzione chiamo, mi piacerebbe essere la registrazione di un bug! –

+0

Prova di simulazione. – user1155120

+0

Ahh, OK, vedo quello che vuoi dire! –

2

Davvero invertendo:

for i in 0 to intermediate_data'left loop 

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

end loop;