@bertocar: ho capito. Ti espongo la mia idea, e vediamo cosa ne pensi.
Riguardo alla suddivisione della piattaforma in 3 dispositivi / FPGA. Darei un nome a tutti e tre, in modo da identificarli: CPU, Jay = Memory controller + Arbitro DMA + Bus verso gli altri 2 dispositivi + Video + Copper + Blitter, Mitchy (il cane di Jay Miner) = tutto il resto.
Jay sarebbe, quindi, il componente più importante, perché s'interfaccia direttamente con la memoria e ne funge da "master" per l'accesso. Gli altri dispositivi s'interfacciano con lui tramite un bus (vedremo se condiviso oppure no).
Mitchy è di minore importanza perché si occupa di componenti del sistema che non richiedono un'elevata banda; tutt'altro.
Per cercare di massimizzare l'uso delle linee di I/O, ti butto un'idea, e mi dirai cosa ne pensi. Non credo serva un address bus, e quindi le linee a esso dedicate si impiegherebbero per il trasporto dei dati.
Questo perché non credo che in un ciclo di clock si possa specificare un indirizzo e leggere o scrivere un dato allo stesso tempo. Credo che dopo aver specificato un indirizzo sia necessario almeno un ciclo di clock per poter cominciare a leggere dati o inviarli.
Quindi nel primo ciclo di clock si impiegheranno le linee di I/O per specificare sia l'indirizzo che eventuali altri dati importanti di controllo per l'operazione (ad esempio quante linee di burst leggere, come multiplo del numero di burst che la memoria supporta).
A partire dal ciclo successivo si leggeranno o scriveranno i dati a blocchi di burst, come specificato prima. Un blocco di burst assume significato diverso a seconda del tipo di memoria impiegata: 1 dato a 32/64 bit per SDRAM e DDR (che possono leggere o scrivere singole celle di memoria), 4 dati a 32/64 bit per le DDR2 (che funzionano a burst di 4 dati per volta). Quindi se il dispositivo richiedesse 2 blocchi di burst, potremmo avere 2 letture o scritture per SDRAM/DDR, mentre 8 per DDR2.
In questo modo per l'accesso alla memoria potremmo avere bisogno di 64 linee di I/O per i dati (e l'indirizzo) + qualche altra linea di controllo dell'operazione.
Per connettere CPU e Mitchy si potrebbe procedere allo stesso modo, ma riservando soltanto 32 bit di I/O per i dati + qualche altra linea di controllo dell'operazione.
La CPU non richiede una banda elevatissima per lavorare, per cui potrebbe utilizzare al più metà della banda a disposizione per tutta la memoria, che è un valore accettabilissimo.
Mitchy ne richiede di gran lunga meno, quindi va benissimo così; eventualmente si potrebbe pensare di impiegare un "mini-bus" a 8 bit solo per Mitchy, in modo da avere sia la CPU che Mitchy con 2 bus dedicati e indipendenti, che quindi non richiedono logica di arbitraggio (sono esclusivi).
Non so se sia fattibile un'idea del genere. La suddivisione l'ho pensata per cercare di scaricare su Mitchy la maggior parte delle linee di I/O per le periferiche di minore importanza di cui si dovrà occupare. In questo modo Jay potrà utilizzare le sue linee di I/O quasi esclusivamente per fungere da memory controller e arbiter, a cui si aggiungono le poche linee richieste per la VGA e il DVI.
Spero di non aver sparato troppe boiate.
![Ridere :ride:](./images/smilies/icon_mrgreen.gif)
EDIT. Dimenticavo: per Jay non serve un numero esagerato di LE. Quindi 16K LE vanno benissimo. Per Mitchy credo ne serviranno anche meno; forse 5K LE potrebbero bastare.