Vai al contenuto

Creare una retta in vhdl


Messaggio consigliato

Ho un problemino che non riesco propio a risolvere.

Mi sto trovando, complice l'università, a dover creare una retta che rimbalza sullo schermo con una fpga.

per chi non lo sapesse, una FPGA (sintetizzando) permette di creare circuiti logici a partire da operazioni di base quali and, or, not e via dicendo. ciò può punzionare sia tramite grafica che tramite programmazione, nella fattispecie noi usiamo vhdl. Si può usare verilog, ci sono compatibilità con tk/tcl, ma siccome il nostro prof al di fuori di due istruzioni di vhdl non sa molto altro, noi aspiranti ing. dobbiamo risolvere il tutto col vhdl.

Sono riuscito a far funzionare la VGA con tutte le mentae di sincronia verticale, orizzontale e via dicendo. ora come ora riesco a gestire in amniera abbastanza indipendente due pixel sullo schermo, e ne sono felice (non perchè sia difficile, quanto perchè so ESATTAMENTE come funziona tutto quello che ho implementato fino ad ora).

Il problema che mi ritrovo adesso, è di dover connettere questi due pixel (o chiamiamoli punti) tramite una linea retta(o similretta, volendo essere precisi) su uno schermo settato 800x600.

Solo che non ho la più pallida idea su come fare una routine che mi calcoli tutti i punti (o pixel) che devono essere dipinti sullo schermo.

NON sono disponibili funzioni goniometriche, in vhdl.

tutto quello che posso usare, a meno di non implementarmi sin e cos, sono addizione e moltiplicazione (ovviamente i reciproci, sottrazione e divisione).

Pensavo di andarmi ad apire una qualche funzione che dati due punti traccia una retta in C#, C++ o pascal, purtroppo non ho trovato niente di utile fino ad ora (vuoi per incompetenza mia, vuoi perchè ho cercato male...)

Qualcuno ha idee, suggerimenti,consigli, righe di codice a disposizione?

:)

Link al commento
Condividi su altri siti


  • Risposte 5
  • Creato
  • Ultima risposta

Principali partecipanti

Principali partecipanti

velocemente, la cosa non e` propriamente banale, per una serie di motivi:

- seno e coseno c'entrano poco, visto che per calcolare l'equazione della retta non servono

- il problema principale e` decidere quali pixel accendere, perche` come criterio non basta "la retta passa per il quadretto" altrimenti avresti una cosa orrenda

- c'e` poi l'aliasing della riga quasi verticale o quasi orizzontale, ma questo forse non ti tange piu` di tanto

non ho mai fatto una cosa del genere, ma andando un po' a brainstorming:

- calcoli il primo e l'ultimo pixel

- calcoli il numero di pixel in mezzo

- calcoli la retta in n punti e vedi in che quadretto sei

non verra` un capolavoro, soprattutto per angolazioni strane, ma dovrebbe fungere.

non mi sembra ci siano operazioni matematiche complesse, in caso ricordo che

sin(x) ~= x - x^3/6

cos(x) ~= 1 - x^2/2

(mi pare)

Link al commento
Condividi su altri siti

velocemente, la cosa non e` propriamente banale, per una serie di motivi:

- seno e coseno c'entrano poco, visto che per calcolare l'equazione della retta non servono

a dire il vero pensavo di utilizzare l'equazione parametrica di una retta, tanto per veder il coefficiente angolare della retta e poi andare ad accendere i pixel in una vartianza abbastranza accettabile.

- calcoli la retta in n punti e vedi in che quadretto sei

[....]

cos(x) ~= 1 - x^2/2

(mi pare)

scrivere 1-|x| ti sembrava tanto brutto? :P

per "la retta in n punti" intendi dire la distanza n tra un pixel e l'altro...

mmmh... sembra fattibile così. tra oggi e domani vedo di abbozzare qualcosa di simil funzionante...

Link al commento
Condividi su altri siti

scrivere 1-|x| ti sembrava tanto brutto? :P
intendevo 1-.5*x^2, e ovviamente vale solo per x piccolo.

per "la retta in n punti" intendi dire la distanza n tra un pixel e l'altro...

mmmh... sembra fattibile così. tra oggi e domani vedo di abbozzare qualcosa di simil funzionante...

bravo, poi ti mando la fattura
Link al commento
Condividi su altri siti

  • 3 settimane dopo...

ho buttato giù solo uno schema a blocchi per il momento.

Non ho ancora avuto tempo di mettermi a smanettare sul codice per svariati motivi, tra i quali (in ordine di importanza)

  • fino ad oggi, proprio voglia zero
  • fino a 5 giorni fa, barcellona e momentanee ferie infra esami
  • al momento, sto studiando i teoremi di algebra lineare che devo darlo a breve. Lo so, sono un fecaloma ad averlo lasciato così indietro e così via.
  • mi manca la schedina della xilinx, che o trafugo dal laboratorio o la compro per averla a casa. Indi per cui, dopo aver testato il lavoro fatto fino ad ora (codec vga e il pixel mobile) provvederò a fare il codice e finire il tutto.

per la cronoaca, non sono riuscito a trasformare con quella pietra il piombo in oro, ma ho trasformato il pentagono in un portatile (grazie alla pietra intendo dire)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente registrato per poter lasciare un commento

Crea un account

Crea un nuovo account e registrati nella nostra comunità. È facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.
 

Accedi ora
×
×
  • Crea nuovo...