mikrocontroller.net

Forum: FPGA, VHDL & Co. Sägezahn in Sinus


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wir haben vor aus einer Sägezahn Spannung eine Sinus Spannung zu 
generieren.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.MATH_REAL.ALL;

entity SinusGeneration is
  Port 
  (  
    clkin  : in std_logic;
    reset_n  : in std_logic;
    cnt_in  : in std_logic_vector(13 downto 0);
    cnt_out  : out std_logic_vector(13 downto 0)
  );
end SinusGeneration;

architecture Behavioral of SinusGeneration is
  signal state: std_logic_vector(1 downto 0);
begin
  --signal dac: std_logic_vector(13 downto 0);
  sin_gen: process(cnt_in)
  variable value1: integer range 0 to 16383;
  --variable state: integer;
  begin  
    if reset_n = '0' then
      state <= "00";
    elsif (clkin = '1') and (clkin'event) then
      value1 := conv_integer(unsigned(cnt_in));
      if (state = "00") then
        cnt_out <= conv_std_logic_vector((8191 + value1), 14);
        if (value1 = 8192) then
          state <= "01";
        end if;
      end if;
      if (state = "01") then
        cnt_out <= conv_std_logic_vector(8191 + (16383 - value1), 14);
        if ((16383 - value1) = 0) then
          state <= "10";
        end if;
      end if;
      if (state = "10") then
        cnt_out <= conv_std_logic_vector((8191 - value1), 14);
        if (value1 = 8192) then
          state <= "11";
        end if;
      end if;
      if (state = "11") then
        cnt_out <= conv_std_logic_vector(8191 - (16383 - value1), 14);
        if ((16383 - value1) = 0) then
          state <= "00";
        end if;
      end if;
      
    end if;
  end process sin_gen;
end Behavioral;

Jemand eine Idee? Evtl mit Hilfe eines Filters? Oder der Sinus Funktion 
in vhdl?

MfG
Jens&Max

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Hardware oder nur in der Simulation?

Das geht (noch) nicht zu synthetisieren:
use IEEE.MATH_REAL.ALL;

Und hier verwendet man besser:
--use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.NUMERIC_STD.ALL;

Duke

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..Math.all war noch aus einer alten Version.. haben bereits eine 
Sägezahn Spannung programmiert s.o. und auch auf dem Oszilloskop 
ausgegeben.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jens:

Ich weiß ja nicht welche Auflösung Ihr braucht, aber ich würde mit dem 
Sägazahn als Adresse in einer LUT nachschauen.

Duke

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
14 Bit :)

Autor: Gandalf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach ne DDS nehmen?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDS ? Was genau ist das? Dachte an ein IIR 2. Ordnung. wie kann man VHDL 
technisch realisieren?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wir haben vor aus einer Sägezahn Spannung eine Sinus Spannung zu
> generieren.
:
>  Dachte an ein IIR 2. Ordnung.
Weniger interessant ist was ihr vorhabt,
sondern viel eher was das eigentlich werden soll.

Wie sieht die konkrete Aufgabe aus?
Woher kommt die Sägezahnspannung?
Ist die extern vorgegeben, oder wird die von euch erzeugt?
Welche(n) Frequenz(bereich) ist gefragt?

> haben bereits eine Sägezahn Spannung programmiert
Warum programmiert ihr dann nicht gleich eine Sinusspannung?

> DDS ? Was genau ist das?
Wikipedia hilft weiter:
DDS, DDFS --> Direkte Digitale (Frequenz) Synthese
http://de.wikipedia.org/wiki/Direct_Digital_Synthesis

Und so könnte das in der Realität aussehen:
http://www.lothar-miller.de/s9y/categories/31-DDFS

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsere Aufgabe war es eine Sägezahnspannung, die wir erzeugt haben, in 
eine Sinusspannung umzuformen und auf dem Oszi wieder auszugeben. Die 
Frequenz wollen wir noch nachträglich variable machen. Jetzt wollen wir 
aus der Sägezahn mit Hilfe eines IIR-Filters eine Sinus-Form erzeugen.


MfG
Jens

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Jetzt wollen wir aus der Sägezahn mit Hilfe eines IIR-Filters
> eine Sinus-Form erzeugen.
Das ist wahrhaftig der denkbar umständlichste Weg...   :-o

Wenn du einen Sägezahn (erzeugt) hast, dann nimm diese Zahlenwerte als 
Adresse für eine (ROM-)Tabelle, in der eine Sinuskurve abgelegt ist.

Mit ein wenig Nachdenken reicht es aus, nur 1/4 der kompletten 
Sinuskurve abzuspeichern, und dann mit den beiden höchsten Bits der 
Adresse auszuwählen, in welchem Quadranten du dich befindest.

Du kannst z.B. auch nur eine Tabelle mit wenigen Stützpunkten (z.B. 64) 
anlegen, und die Sinuswerte zwischen den Stützpunkten interpolieren.

Jede dieser Ideen ist garantiert einfacher als der Filteranstatz. Dies 
gilt im Besonderen, wenn die Frequenz variabel ist.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es VHDL-Schnipsel für solche Tabellen? Bzw Beispiele für die Idee 
mit der Interpolation?

MfG

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> gibt es VHDL-Schnipsel für solche Tabellen?
Auf die Gefahr hin, dass ich mich wiederhole:
>>> Und so könnte das in der Realität aussehen:
>>> http://www.lothar-miller.de/s9y/categories/31-DDFS
Dort ist ein 8-Bit Viertel-Sinus abgelegt  :-/

> Bzw Beispiele für die Idee mit der Interpolation?
Ein wenig solltest du schon noch selbst machen (=lernen)   ;-)

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So eine Interpolation geht ein einfachsten, indem man die Phase mit 
mindestens 4fachger Genauigkeit berechnet und dann jeweils 4x die 
Tabelle mit 90,180,270 Grad Vorlauf abfragt. Dann kannst Du 4 Werte 
addieren, um die Genauigkeit zu erhöhen.

Ich habe in meinem VHDL-Synth eine Option auf eine 20->24 Bit 
Interpolation, was aber nur etwas bringt, wenn die Sinustabelle schon 
sehr fein ist.

Für einfache "Sinüsse" geht auch das hier:
Beitrag "Re: FPGA Größe ausreichend für komplexen FM Synthesizer"

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.