Page 1 of 1

Come fare "or" di più bit di un std_logic_vector?

PostPosted: 25 Oct 2012, 13:38
by Altero
Salve,
Io sono relativamente nuovo con il VHDL
Sto cercando un comando per realizzare una operazione booleana per effettuare l'OR di un std_logic_vector in modo compatto

esempio:
---------------------------------------------------
signal a : std_logic vector (3 downto 0);
signal b : std_logic;

b <= a(0) or a(1) or a(2) or a(3);
---------------------------------------------------
questa soluzione lavora bene con 4 bit ma con molti bit non è il massimo
qualcuno mi può aiutare?

Scusate la mia ignoranza, magari vi metterete a ridere.... ma sono ancora proprio a zero.
grazie tante

Re: Come fare "or" di più bit di un std_logic_vector?

PostPosted: 25 Oct 2012, 14:13
by flz47655
In pratica facendo l'OR ti tutti i bit controlli se c'è almeno 1 un bit uguale ad 1

Io scriverei così:
Code: Select all
b <= '1' when a > "0000" else '0';


E' più chiaro quello che vuoi fare e la leggibilità è migliore (considerazioni soggettive).
Se provi a vedere la netlist generata (RTL viewer) hai sintetizzano un semplice blocco "less than" che occupa un solo LE (Logic Element), alla fine viene comunque sintetizzata una porta OR a quattro ingressi come nell'altro caso, puoi verificarlo con Technology Map Viewer

Ciao

Re: Come fare "or" di più bit di un std_logic_vector?

PostPosted: 25 Oct 2012, 17:25
by Altero
-grazie flz questa potrebbe essere una strada per l'or e per altro.

-ma io vorrei qualcosa di meccanizzato tipo loop o altro per intenderci anche perchè la funzione la dovrei estendere a tutte le funzioni booleane e renderla parametrizzata.

-quindi or, and, xor con nbit (variabile).

-qualche altro consiglio?

Re: Come fare "or" di più bit di un std_logic_vector?

PostPosted: 25 Oct 2012, 17:30
by flz47655
Puoi usare il costrutto FOR assieme ai generic

Ciao

Re: Come fare "or" di più bit di un std_logic_vector?

PostPosted: 25 Oct 2012, 17:42
by deluca
ciao altero,
utilizzando il supporto VHDL2008 per Quartus potresti tranquillamente scrivere:

b<= OR a;


oppure con: std_logic_misc.vhd

puoi sfruttare le seguenti funzioni:

function AND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
function NAND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
function OR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
function NOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
function XOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
function XNOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;

function AND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
function NAND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
function OR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
function NOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
function XOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
function XNOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;

in particolare la funzione or_reduce è così realizzata:

function OR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
variable result: STD_LOGIC;

attribute SYNTHESIS_RETURN of result:variable is "REDUCE_OR" ;
begin
result := '0';
for i in ARG'range loop
result := result or ARG(i);
end loop;
return result;
end;