Newsgroup: it.hobby.elettronica.digitale
Titolo: VHDL-FPGA

Salve,
sono alle prese con uno spinoso problema riguardante la programmazione di un
FPGA in VHDL...
dovrei cioeด tradurre il seguente programma in uno schematico che lo
rappresenti...avete qualche idea?
Se sono stato troppo ermetico ditelo :)
Grazie!
il programma eด... (a[x][y] eด il generico elemento di una matrice nXn)
for(i=0;i<=n-1;i++)
{
    for(j=i;j<=n-1;j++)
    {
          for (sum=a[i][j] , k=i-1 ; k>=0;k--) sum -= a[i][k]*a[j][k];
           if (i==j) {a[i][i]=sqrt(sum) ; } else a[j][i]=sum/a[i][i];
    }
}
grazie ancora.
Luigi Lescarini

Luigi Lescarini
I dati su cui devi lavorare cosa sono? Interi? Floating pont?
Che precisione? Che velocita' vuoi ottenere? n che valori
puo' assumere? Da dove arrivano i dati? Dove devono
andare i risultati?
Sono tutti elementi che bisogna conoscere ancora prima
di abbozzare qualunque idea su come realizzare il circuito.
Lavorare in hardware non e' come scrivere software.
Se in un programma cambi la dimensione di una matrice
o la precisione, cambiera' un po' la memoria richiesta
e la velocita' di esecuzione. In hardware, visto che *DEVI*
ottimizzare sempre tutto al massimo, anche piccole
modifiche possono rivoluzionare completamente il progetto
o portare i costi da 20 mila lire a 20 milioni.
Per esempio, se n fosse piccolo, diciamo 3 o 4 potresti
pensare ad un circuito che in un solo clock ti calcoli tutta la
matrice. Se n fosse poco piu' grande cambierebbe tutto.
Per curiosita', a cosa serve questo circuito? O e' solo
un esercizio?
Ciao
Luigi

 andare i risultati?
Allora, devo realizzare un codice VHDL in grado di effettuare
una decomposizione su particolari matrici, chiamata
Cholesky decomposition.
Come avrai intuito ho realizzato il codice C che simula questa
decomposizione.
Il programma e´ in grado di trattare matrici complesse di dimensioni
qualunque (memoria permettendo),
per ora il mio "sogno" e´quello di far fare la stessa cosa all´FPGA con una
matrice reale 4X4.
Gli elementi della matrice sono interi rappresentati da signed a 16
bit(complemento a due).
Questi valori sono memorizzati in una Dual Port Memory e possono essere
prelevati considerando che la
DPM immagazzina questi ultimi come in un vettore:
Esempio di matrice 2X2 quattro valori. Posizionalmente la mappatura e´
                (0,0)                    (0,1)                    (1,0)
(1,1)
(0101010101010101,111111111111111,000000000000000,1100110011001100)....
questi dati adesso devono essere presi """OPPORTUNAMENTE""" per effettuare
quel ciclo nidificato!
e qui sono dolori...mi sembra abbastanza difficile....
la vaga idea che mi sono fatto e´che naturalmente ci dovranno essere un
moltiplicatore e un accumulatore,
ma il problema e´passar loro i giusti valori... (senza contare che c´é anche
una sqrt di mezzo...)
una volta che nel ciclo e´ stato calcolato il valore per l´elemento a[i][i]
(oppure a[j][i]) questo dovra´ essere immagazzinato
nella stessa memoria usata per prelevare i dati (ma questo non mi sembra un
problema...)
Spero di averti chiarito qualche dubbio, perche´ io non me li sono chiariti!
Grazie per l´attenzione..
ciao
Luigi.

...


Il problema non e' semplicissimo, ma nemmeno impossibile.
Resta da sapere che velocita' vuoi ottenere, ma immagino
che sia molto alta, altrimenti ti converebbe usare una
normale cpu.
Viste le dimensioni ridotte della matrice e i dati interi a 16 bit,
potresti espandere tutte le iterazioni e fare tutto in un solo
ciclo di clock, dato che servono 40 moltiplicatori, 10 divisori e 10
radici quadrate, se ho fatto bene i conti. Sicuramente
dovresti usare un FPGA molto grosso, ma avresti tempi
dell'ordine delle centiania di nS.
Comunque ti consiglio di provare a chiedere qualche consiglio
su comp.arch.fpga oppure su comp.lang.vhdl dove ci sono
personaggi che mangiano questi problemi come noccioline!
Ciao
Luigi

Grazie delle info!
A presto!
Luigi