Autore Topic: Contare numero linee attive  (Letto 3070 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Contare numero linee attive
« il: 03 Agosto 2011, 23:50:39 »
Ciao a tutti,

mi chiedevo se esiste un qualche dispositivo elettronico digitale con un certo numero di input(es. 256) e poche linee di output (log2 256 =8 ) in grado di presentare sull'output un numero binario corrispondente al numero di linee in ingresso "attive".

Cioè, se in ingresso avessi solo 2 linee attive (senza alcun ordine particolare), l'output dovrebbe essere 00000010.
Molto probabilmente saprei descriverlo in VHDL (basta un ciclo for?), ma non so come possa essere effettivamente realizzato...
 
(Spero di essermi spiegato bene..)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Contare numero linee attive
« Risposta #1 il: 04 Agosto 2011, 10:02:51 »
Se i bit sono pochi puoi mettere un adeguato numero di full address in cascata.
Se sono molti ti serve un contatore che usa come clock il bit corrente. A sua vilta, il bit lo selezioni usando uno shift register ampio quanto il numero di ingressi da contare. Lo SR viene caricato con un singolo bit che poi verrà fatto scorrere per tutta la sua lunghezza. Le sue uscite vengono usate come enable per altrettanti buffers tri-state e tutte le uscite potranno così essere connesse in parallelo, formando il suddetto "bit corrente".
Se non mi sono spiegato bene ti faccio uno schema
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #2 il: 04 Agosto 2011, 13:54:54 »
Citazione da: "TheKaneB"
Se non mi sono spiegato bene ti faccio uno schema

A grandi linee ho capito (questo cmq vorrebbe dire che tt il procedimeno non è possibile farlo con pochi cicli di clock :-( )
Cmq quando hai tempo (non mi serve subito!) se riesci, uno schema forse mi chiarirebbe meglio le idee...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline Z80Fan

  • Administrator
  • Guru
  • *****
  • Post: 1671
  • Karma: +13/-2
    • Mostra profilo
    • http://z80fan.altervista.org
Re: Contare numero linee attive
« Risposta #3 il: 04 Agosto 2011, 16:05:35 »
Citazione da: "TheKaneB"
Se i bit sono pochi puoi mettere un adeguato numero di full address in cascata.
Intendi dire full adder?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Contare numero linee attive
« Risposta #4 il: 04 Agosto 2011, 16:32:16 »
chiaro... l'autocomplete di android ha deciso "address" e chi sono io per correggerlo!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Contare numero linee attive
« Risposta #5 il: 04 Agosto 2011, 18:49:37 »
Citazione da: "TheKaneB"
chiaro... l'autocomplete di android ha deciso "address" e chi sono io per correggerlo!
:lol:
Anche a me ogni tanto mi fa qualche scherzetto
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #6 il: 06 Agosto 2011, 02:12:31 »
Ecco il listato VHDL con 4 linee di ingresso e 2 bit di uscita (il range della variabile VAR è sovradimensionato)

Codice: [Seleziona]
architecture behv of Line_Counter is
begin  

    process(INPUT)
VARIABLE var : INTEGER RANGE 0 TO 255;
    begin
    var := 0;
    FOR x IN 0 TO 3 LOOP
IF INPUT(x) = '1' THEN
var := var + 1;
END IF;
     END LOOP;
 
  OUTPUT <= std_logic_vector(to_unsigned(var,2));

    end process;

end behv;

Il mio dubbio ads è questo: in quanti cicli di clock eseguirà il tutto? Ad intuito direi che il for richiede un colpo di clock per ogni ciclo..ma è così?
(scusate, sono davvero alle primissime armi con VHDL...)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Contare numero linee attive
« Risposta #7 il: 06 Agosto 2011, 04:43:01 »
Citazione da: "clros"
Ecco il listato VHDL con 4 linee di ingresso e 2 bit di uscita (il range della variabile VAR è sovradimensionato)

Codice: [Seleziona]
architecture behv of Line_Counter is
begin  

    process(INPUT)
VARIABLE var : INTEGER RANGE 0 TO 255;
    begin
    var := 0;
    FOR x IN 0 TO 3 LOOP
IF INPUT(x) = '1' THEN
var := var + 1;
END IF;
     END LOOP;
 
  OUTPUT <= std_logic_vector(to_unsigned(var,2));

    end process;

end behv;

Il mio dubbio ads è questo: in quanti cicli di clock eseguirà il tutto? Ad intuito direi che il for richiede un colpo di clock per ogni ciclo..ma è così?
(scusate, sono davvero alle primissime armi con VHDL...)

Hai usato una descrizione "funzionale", quindi non saprai a priori come verrà sintetizzato.

In base ai constraint impostati, potrebbe sintetizzarti un sistema sequenziale (una somma per clock) oppure un sistema combinatorio  molto veloce.
Per avere il controllo sul tipo di implementazione devi usare del codice che descriva non la funzione complessiva, ma tutti i vari sottopassaggi (consigliato se vuoi risparmiare elementi logici).
Puoi anche descrivere il blocco tramite Schematic Capture, disegnando direttamente la netlist invece di scrivere il codice.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #8 il: 06 Agosto 2011, 09:24:45 »
Certo, dovrei scendere ad una descrizione a basso livello e strutturale (RTL?) del circuito. Ma essendo un "informatico" mi riesce molto più semplice descrivere il comportamento! :P
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #9 il: 06 Agosto 2011, 13:07:25 »
Usare una LUT, invece?

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Contare numero linee attive
« Risposta #10 il: 06 Agosto 2011, 13:24:50 »
Citazione da: "cdimauro"
Usare una LUT, invece?

L'FPGA non è altro che un array di LUTs, quindi ci pensa il sintetizzatore a trasformare quel codice in un paio di LUTs in cascata. Dipende sempre dai constraints temporali e di elementi logici.

Per assurdo, se volessi sommare 50 pin, ti servirebbe una LUT da 2^50 parole di 6 bit ciascuna, non credo sia roba economica da infilare in un FPGA di fascia bassa, ma occorre sintetizzare una struttura sequenziale per risparmiare logica :-)
In tal caso le LUT dell'FPGA verrebbero organizzate per formare porte NAND e FlipFlop, risparmiando alcune decine di ordini di grandezza.

Mi viene in mente una possibile ottimizzazione:

Separare i pin in blocchi da 4, usando tante piccole LUTs per le somme parziali, poi mettere in cascata dei sommatori a 2 bit, 4 bit, 8 bit, ecc... fino a raggiungere l'ampiezza di parola / conteggio di pin necessari.

Anche di questo dovrei fare uno schema per essere più chiaro...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #11 il: 06 Agosto 2011, 13:31:23 »
E' proprio a quello che pensavo. LUT che calcolano le somme parziali, fino ad arrivare al risultato finale.

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #12 il: 06 Agosto 2011, 13:56:25 »
Citazione da: "TheKaneB"

Anche di questo dovrei fare uno schema per essere più chiaro...
Oh..yes!
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Contare numero linee attive
« Risposta #13 il: 06 Agosto 2011, 14:35:57 »
Ho appena aumentato nel mio sorgente il numero di ingressi (256) e di uscite (8), ma compliando non ho notato un aumento dei LE usati (2 prima e 2 sono adesso). E' "normale"? eppure ads il circuito sintetizzato dovrebbe avere più componenti...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Contare numero linee attive
« Risposta #14 il: 06 Agosto 2011, 14:40:25 »
Citazione da: "clros"
Ho appena aumentato nel mio sorgente il numero di ingressi (256) e di uscite (8), ma compliando non ho notato un aumento dei LE usati (2 prima e 2 sono adesso). E' "normale"? eppure ads il circuito sintetizzato dovrebbe avere più componenti...

Hai associato i 256 ingressi con i pin dell'FPGA o sono segnali interni? L'optimizer zappa via tutta quella logica che non influenza nessuna uscita e non dipende da nessun ingresso.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: