www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL - Sägezahn


Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In diesem Falle würde ich keine DDS nehmen sondern den Bresenham 
Algorithmus -> http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

Gruß Hagen

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Bresenham tut doch auch nix anderes wie die DDS./!

Manchmal bräuchte ich ein Satzzeichen, sowas zwischen Punkt und 
Ausrufezeichen... leicht erhoben sozusagen.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hagen Re (hagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.