Hallo, ich habe folgendes Problem. Ich möchte in VHDL eine Schaltung entwickeln, welche am Ausgang einen 16 Bit Vektor hat, welcher an einen Digital Analog Converter übergeben wird. Dieser soll dann die Sägezahnspannung darstellen. Meine Schaltung hat zwei Eingänge, einen für den Clock und eine für die Frequenz der Sägezähne. Ich brauche als jetzt einen Zähler, der mir von 0 bis 2^16 zählt und dabei die Frequenz berücksichtigt. Meine Idee wäre jetzt über den Takt von z.b. 1 Mhz und die Frequenz von 10 bis 10000 hz die benötigten Takte pro Sägezahn zu errechnen. Bei 1 Mhz und 10000 hz wären das 100 Takte pro Sägezahn. Damit beginnt aber mein Problem: In VHDL kann ich ja nur eine Ganzzahldivision machen. Wenn ich also nun die Schritthöhe errechnen möchte, mit welcher ich nach 100 Takten 2^16 erreiche, bekomme ich 655,35 heraus. Müsste also abrunden auf 655, bzw. das wird durch die Division automatisch geschehen. Damit komm ich nicht mehr genau auf den Maximalwert von 2^16, was insofern nicht soo schlimm wäre. Dadurch, dass ich durch das abrunden aber jetzt mehr Sägezähne pro Takt brauche, bedeutet dies, dass ich letztendlich weniger als in diesem Fall 10000 Sägezähne pro Sekunde habe. Und ich weiß nicht, wie ich das ausgleichen kann. Oder ist es z.b. möglich Fließkommazahlen in VHDL zu berechnen und diese auch weiterzugeben an den DA-Converter? Bei 16 Bit hätte ich dann ja 8 Bit vor dem Komma und 8 Bit nach dem Komma, hätte dann also statt den 2^16 Werten nur noch 255 als Maximalwert der an den DA Converter übergeben wird. Kann man davon ausgehen, dass ein DA-Converter auch einen Fließkommazahl verarbeiten könnte? Über Anregungen oder Hinweise über Fehler in meiner Denkweise wäre ich sehr dankbar. Ben
@ ben (Gast) >Ich brauche als jetzt einen Zähler, der mir von 0 bis 2^16 zählt und >dabei die Frequenz berücksichtigt. Das macht man mit einer DDS. >In VHDL kann ich ja nur eine Ganzzahldivision machen. Vergiss die Division. >Oder ist es z.b. möglich Fließkommazahlen in VHDL zu berechnen und diese >auch weiterzugeben an den DA-Converter? Falscher Ansatz. MFG Falk
Hallo Falk, danke, eine DDS wäre wohl die richtige Wahl, nur muss ich das ganze in einen VHDL Code mit entity, architecture usw. packen und dann in einem Simulator testen. Ich kenn mich also mit real existierenden Bauteilen (oder was auch immer) nicht aus. Und bin mir zu 100% sicher, dass ich das nicht verwenden soll. Das ganze soll nur aus dem VHDL Code entstehen, also von null auf.
@ ben (Gast) >Das ganze soll nur aus dem VHDL Code entstehen, also von null auf. Keine Problem. Eine DDS ist schlicht ein Akkumulator, sprich Addierer + Speicherregister. Schon fast zu einfach. Für Sägezahn kann man einfach die oberen Bits des Registers an den DAC ausgeben, für andere Kurvenformen wie Sinus etc. packt man noch einen Dekoder-ROM dazwischen. Fertig. Lies den Artikel DDS und die Dokumente in den Links, vor allem von Analog Devices, und du machst das mit links. MFG Falk
In diesem Falle würde ich keine DDS nehmen sondern den Bresenham Algorithmus -> http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm Gruß Hagen
Der Bresenham tut doch auch nix anderes wie die DDS./! Manchmal bräuchte ich ein Satzzeichen, sowas zwischen Punkt und Ausrufezeichen... leicht erhoben sozusagen.
Im Grunde soll er das ja auch da ansonsten die Resultate anders wären. Aber der nötige Resourcenverbrauch und die machbare Genauigkeit in Relation zu den verbrauchten Resourcen sind unterschiedlich. Der Bresenham wird immer einen Startpunkt mit einem gewählten Endpunkt verbinden. Der DDS arbeitet dagegen mit einmal fixierter Schrittweite und benötigt im Grunde eine unendlich hohe Auflösung beim Akkumulator damit er wie beim Bresenham exakt beim gewählten Endpunkt endet. Wenn man also zb. die steigende Flanke des Dreiecks von 123 bis 240 in 10 Schritten erreichen möchte dann arbeitet der Bresenham exakt innerhalb von 10 Schritten vom Wert 123 bis 240 und das mit Integer Berechnungen. Der DDS dagegen, in seiner Normalform, benötigt Festkomma Arithmetik. Die Breite dieser Fixpoints bestimmt dann die maximale Genauigkeit. Man kann einen DDS sehr wohl so aufbauen das dieser statt mit einem Fixpoint Akkumulator mit einer Fehlerabschätzung wie beim Bresenham arbeitet. Gruß Hagen
Nochmal anders betrachtet. Ein Dreiecksignal hat eine Steigung proportional zur Frequenz. Mit einem DDS kann man diese Proportionalität nur maximal mit der Genauigkeit=Breite des Akkumulators ausrechnen. Es wird also Frequenzen geben die nicht exakt einstellbar sind da die Schrittweite nicht in die Auflösung der gewählten Fixpoints exakt darstellbar ist. Über die Dauer von mehreren Perioden wird dann ein solches Dreickeckssignal langsam wegdriften da man nicht jede beliebige Frequenz exakt einstellen kann. Beim Bresenham passiert das aber nicht. Selbst wenn für eine Periode die gewählte Frequenz nicht exakt einstellbar sein sollte so wird sich das fraktional über mehrere Perioden des Signales wieder ausgleichen. Auf eine längere Zeitdauer betrachtet kann der Bresenham also sehr exakt die Frequenz reproduzieren, beim DDS müsste man dann die Breite der Fixpoint Berechnungen erhöhen. Gruß Hagen
Ja, ich verstehe Dich schon. Die DDS ist halt der besonders einfache Spezialfall, bei dem der Akku 2^n Auflösung besitzt. Damit gestaltet sich die Prüfung auf Überlauf (Carry) besonders einfach und die Subtraktion erledigt sich quasi von alleine.
Hey Hagen, ich habe nachgedacht %-) DDS und Bresenham erreichen unterschiedliche Ziele mit ähnlichem Algorithmus: Die DDS erzeugt eine im Rahmen der Integerauflösung exakte Frequenz Der Bresenham verbindet zwei Punkte exakt im Rahmen der Integerauflösung, liefert demnach eine exakte Amplitude. Meine Schlußfolgerung ist, dass man sich entscheiden muß, was man gerne hätte: - Exakte Frequenz mit Phasen-/Amplitudenjitter -> DDS - Exakte Amplitude, aber schiefe Frequenz -> Bresenham Jedenfalls arbeiten DDS und Bresenham vielleicht im Kern identisch, das Ergebnis ist aber dennoch unterschiedlich.
@Eddy: hm und ich meine das der Bresenham in diesem Fall auch die exaktere Phasen/Frequenzgenauigkeit ereichen wird. Das Dreiecksignal hat ja eine steigende und fallende Flanke. Der Bresenham berechnet erstmal nur die steigende Flanke als Annäherung an eine geometrisch steigende Linie. Dann muß man die Steigung für den Bresenham invertieren um die fallende Flanke zu erzeugen. In diesem Moment darf man den bis dahin errechneten Fehlerwert des Bresenhamalgos. _nicht_ zurücksetzen. Man übernimmt also den bis dato kummulierten Fehlerwert für die nächste Bresenham Berechnung. Somit übernimmt man mit dem fehlerwert auch den bis dato errechneten Fehler in der Phase und Frequenz die man erzeugen möchte. Wenn der Bresenham den Scheitelpunkt in der Amplitude zeitlich korrekt annähern kann dann müsste er meiner Meinung nach also auch die Frequenz/Phase über mehrere Nulldurchgänge des Signal immer korrekt errechnen. Wenn man wie gesagt den Fehlerwert für alle Berechnungen durchlaufen lässt, und nicht für jede Flanke zurücksetzt. Die Genaugigkeit hängt dann von der Exaktheit des Fehlerwertes ab. Gruß Hagen
Ob wir von einem Dreieck oder Sägezahn sprechen, dürfte unter dem Strich egal sein. Der Bresenham benötigt aber zur Funktion eine bekannte X-Schrittweite, was in unserem Fall also die Zeitachse - die Samples - sind. Und das ist in meinen Augen ein konstanter Wert, welcher einmal festgelegt wird. Daher wüßte ich nicht, wie der Bresenham zu einer exakteren mittleren Frequenz kommen sollte wie eine DDS. Der Wert im Akkumulator - der Rest - stellt in meinen Augen auch keinen Phasen, sondern Spannungsfehler dar.
Korrekt: X-Schrittweite = Zeitachse = Auflösung mit der man die Samples berechnet = feste Frequenz mit der man den DAC mit Daten füttert. Die effektive Frequenz ergibt sich somit nur aus der gewählten Steigung der Flanken des Dreieckssignales. Somit ist das identisch zur DDS. Beim Bresenham berechnet man also die Steigung des Dreiecks proportional zur gewünschten Frequenz. Die Eingangsfrage drehte sich um den DDS und ich meine das für stetige Signalformen der Bresenham auf einem FPGA mit weniger Resourcen auskommt. Baut man beides so das man die gleichen Resourcen verwendet so kann man mit Bresenham die Auflösung inkrementieren. Gruß Hagen
@ Hagen Re (hagen) >Die Eingangsfrage drehte sich um den DDS und ich meine das für stetige >Signalformen der Bresenham auf einem FPGA mit weniger Resourcen >auskommt. Das wage ich zu bezweifeln. Eine DDS braucht ein Register und einen Addierer, das dürfte kaum zu unterbieten sein. > Baut man beides so das man die gleichen Resourcen verwendet so >kann man mit Bresenham die Auflösung inkrementieren. Nö. MfG Falk
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.