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
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. +++
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
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?
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
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
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.