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


von Jens (Gast)


Lesenswert?

Hallo,

wir haben vor aus einer Sägezahn Spannung eine Sinus Spannung zu 
generieren.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.MATH_REAL.ALL;
5
6
entity SinusGeneration is
7
  Port 
8
  (  
9
    clkin  : in std_logic;
10
    reset_n  : in std_logic;
11
    cnt_in  : in std_logic_vector(13 downto 0);
12
    cnt_out  : out std_logic_vector(13 downto 0)
13
  );
14
end SinusGeneration;
15
16
architecture Behavioral of SinusGeneration is
17
  signal state: std_logic_vector(1 downto 0);
18
begin
19
  --signal dac: std_logic_vector(13 downto 0);
20
  sin_gen: process(cnt_in)
21
  variable value1: integer range 0 to 16383;
22
  --variable state: integer;
23
  begin  
24
    if reset_n = '0' then
25
      state <= "00";
26
    elsif (clkin = '1') and (clkin'event) then
27
      value1 := conv_integer(unsigned(cnt_in));
28
      if (state = "00") then
29
        cnt_out <= conv_std_logic_vector((8191 + value1), 14);
30
        if (value1 = 8192) then
31
          state <= "01";
32
        end if;
33
      end if;
34
      if (state = "01") then
35
        cnt_out <= conv_std_logic_vector(8191 + (16383 - value1), 14);
36
        if ((16383 - value1) = 0) then
37
          state <= "10";
38
        end if;
39
      end if;
40
      if (state = "10") then
41
        cnt_out <= conv_std_logic_vector((8191 - value1), 14);
42
        if (value1 = 8192) then
43
          state <= "11";
44
        end if;
45
      end if;
46
      if (state = "11") then
47
        cnt_out <= conv_std_logic_vector(8191 - (16383 - value1), 14);
48
        if ((16383 - value1) = 0) then
49
          state <= "00";
50
        end if;
51
      end if;
52
      
53
    end if;
54
  end process sin_gen;
55
end Behavioral;

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

MfG
Jens&Max

von Duke Scarring (Gast)


Lesenswert?

In Hardware oder nur in der Simulation?

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

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

Duke

von Jens (Gast)


Lesenswert?

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

von Duke Scarring (Gast)


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

von Jens (Gast)


Lesenswert?

14 Bit :)

von Gandalf (Gast)


Lesenswert?

einfach ne DDS nehmen?

von Jens (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Jens (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Jens (Gast)


Lesenswert?

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

MfG

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von J. S. (engineer) Benutzerseite


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"

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
Noch kein Account? Hier anmelden.