Forum: FPGA, VHDL & Co. einige Fragen zur Codierung mit VHDL


von G. B. (geri)


Lesenswert?

Hallo zusammen

Ich habe mich nun etwas in VHDL eingelesen. Dabei sind mir ein paar 
Fragen aufgetaucht für die ihr mir vielleicht eine passende Antwort 
geben könnt.

Ich möchte in VHDL einen Prozess definieren in dem eine Gleichung gelöst 
werden soll und entsprechend eine Ausgabe erfolgen soll. Die Fragen 
ergeben sich hieraus:

entity myProc is
PORT {v, a in REAL;
      Stp:Integer);
end myProc;


architecture myProcArch of myProc is

FUNCTION GetDelay(a, b : IN REAL) RETURN REAL IS VARIABLE output : REAL;
BEGIN
  output := a * b;
END GetDelay;

SIGNAL temp:REAL;
SIGNAL c:Real = 0;
SIGNAL u:Integer = 0;
BEGIN
  c <= c+1;
  u <= u+1;
  temp <= v* a * sqrt(GetDelay(c,c)*u);
  WAIT (RESET = '1') FOR temp ns;
  Stp <= u;
END;

1.) wie kann man in VHDL elegant eine Wurzelberechnung durchführen? Gibt 
es da Libraries
2.) Ich möchte gerne mit Hilfe einer SPI-Schnittstelle myProc die 
Parameter a und b übergeben. Die Hardware für eine SPI lässt sich ja mit 
seriellen Schieberegister realisieren. Was muss man aber tun damit 
myProc davon etwas mitbekommt?

Beste Grüsse und vielen Dank für Eure Tipps

Geri

von +++ (Gast)


Lesenswert?

Für aufwendige Berechnungen, wie du sie anstrebst, sollte man besser 
einen Mikro-Prozessor/Controller nehmen. Wurzelziehen ist meines Wissens 
nach nicht möglich auf einem FPGA, es sein denn man realisiert das mit 
einem Softcoreprozessor, der mit Fließkommazahlen arbeiten kann (das 
dürfte ein Gebiet für die absoluten Profis sein). Ebenso sind 
Multiplizierer nur mit sehr hohem Ressourcenverbrauch zu implementieren. 
Desweiteren verwedest du in deinem Code REAL-Variablen. Wenn mich jetzt 
nicht alles täuscht ist das eine Fließkommazahl, die für die 
Implementation in Hardware absolut ungeeignet ist.
Ein Tip: lagere sämtliche Berechnungen dieser Art in einem MC aus und 
füttere mit diesem den FPGA.

+++

von G. B. (geri)


Lesenswert?

Hallo +++

Vielen Dank für Deine Rückmeldung. Leider sollte die Berechnung mit sehr 
hoher Geschwindigkeit und definierten Zeitabständen erfolgen. Ausserdem 
müssten die Werte in Echtzeit berechnet werden.

Aus Sicht der Ressourcen habe ich keine Vorstellung wie viel benötigt 
wird aber die mit steht ein Cyclone II zur Verfügung und das Einzige was 
der FPGA neben einer SPI noch können solllte ist diesen Algorithmus, den 
ich hier im Ansatz gezeigt habe abarbeiten soll. Im Algorithmus sind 
noch ein paar Abfragen drin.

Bzgl. Wurzelziehen:
Doch, ich meine es geht schon, da sich Wurzelziehen auch mit 
Elementaroperationen realisieren lässt.

Bzgl. Real
Ja, es handelt sich um eine Gleitkommazahl. Für meinen Fall liesse sich 
sich Berechnung, wenn es unbedingt sein muss auch mit 8-Byte 
Integer-Variablen realiseren, die Wurzel bleibt aber. Der Aufwand für 
die Umsetzung wird dann wieder grösser.


A einen DSP habe ich bereits gedacht, allerdings tut sich dieser soviel 
ich weiss wieder schwer mit If-Statements...

Beste Grüsse

Geri

von Klaus F. (kfalser)


Lesenswert?

Welche Zeit hast Du für das Wurzelziehen zur Verfügung, mit welcher 
Taktrate soll das ganze laufen?

Und warum, um Himmels willen, soll sich ein DSP mit IF-Statements 
schwerer tun als ein FPGA?

von G. B. (geri)


Lesenswert?

Hallo Klaus

Eine gesamter Berechnungschritt sollte im Extremfall mit 100KHz 
erfolgen. Der oben dargestellte Algorithmus ist noch etwas komplexer 
zeigt allerdings nur einige Probleme, die ich mit meinem heutigen 
Wissensstand habe:) Aus Sicht der mathematischen Operationen kommt aber 
nichts mehr komplexeres als eine Wurzelfunktion dazu:) Das 
Rechenergebnis (4 Datenbytes) sollten anschliessend per SPI weiter 
gesendet werden - auch in einem Zyklus (100KHz).

Weil ich sonst auch noch einiges an digitalem Zeugs in den Chip packen 
und mich gerne nun mal etwas mit FPGAs vertiefen möchte versuche ich es 
auf diesem Weg.

Bzgl. DSP: Ja, ich habe mich vielleicht etwas schlecht ausgedrückt. 
Allgemein kann doch aber gesagt werden, dass ein DSP ein eher sehr 
starres Programm hat. Vielleicht liesse sich diese Aufgabe aber auch 
damit lösen. Kennst du da vielleicht einen DSP Chip bei dem man sich als 
Hobby-Elektroniker die Entwicklungstolls noch leisten kann?

Beste Grüsse

Geri

von dennis (Gast)


Lesenswert?

Mit dem CoreGenerator kannst du viele verschiedene Cores erzeugen, da 
ist auch ein Wurzel Block dabei: Parametrisierbar mit std_logic_vector 
als Eingang, ich nütze des öfteren diese Cores, sind nicht so groß im 
Platzbedarf .. kannst optimieren nach Fläche/Latency/Geschwindigkeit, je 
nach belieben

von G. B. (geri)


Lesenswert?

Hallo Dennis

Vielen Dank für Deinen Tipp! Das klingt sehr positiv!! Kannst du mir 
bitte etwas präzisieren wie ich da vorgehen muss?. Ich habe Quartus II 
von Altera.

Ich habe inzwischen auch eine mathematik-Library in VHDL gefunden die 
viele der gängigen mathematischen Funktionen abdeckt. Die Theorie zu 
VHDL habe ich auch schon etwas aufgearbeitet. Nun stehe ich vor Quartus 
II und muss schauen, wie ich das erste Projekt zum laufen kriege:)

Beste Grüsse
Geri

von Jürgen Schuhmacher (Gast)


Lesenswert?

Das Wurzelziehen lässt sich im FPGA am Besten mit skalierten INTs 
vollziehen, wobei man den Wert so umrechnet, daß man eine genügende 
Auflösung bereits in die Wurzelfunktion einspeist. Wird ein real Wert 
mit 10Bit benötigt, so speist man eben 20Bit ein. Das Wurzelziehen wird 
mittels PArtialbruchzerlegung auf Divisionen zurückgeführt, wie es beim 
schriftlichen Wurzelziehen geschieht. Im FPGA führt dies zu einer Kette 
aus LUTs und gfs Registern.

Beim Altera Cyclone II bietet sich dann der Megawizzard an, der eine 
instanziierbare Funktion square root erzeugt. Diese arbeitet bei 20Bit 
mit etwa rund 100ns Verzögerung. Bei 2x36Bit erreiche ich bei einem 
aktuellen Design gut 80MHz und habe eine Latenz von <20. Damit hätte man 
immer noch 5MHz Datenrate, also gut das 50fache dessen, was Du brauchst.

von G. B. (geri)


Lesenswert?

Hallo Jürgen

Vielen Dank für Deine Hinweise! Nun habe ich mal ein paar Schlagworte 
für den Anfang. 5MHz klingt ja sehr gut! Den Grundgedanken kann ich 
nachvollziehen. Wie man so eine Funktion nutzen kann, da stehe ich noch 
komplett neben den Schuhen:) Kennst du vielleicht einen guten Link zu 
einem Beipsielprojekt, welches ich nach Quartus II laden kann und mir in 
etwa veranschaulicht, wie man b<=sqrt(a) berechnet:)?

Beste Grüsse und nochmals vielen Dank

Geri

von Jürgen Schuhmacher (Gast)


Lesenswert?

Ich habe hier irgendwo mal einen Teil meines Vid-DSP-Projekts angehängt, 
da müsste einer drin sein. Allerdings ist das easy, da der Wizzard ja 
Bespiele generiert. Das .VHDL muss man in die file-Liste einbinden, das 
instance ist ein Beispiel für die Komponenteninstanziierung.

So etwa sieht das für einen geclockten aus:

root_inst : root PORT MAP (
  clk   => clk_sig,
  radical   => radical_sig,
  q   => q_sig,
  remainder   => remainder_sig
);

Minimal braucht man ein Signal für radical (input) und "q" (output). 
Nach n clocks taucht das Signal dann im Modelsim auf. Zur Auswertung 
braucht man ein fsm oder man instanziiert das Teil ohne pipe line 
funktion und nutzt ein multicylce contraint auf das Signalpaar 
ausreichender Länge.

von G. B. (geri)


Lesenswert?

Hallo Jürgen

Vielen Dank für Deine Mühe! Ich kann damit ehrlich gesagt noch nicht 
viel anfangen:) Den Code kann ich zwar nachvollziehen, ich muss aber 
zuerst mal herusfinden wie mit Quartus ein einfaches Projekt anlegen, 
compilieren und simulieren kann. Vhdl code habe ich, allerdings nur die 
Files mit dem Code....:)

Beste Grüsse

Geri

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.