Hallo,
brauche Hilfe in VHDL programmierung.
Ich will ein sozusagen Sinusgenerator(sinus über mehrere Perioden) über
ein DDS erzeugen, welches vorher in einer Look up Tabelle die Werte
abgelegt wurden.
Kann mir einer helfen wie ich das in VHDl realisieren soll und wie ich
die Lookup Tabelle erzeuge, wenn ich das hinbekomme muss ich noch
weitere Aufgaben erfüllen. Dazu später
Danke.
Das Prinzip hinter DDS hast du verstanden?
Sonst: http://de.wikipedia.org/wiki/Direct_Digital_Synthesis
Auf dem Bild siehst du die Hauptkomponenten der DDS.
Jetzt musst du diese Komponenten in VHDL nachbilden.
Da brauchst in etwa ein Addierwerk, einen Teiler um deinen Hauptakt
herunter auf den DDS Takt zu Teilen, deine LUT, irgend eine Augabe
(externer DA Wandler oder per PWM), und eine Speicher für die Phase.
Hallo,
Danke für deine Antwort, hab mich schon damit auseinander gesetzt jedoch
bin ich noch ein Anfänger in VHDl, ich brauce lediglich Hilfe für den
Anfang, vielleicht kannst du mir ja elfen den Anfang zu finden.Danke.
Martin Thomas schrieb:> Mod: Links von Lothar Miller (lkmiller) Datum: 14.07.2011 10:29 hierher> kopiert und Doppelpost in µC&E-Forum gelöscht.>> 1. Forums-Suche:> http://www.mikrocontroller.net/search?query=sinus+...>> 2. Google-Suche:> http://www.google.de/search?q=sinus+vhdl+ddfs>> 3. http://www.lothar-miller.de/s9y/categories/31-DDFS
Hallo, danke für die Info, punkt 1 und 2 hatte ich schon durchforstet,
jedoch keine passende Lösung gefunden, nun habe ich eine kleine Beispiel
lösung gefunden hier im mikrokontroller artikel, da gibt es einen code
womit man sinus sägezahn und rechteck erzeugt, das wird auch bei mir
übersetzt und rechnet auch die richtigen werte aus, jeoch will ich
wissen, ob es eine Frage der Einstellung ist das die Signalform so
fließend und bündig wie ganz unten auf der Seite
http://www.mikrocontroller.net/articles/VHDL_Testbench
zu sehen ist oder wie kommt die zustande, bei mir kommt nur die
Zustandsform, ich würd gerne auch so darstellen wollen.Danke.
Matrix1 schrieb:> bei mir kommt nur die Zustandsform
Welchen Simulator hast du?
ISIM z.B. kann keine Analogwerte darstellen...
Modelsim kann das, der Aldec Simulator auch.
Hallo, Danke für die Antwort,
ich benutze den ISim Simulator von Xilinx, schade, na gut.
Was ich noch wissen würde ist, statt der 15 Werte im Array könnte ich
doch auch 360 Werte reinschreiben, dies ist ja dann meine Look up Table,
wie kann ich denn eigentlich die Lookup Table über eine Datei in das
VHDL Code einbinden.Danke. ich möchte gern 12 bit Daten ausgeben, da
ich einen 12 bit DA-Wandler benutzen muss,dann muss ich doch nur 11
downto 0 machen, ach mir fällt ein, dass ich ja die Werte für den Sinus
erstmal berechnen muss, gut Danke fürs erste.
Hallo Lothar
ich hätt da noch eine Frage der dritte Link bezieht sich denke ich mal
für deine Persönlichkeit, ich habe versucht deinen Code umzusetzen,
jedoch klappt das leider nicht, hab üer xilinx die testench erstellt,
hast du vielleicht ne alternative test bench.Danke.
Matrix1 schrieb:> hab üer xilinx die testench erstellt,> hast du vielleicht ne alternative test bench.Danke.
Naja, die Testbench ist an Einfachheit kaum zu übertreffen: Freq_Data
und einen Takt anlegen und fertig...
Zeig doch mal deine Testbench und was für Fehlermeldungen sie bringt.
Oder sag einfach mal, WAS nicht geht.
hallo,
Hab für Freq_Data einen fixen Wert angegeben, aber ich denk mal das muss
von selbst passieren, die Testbench initialisiert dies aber am Anfang
mit nuss, wie sage ich dass Freq data ständig seinen Wert ändern soll,
soll ich einen Zähler einbauen, der dann incrementiert?
Matrix1 schrieb:> Hab für Freq_Data einen fixen Wert angegeben
Du hast 0 angegeben. Oder besser: du hast gar nichts angegeben, das hat
der Wizzard für dich gemacht.... :-/
Porbier doch einfach mal das:
signal Freq_Data : std_logic_vector(7 downto 0) := x"7f";
> wie sage ich dass Freq data ständig seinen Wert ändern soll
Wieso willst du das? Willst du da was wobbeln?
Hallo,
Danke für deine Antwort.
Hab mal ne Verständnisfrage, was genau ist dein Freq_data denn, sind das
Frequenzdaten, was mir auffällt ist dass du kein reset hast, hat das
eine bestimmten Hintergrund?
Danke
Hallo,
hab mal die Simulation durchgeführt und hab das hier rausbekommen wie
auf dem Bild zu sehen ist, ist dies so in Ordnung ja.
Was mein eigentliches Ziel ist, dass ich einen Fehler in den Sinus
einbauen muss, dass eißt ich muss eine Sinusperiode auslassen um einen
Fehler zu projektieren. Dies wird dann auf einen Sensor gegeben, der
dann feststellen muss, dass ein Fehler im Signal vorliegt, wenn du
Anregungen hast wie ich das realisieren kann bin ich dir dankbar.
Danke
Matrix1 schrieb:> was mir auffällt ist dass du kein reset hast,
Gut beobachtet.
> hat das eine bestimmten Hintergrund?
Ja. Dieses Modul braucht keinen Reset. Und deshalb bekommt es keinen.
Die Notwendigkeit eines Resets (und in deinem Fall für Xilinx vor allem
eines asynchronen Resets) muss unbedingt hinterfragt werden. Was ist ein
Reset? Wofür brauche ich den? Für den Reset-Taster vom Entwickler? Für
den Simulator? Antwort beidesmal: NEIN.
Das hatten wir schon mal im Beitrag "Xilinx und die Resets"Matrix1 schrieb:> dass ich einen Fehler in den Sinus einbauen muss, dass eißt ich muss> eine Sinusperiode auslassen um einen Fehler zu projektieren.
Sieh dir mal in deiner Simulation den Akkumulator an. Wenn du dessen
obere Bits mit "0000000" vergleichst, dann weißt du schon mal, wo du
in deiner Sinuskurve bist. Und dann kannst du ja einfach mal einen
Zyklus lang "00000000" ausgeben...
Hallo,
komm einfach net drauf wie ich einen Zyklus lang 0 ausgeben soll, hab
grad voll den Blackout, deine Lookup table erzeugt ja einen viertel
Sinus, den immer wieder ausgegeben wird ein ganzer Sinus erzeugt, ich
weß auch wo der Sinus wieder beginnt, nur weiß ic nicht wie ich dies im
Code realisieren soll, wo soll ich sagen, dass der Ausgang so lang null
sein soll und dann erste wieder von vorne begonnen werden soll.Danke für
deine Hilfe.
Matrix1 schrieb:> wo soll ich sagen, dass der Ausgang so lang null> sein soll und dann erste wieder von vorne begonnen werden sollLothar Miller schrieb:> Sieh dir mal in deiner Simulation den Akkumulator an.
Ein wenig solltest du schon auch noch selber denken... :-/
Ich könnte es mir auch so vorstellen: wenn ein Übergang vom negativen in
den positiven Bereich und gleichzeitig vom zweiten in den ersten
Quadranten stattfindet, dann bist du am Anfang einer Sinuskurve...
Also könntest du das auch so machen:
Guten Morgen,
danke fü deine Hilfe, hab nun einiges ausprobiert und hab auch den
kleinen code einbißchen erweitert, damit die Ausgabe richtig erscheint,
hab nun soweit erweitert
leider wird dabei nicht ein Zyklaus ausgelassen sondern im Intervall
periodisch immer wieder (siehe Bild), ich will lediglich, dass nur ein
einziger Zyklus ausgelassen wird. Was kann man denn noch
ausprobieren.Danke.
Matrix1 schrieb:> ich will lediglich, dass nur ein> einziger Zyklus ausgelassen wird. Was kann man denn noch> ausprobieren.Danke.
Woher soll die Schaltung denn wissen, wann sie den Zyklus auslassen
soll?
Duke
Matrix1 schrieb:> leider wird dabei nicht ein Zyklaus ausgelassen sondern im Intervall> periodisch immer wieder (siehe Bild)
Das ist auch nicht ein ganzer Zyklus, sondern nur ein Quadrant...
Da fehlt nämlich auf jeden Fall was für die Flankenerkennung:
Matrix1 schrieb:> Was kann man denn noch ausprobieren.
Du wirst evtl. von aussen ein Signal eispeisen wollen, über das dann
z.B. auf Tastendruck (Einsynchronisieren, Entprellen und
Flankenerkennung) eine Halbwelle ausgelassen wird.
Oder du erzeugst einen Zähler, der 100 Sinuswellen mitzählt und jeweils
die 101. auslässt, oder, oder, oder...
So langsam wäre es an der Zeit, das noch mal genauer anschauen und zu
VERSTEHEN. Der dazu nötige Prozess heißt MITDENKEN.
> Danke.
De nada.
Hallo,
die Schaltung weiß ja auch net, es soll lediglich eine Periode von
vielen Sinussen ausgegeben werden (Sinusgenerator) und darin soll ein
Sinus fehlen, der ein Fehler darstellt, dies wird dann über einen FPGA
in eine Sensorschaltung eingespeist(DA umgewandelt) was dann erkennen
soll, dass an einem Kreis ein von vielen Stäben ein Stab fehlt.
Danke nochmal für deine Hilfe Lothar, ich bemüh mich sehr dies zu
verstehen bin noch ein Anfänger in diesem Gebiet.
Selbi schrieb:> Wenn ein kompletter Sinus fehlt, merkt man das gar nicht.
Dann würde ich aber von einer sehr ausgeprägten Wahrnehmungsschwäche
ausgehen. Denn da sollte wohl ein Unterschied zwischen "Sinus da" und
"kein Sinus da" erkennbar sein...
Hallo,
wie Lothar geschrieben hat, dass man eine bestimmte Anzahl von
Sinusperioden erzeugt und dann die letzte mit null belegt, dass probier
ich jetzt auch mal aus.Danke.
Hallo,
Lothar wollt mal fragen, ich versuch nun die Sinustabelle über den
Synthesizer zu erstellen, jedoch kommt die ganze Zeit eine
Fehlermeldung, hab schon einiges ausprobiert leider klappt es nicht:
Matrix1 schrieb:> wieder einfüge, dann ist der Ausgang immer Null, ausserdem will ich ja,> dass nur eine einzige STörung kommt. woran kann das liegen.
Am fehlenden Mitdenken?
> der eine Quadrant wird ausgelassen
Aber du willst ja nicht nur 1 Quadranten auslassen...
Probiers mal so:
1
processbegin
2
waituntilrising_edge(CLK);
3
if(Quadrant='0'andsalt='1'andSign='0')then
4
stoerung<=notstoerung;
5
endif;
6
salt<=Sign;
7
endprocess;
Dann überleg dir, was da passiert. Dann spiel mit den Signalen ein wenig
herum, und lern was dabei. Wichtig ist, dass du
1. etwas machen willst. Dir
2. dazu was ausdenkst. Und dann
3. kontrollierst, ob das klappt.
Die ersten beiden Schritte lässt du in diesem Prozess derzeit noch
aus... :-/
> Danke.
De nada.
Matrix1 schrieb:> und wie funktioniert das mit den Attributen.Danke.
Such mal nach vhdlqrc.pdf
Matrix1 schrieb:> wie genau findet er nun heraus welcher Quadrant vorhanden ist
Der aktuell ausgegebene Quadrant ergibt sich aus den Signalen Sign und
Quadrant (naja, diesen Namen habe ich offenbar ein wenig unglücklich
gewählt). Und Sign und Quadrant sind einfach die obersten beiden
Bits des Akkumulators...
alles klar hab verstanden danke.
Hab zuerst mit viertel Sinus und der Lookup Table éinen ganzen Sinus
erzeugt, laut deinem Code, das klappt ja wunderbar, nun habe ich die
Methode benutzt mit der Schleife wo man einen ganzen Sinus erzeugen
kann.
da ich aus 256 Werten ein Sinus erzeugen will sieht die Schleife ja
wiefolgt aus:
dazu müsste doch der Wertebereich von RomAddr und Adress auf 255 erhöht
werden oder, und bei der ZUweisung der Bits für die Address müsste doch
auch statt der 64 auf 255 geändert werden oder nicht?
Sinus_Rom hat ja einen Wertebereich von 255 und RomAddr ja nur dann 64,
dann würden ja für Result nur 64 Werte ausgegeben, oder hab ich wieder
da was falsch verstanden.
Ja gut, aber für die Störung brauche ich die ganzen definitionen
trotzdem, aber es klappt, der Sinus wird ausgegeben und die Störung
erfolgt ebenfalls,
ich versuch die ganze Zeit, einen Zähler einzubauen, der ganze Sinusse
zählt, aber ich versteh nicht, wo der Anfang des Sinus und wo das Ende
ist, damit ich dies in meiner Definition einbauen kann. Hab nachgefragt,
und hab wohl einige Sachen durcheinander gebracht, ich muss nämlich die
Anzahl der Sinusse vorgeben, dass heißt die Anzahl der Zähne vorgeben
und dann einen Zahn (Sinus) auslassen, ´du hattest rechtgehabt, es muss
irgendwie extern erfolgen, über ein Interface sollen diese Daten
eingespeist werden.
kann ich über Freq_Data die breite des Sinus ändern oder ist dies nur
eine Hilfsvariable.
Matrix1 schrieb:> kann ich über Freq_Data die breite des Sinus ändern oder ist dies nur> eine Hilfsvariable.
Probiers aus. Kostet nix.
> aber ich versteh nicht, wo der Anfang des Sinus und wo das Ende> ist, damit ich dies in meiner Definition einbauen kann.
Wenn die oberen 8 bits deines Akkus 0 sind (bzw. werden), dann bist du
am Anfang der Tabelle. Und in der Tabelle steht dein Sinus. Wo bist du
dann also in deinem Sinus?
Matrix1 schrieb:> leider habe ich kein mOdelsim wo ich das Sinus Signal Analog sehen kann> ob es auch genau so aussieht wie es aussehen soll.
Dann schreib Dir die Werte in eine Textdatei und verwende gnuplot,
Matlab, Excel, Openoffice calc, younameit um ein Diagramm draus zu
machen.
Duke
Hallo,
hab einige Variationen ausprobiert, bei der hier zählt er zwar
1
processbegin
2
waituntilrising_edge(CLK);
3
if((Accum(20downto13))=0)thenn<=n+1;
4
endif;
5
endprocess;
aber in der Simulation seh ich, dass Accum(20 downto 13) = 0 lange Null
ist,bis es seinen ZUstand ändert, bis dahin hat n bei jedem Zustand eins
hochgezählt.
Matrix1 schrieb:> aber in der Simulation seh ich, dass Accum(20 downto 13) = 0 lange Null> ist,bis es seinen ZUstand ändert, bis dahin hat n bei jedem Zustand eins> hochgezählt.
Tja, da wäre es nicht ohne, wenn man da erkennt, dass, wie
Lothar Miller schrieb:> die oberen 8 bits deines Akkus 0 sind (bzw. werden)
Aha: WERDEN.
Du mußt dir also MERKEN, welche Bits du vorher hattest und dann auf !=0
vergleichen. So etwa:
mir ist auch aufgefallen, dass ich ja ein process eingerichtet habe,
dass heißt bei jeder steigenden Flanke überprüft er und wenn null ist
dann zählt er hoch bis Accum seinen Zustand richtig ändert kommen
dazwischen etliche steigende Flanken wo abgefragt wird ist Accum Null,
dann hochzählen, kein Wunder das er alle Flanken mitzählt.
Hallo,
kannst du mir paar tipps geben, wie ich es schaffe den Abstand zwischen
den einzelnen Sinussen zu vergrößern, die Abstände sollen zeigen, dass
die Zähne am Rad in einem bestimmten Abstand stehen, jetzt würde ja
bedeuten, dass alle Zähne am Rad nebeneinander sind, Hab versucht, dass
nur eine bestimmte Anzahl von Sinussen ausgegeben wird, dafür habe ich
dies ergänzt
aber das bringt ja nichts, weil er dann bis 60 zählt, dann von 0 wieder,
gibt es nicht eine Abbruchbedingung in vhdl, Exit ist ja um aus einer
Schleife herauszukommen.
Wenn du in VHDL Abläufe modellieren willst, dann nimmst du am besten
einen Zustandsautomaten (State Machine).
Aber da könntest du jetzt schon auch ein wenig Sebständigkeit zeigen.
Sieh dir mal das Buch VHDL-Synthese von Reichardt/Schwarz an, und lern
was draus...
BTW:
Das
Accum_alt(7 downto 0)
und das
n(7 downto 0)
ist nicht nötig, wenn diese Signale sowieso nur 8 Bit breit sind...
BTW2:
> gibt es nicht eine Abbruchbedingung in vhdl
Was willst du denn überhaupt abbrechen?
abbrechen will ich ja nichts was ich meinte war, dass wenn n =40 sinusse
gezählt hat, dass dann der prozess aufhören soll, weiter zu machen, da
ich ja nur 40 Sinusse wollte.
Ja klar ich arbeite mich nebenher auch ein und das Buch besorg ich mir
auch.
@Matrix1:
Ich glaube, ihr habt einen Fehler in eurer Formel. Der Endwert des
Argumentes darf nicht auf 255, sondern muss auf 256 bezogen werden,
damit das entstehende Elementarelement des Sinusbogens exakt passt. Das
wären nämlich dann die Werte ab einschließlich der Nummer 256 aufwärts.
So werden entweder 2 Teilbögen zusammengesetzt, die nicht passen, weil
ein Wert im nächten Bogen wiederholt wird oder die Skalierung stimmt
nicht.
Das Ganze fällt bei grossen Auflösungen nicht so auf, wird aber
augenscheinlich, wenn man einen Sinus aus z.B. nur 8 Werten aufbauen
will. Ich habe das hier mal genauer gepostet. Man beachte die Version 2
und ihre Vorteile.
http://www.mikrocontroller.net/articles/Digitale_Sinusfunktion
Bei der Amplitude würde ich es auch anders machen. Siehe mein Beispiel.
>> gibt es nicht eine Abbruchbedingung in vhdl>Was willst du denn überhaupt abbrechen?
Originalzitat unseres Profs:
Wer bei VHDL immer noch die Abläufe sucht und nach *Start*-, Abbruch
oder Endekriterien sucht, der sollte diesen Umstand als
Abbruchkriterium für sein Studium hernehmen :-)
Hallo,
bin grad dabei in modelsim zu simulieren, dabei will ich ein
Signalverlauf
analog darstellen, was ja auch möglich ist, aber wie schaffe ich es,
dass der angezeigte Signalverlauf nicht über den ganzen wavefenster
angezeigt, wird, ich habe einen Sinusgenerator programmiert und nun will
ich es analog ansehen, nur erscheint das Signal über das ganze Fenster,
Zoomen bringt ja nichts, es ändert nur in die Breite, wie ändere ich die
höhe, will sie kleiner haben.Danke.
Edgar M. schrieb:>>So werden entweder 2 Teilbögen zusammengesetzt, die nicht passen> Warum sollten die Bögen nicht passen? Sie sind doch vollkommen
spiegelsymmetrisch?
Sie sind punktsymmetrisch zu dem Maximalwert bei phi=90Grad. Das ist
aber ein isolierter Wert der sozusagen zwischen den Bereichen steht. Bei
der gesamten Geschichte muss man sich ja immer fragen, zu welchem
Bereich eine Stützstelle gehören soll. Wenn der Nullpunkt der erste im
ersten Viertel ist, dann gehört der 90-Grad Punkt zum zweiten und so
fort.
Die Reihe mit 4 Bereichen wäre also:
0,00 22,50 45,00 67,50 90,00
und umgeklappt:
90,00 67,50 45,00 22,50 0,00
... also ein 5-Punkt-System, das ohne Verschiebung nicht in die binäre
Darstellung passt. Das erste und das zweite Viertel können dann nicht
durch einfaches "Umklappen" gebildet werden, was bei meiner Methode
(Stützstellen in der Mitte der Bereiche) sehr wohl funktioniert:
11,25 33,75 56,25 78,75
78,75 56,25 33,75 11,25
"umklappen" ist also wie "fortsetzen"
Nachsatz:
Der Teiler "255" vom Beitrag ganz oben stimmt, wie gesagt, deshalb
nicht, weil es bei 8 Bit 256 Bereiche sind, die die Abstände zwischen
den Punkten definieren. Man bekäme so eine Art Kompression der Welle mit
256/255 im ersten Viertelbogen und einen Phasensprung von 2 x 1/256 beim
Übergang.
@Juergen S.
Ich ersehe noch nicht genau, wo der wirkliche Vorteil der Verschiebung
sein soll. Die Werte kann ich doch frei belegen, also auch mit
meinetwegen 10 Grad Verschiebung.
Und die Phasenwerte lassen sich binär ganzzahlig darstellen, egal,
wieviele Bits man braucht. Die Tabelle ist doch zyklisch.
Wie macht das denn eine DDS in einem CHIP?
Kommt das da auch verschoben raus? - ich denke nicht!
M.K. schrieb:> egal, wieviele Bits man braucht.
ja und nein,
> Die Tabelle ist doch zyklisch.
nein, es sind 4 "Brocken",
Die Umrechung der bits ist einfacher, weil es nur eine Negation ist,
ohne substraktion oder carry o.ä. -
000 -> 111
001 -> 110
...
111 -> 000
das ist schneller und kleiner, vor allem in mickrigen PLD-Anwendungen
und langsamen CHIPs. Dafür habe ich das seinerzeit auch gemacht.
> Wie macht das denn eine DDS in einem CHIP?
gute Frage, ich denke, dass es bei den grossen Vektoren in einer
CHIP-DDS keine Rolle spielt.
> Kommt das da auch verschoben raus? - ich denke nicht!
müsste man mal testen
Auch wenn das Thema etwas älter ist, greife ich es kurz auf (es wurde
von der Suche vorgeschlagen)
Hallmackenreuther schrieb:> Juergen S. schrieb:>> jeder seine eigene Tabelle braucht>> Wieso braucht jeder seine eigene Tabelle??> Sinus ist Sinus, oder nicht?
Der Frage möchte ich mich anschliessen! Wäre es nicht einfacher, in VHDL
nur eine Tabelle zu erzeugen und sie mehrfach zu nutzen?
Wie liesse sich das steuern? Resource Sharing? Oder manuell per Hand
einkopieren und auf die intelligente Synthese hoffen? Oder doch einfach
nur Multiplexen? Das Tool wäre in diesem Fall Xilinx XST. Synplify
stünde gfs zur Verfügung.
In meinem Fall hätte ich eine grosse Tabelle zu realisieren, mit 1000
Punkten, die u.U. im BRAM liegen muss, weil sie in einem Testfall nicht
ganz sinusförmig sein soll, wozu auch immer.
ralf schrieb:>>> gibt es nicht eine Abbruchbedingung in vhdl>>Was willst du denn überhaupt abbrechen?> Originalzitat unseres Profs:>> Wer bei VHDL immer noch die Abläufe sucht und nach *Start*-, *Abbruch*> oder Endekriterien sucht, der sollte diesen Umstand als> Abbruchkriterium für sein Studium hernehmen :-)
Zu soetwas fällt mir nur ein: Typische Arroganz von Profs! Die habe ich
auch kennengelernt. Die tun immer so, als hätten sie selber keine
Defizite und machen sich über Studenten lustig, die noch am Anfang
stehen.
Markus Wagner schrieb:> Wäre es nicht einfacher, in VHDL nur eine Tabelle zu erzeugen und sie> mehrfach zu nutzen?> Wie liesse sich das steuern? Resource Sharing?
Wie würde diese Tabelle denn in Hardware abgebildet? Als RAM?! Und wie
könnten gleichzeitig viele Komponenten auf 1 RAM zugreifen? Richtig: gar
nicht. Das ginge nur, wenn man den Zugriff auf dieses RAM zeitlich
multiplext...
Markus Wagner schrieb:>> Wer bei VHDL immer noch die Abläufe sucht und nach *Start*-, *Abbruch*>> oder Endekriterien sucht, der sollte diesen Umstand als>> Abbruchkriterium für sein Studium hernehmen :-)> Zu soetwas fällt mir nur ein: Typische Arroganz von Profs! Die habe ich> auch kennengelernt. Die tun immer so, als hätten sie selber keine> Defizite
Zumal der Prof in schon in diesem Fall ein "Defizit" aufweist, denn in
VHDL gibt es ja sehr wohl "Abläufe" mit Start- und Endbedingungen, um
z.B. per Loop und Generate die unterschiedlichsten mehrdimesionalen
Strukturen wie Busse und Areale zu erzeugen und zu verdrahten. Irgendwie
haben selbst Professoren oft ein ungeordnetes Bild von dem
HW-Beschreibung <-> Software und heben schnell darauf ab, dass es biite
ja keine Controller sind und werden nicht müde, die Deklaration der
FPGA-Entwicklung als "Programmieren" als falsch zu krtiseren und
verlieren völlig aus den nAugen, was VHDL heute tatsächlich ist: Eine
Beschreibungssprache, die eine Software steuert, nämlich einen komplexen
Erzeugungsmechanismus, der unter Zuhilfenahme von mehr woder weniger
konkrete Randbdingungen aus einem Baukasten die HW-Elemente selektiert,
die zur Erledigung der gestellten Aufgabe nötigt ist. Das ist im Prinzip
genau dasselbe, was ein Entwicklungsingenieur tun müsste: Er liest die
funktionellen Anforderungen, sucht sich die Chips aus und verdraht dann
das Ganze, wobei er eben die RAMS, PLL, Multiplier und LUTs zur
Verfügung hat.
Bei genauerer Betrachung ist VHDL sogar viel abstrakter, als z.B. eine
Microcontroller-Software in C, denn bei dem C-Programm kann man mehr
oder weniger klar erkennen, wann später mal was im Controller passiert,
bzw welcher Teil aktiv ist.
Bei VHDL geht das kaum, weil letztlich kleine Randbedingungen der
Syntheseinstellungen und des konkrten Timings dafür sorgen, ob etwas in
FFs gepuffert wird oder es in BRAMS wander, bzw ob eine Kombinatorik im
RAM oder in LUTs sitzt, bzw wie diese gebildet und zusammengefasst
wurde.
Das für einige offenbar Verwirrende ist eben der Umstand, dass VHDL die
gesamte Palette an Beschreibungsoptionen bietet, angefangen von der
zielgenauen Referenzierung eines ganz bestimmten IO-FFs, bzw einer PLL,
über das unkonkrete Inferrieren eines Speichers-RAMS bis hin zur
komplett abstrakten bedingten Synthese von Strukturen und deren
Handlungen im Falle des Erfüllens spezieller Bedinungen.
Ob dann jemand so oder so von der FPGA-Entwicklung denkt, hängt ganz
offensichtlich davon ab, aus welcher Ecke er kommt und was ihm bei
seinem Erfahrungsschatz so alles an Wissensbrocken fehlt.
Markus Wagner schrieb:> Der Frage möchte ich mich anschliessen! Wäre es nicht einfacher, in VHDL> nur eine Tabelle zu erzeugen und sie mehrfach zu nutzen?
Um die Frage, die ich damals übersehen hatte, mal zu beantworten: In der
Tat könnte das Sinus-RAM beim typischen Motor-Controller multiplext
werden, soforn sie mit genügend geringen Geschwindigkeiten angesteuert
werden müssen. Sagen wir mal 3000 UPM mit 256 Schritten, macht bei 32
Motoren irgendwas an die 1 MHz. Die App, die ich anführte, muss aber
auch messen und IQ-Prozessieren und einen Filter bedienen und dann wurde
das extrem eng. Zudem müsste da recht viel Logik verbaut werden und bei
kleinen Tabellen sind lokale LUTs resourcentechnisch auch "billiger".
> Wie liesse sich das steuern? Resource Sharing?> Oder manuell per Hand> einkopieren und auf die intelligente Synthese hoffen? Oder doch einfach> nur Multiplexen? Das Tool wäre in diesem Fall Xilinx XST.
Solange die Zugriffe auf die Resource zeitlich entkoppelt ist, kann das
gehen. OB die Synthese das im Einzelnen auch sieht und hinbekommt, ist
eine andere Frage. Ich würde da Xilinx XST nicht zuviel zutrauen. Ich
habe das Thema teilweise näher untersucht und kann zumindests für meinen
Fall des pipelined Synth sagen, dass mehrfach genutzte RAMs, die zu
verschiedenen Zeiten zugegriffen werden, nicht automatisch erkannt
werden. Wenn Ich sie vereinigen wollte, msste ich es mit einem MUX
machen, der passend gesteuert wird. Bei einem EQ, der parallele
Instanzen nutzt, ging es wiederum, wenn die Kanäle zeitlich multiplext
werden: Die Multiplier die genutzt wurden, sind nicht mehrfach erzeugt
worden. Formuliert man das dasselbe als echte pipeline, also "von innen
gemultiplext" geht es technisch auch, aber die Synthese packt es nicht.
Dies ist aber die technisch überlegene, weil effektivste Realisation.
Dieser Sachverhalt ist einer der Hauptgründe, warum ich auch der
automatischen Code-Generation aus MATLAB kritisch gegenüber stehe:
MATLAB generiert keine mehrdimensionalen pipelines. Das muss man selber
machen.
>> Wieso braucht jeder seine eigene Tabelle??>> Sinus ist Sinus, oder nicht?>> Der Frage möchte ich mich anschliessen! Wäre es nicht einfacher, in VHDL> nur eine Tabelle zu erzeugen und sie mehrfach zu nutzen?
MATH_REAL hat die Funktion Sinus.
Mit einer Loop Funktion kann man sich so eine Tabelle erzeugen.
Kein Problem.
Man kann auch den Sinus über die Cordic Funktion erzeugen. Das ist sogar
ohne Tabelle. Nur zur Vollständigkeit.