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
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