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

Sezione dedicata al linguaggio di descrizione hardware per logiche programmabili

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

Postby Altero » 25 Oct 2012, 13:38

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
Altero
 
Posts: 46
Joined: 20 Apr 2012, 09:33

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

Postby flz47655 » 25 Oct 2012, 14:13

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
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

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

Postby Altero » 25 Oct 2012, 17:25

-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?
Altero
 
Posts: 46
Joined: 20 Apr 2012, 09:33

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

Postby flz47655 » 25 Oct 2012, 17:30

Puoi usare il costrutto FOR assieme ai generic

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

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

Postby deluca » 25 Oct 2012, 17:42

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;
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)


Return to VHDL x FPGA

Who is online

Users browsing this forum: No registered users and 10 guests

cron