Forum: FPGA, VHDL & Co. PWM Signal erzeugen


von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

Hi Leute,

ich bin Einsteiger in FPGA.
Ich will PWM Signal aus FPGA(by VHDL) erzeugen aber ich weiß nicht,was 
ich machen soll.Mein PWM SIgnal hat 3,3 V Level(positiv Flanken).

Es wäre sehr nett,wenn jemand mir helfen kann.

Danke im Voraus.

Milan

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

schon vergessen.Ich arbeite mit FPGA Spartan 3

von Klaus F. (kfalser)


Lesenswert?

Man implementiert einen Zähler.
Am Anfang wird der Zähler auf 0 gesetzt und das PWM Signal geht auf '1'.
Bei einem bestimmten Zählerstand wird das PWM Signal auf '0' 
zurückgesetzt.
Bei einem weiteren bestimmten Zählerstand wird der Zähler wieder auf 0 
gesetzt und das PWM-Signal wieder auf '1'.
Das Spiel beginnt von vorne.

Die Frequenz mit der der Zähler arbeitet, die Zählerstände usw. hängen 
von davon ab, wie Du das PWM Signal brauchst.

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


Lesenswert?

> Es wäre sehr nett,wenn jemand mir helfen kann.
Sieh mal dort: http://www.lothar-miller.de/s9y/categories/47-PWM

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

Danke Klaus für schnelle Antwort.

Ich will die PWM Signal aus 2 Signale erzeugen.
 - erste ist dreieck Signal(ich kann erzeugen)
 - zweite ist 3 sinus Signal(die Spannung-und zur Zeit weiße ich noch 
nicht,wie ich erzeugen kann).

Danke im Voraus dür die Antworten

Viel Grüße

Michael

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


Lesenswert?

>  - erste ist dreieck Signal
>  - zweite ist 3 sinus Signal
Wo hast du die Signale? Im FPGA? Mit welcher Vektrobreite?

> sinus Signal(die Spannung-und zur Zeit weiße ich noch
>               nicht,wie ich erzeugen kann).
Am einfachsten über eine Tabelle wie bei einer DDFS.
Siehe auch dazu: http://www.lothar-miller.de/s9y/categories/31-DDFS
;-)

von Michael M. (Firma: Uni Hannover) (babybk)


Lesenswert?

Danke Lothar,

Ihre Code helfen mir sehr viel.Aber ich hab noch eine Frage über der 
Erzeugung des Sinus Signals.
Dies Code hab ich nicht verstanden

-- Sinus von 0° bis 90° (0 bis PI/2)
  constant Sinus_Rom : Rom64x8 := (
    x"00",  x"03",  x"06",  x"09",  x"0c",  x"0f",  x"12",  x"15",
    x"18",  x"1b",  x"1e",  x"21",  x"24",  x"27",  x"2a",  x"2d",
    x"30",  x"33",  x"36",  x"39",  x"3b",  x"3e",  x"41",  x"43",
    x"46",  x"49",  x"4b",  x"4e",  x"50",  x"52",  x"55",  x"57",
    x"59",  x"5b",  x"5e",  x"60",  x"62",  x"64",  x"66",  x"67",
    x"69",  x"6b",  x"6c",  x"6e",  x"70",  x"71",  x"72",  x"74",
    x"75",  x"76",  x"77",  x"78",  x"79",  x"7a",  x"7b",  x"7b",
    x"7c",  x"7d",  x"7d",  x"7e",  x"7e",  x"7e",  x"7f",  x"7f");

Wie können Sie den Wert in Tabelle geben?

Vielen Dank

VG
Michael

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


Lesenswert?

Den Hexwert in die Tabelle zu initialisieren ist möglich, genauso wie 
z.B. ein einzelnes Signal zu initialisieren:
1
  signal wert : std_logic := '1';


Welche Hexwerte in welcher Reihenfolge in die Tabelle kommen, das war 
der Output eines C-Programms. Das ganz einfach den Sinus berechnet, und 
das dann als Hex-Zahl in VHDL-Style formatiert hat.

von Harald (Gast)


Angehängte Dateien:

Lesenswert?

Erstmal braucht man einen Sinusgenerator, dann einen PWM Integrator und 
einen Entscheider, ob der Integrator über dem erregenden Signal liegt 
oder darunter. Damit wird die Richtung des Integrators ermittelt, diese 
ist zugleich PWM-Ausgang.

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


Angehängte Dateien:

Lesenswert?

Ich klemme da einfach
meine DDFS (http://www.lothar-miller.de/s9y/categories/31-DDFS)
vor meine PWM  (http://www.lothar-miller.de/s9y/categories/47-PWM)
und fertig ist die Laube  ;-)
1
library IEEE;
2
use IEEE.std_logic_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity SinusPWM is
6
    Port ( clk : in  STD_LOGIC;
7
           pwmout : out  STD_LOGIC);
8
end SinusPWM;
9
10
architecture Behavioral of SinusPWM is
11
   component DDFS is
12
      Port ( CLK       : in  std_logic;
13
             Freq_Data : in  std_logic_vector (7 downto 0);
14
             Dout      : out std_logic_vector (7 downto 0));
15
   end component;
16
  
17
   component PWM is
18
      Port ( clk      : in  std_logic;
19
             pwmvalue : in  std_logic_vector (7 downto 0);
20
             pwmout   : out std_logic);
21
   end component;
22
23
   signal sinus  : std_logic_vector(7 downto 0);
24
   signal sinusplusoffset  : std_logic_vector(7 downto 0);
25
26
begin
27
   I_ddfs : DDFS 
28
   port map ( CLK => clk, Freq_Data => x"bb", Dout => sinus);
29
30
   sinusplusoffset <= std_logic_vector(unsigned(sinus)+to_unsigned(128,8));
31
32
   I_pwm : PWM
33
   port map ( CLK => clk, pwmvalue => sinusplusoffset, pwmout => pwmout);
34
35
end Behavioral;
Die Waveform ist als Screenshot angehängt.

von Harald (Gast)


Lesenswert?

Damit baust du genau das, was ich oben beschrieben habe, mit dem 
Unterschied, dass Dein "wait-until" Konstrukt nicht synthetisierbar ist.

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


Lesenswert?

Harald schrieb:
> ... dass Dein "wait-until" Konstrukt nicht synthetisierbar ist.
Doch, ist er. Probiers aus.  ;-)

Die Synthesetools können zwischenzeitlich noch ganz andere Dinge:
http://www.lothar-miller.de/s9y/categories/6-Clock-Enable
und
http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozess

von Harald (Gast)


Lesenswert?

Deine Beispiele sind schon plausibel, speziell das mit den enable hätte 
ich auch so codiert, wenn ich ein Synthesetool wäre.

Aber der Vorschlag mit der Sensitivityliste bietet nicht wirklich eine 
Vereinfachung. Folgendes Misverständnis sehe ich:
[vhdl]
process (reset,clk)
  begin -- Sesitivity-List unvollständig,
        -- weil "and clk'event" fehlt,
        -- müsste inp für eine korrekte Simulation mit aufgenommen 
werden

  if (reset='1') then
    outp <= '0';
  elsif (clk='1') then   -- hier fehlt  "and clk'event"
    outp <= inp;
  end if;
end process;
[/hdl]

Du unsterstellst, dass clk ein Talt sein soll. Solange Du das nicht 
hinschreibst, ist es keiner und die Schaltung kombiniert vollkommen 
korrekt und zwar so wie Synthese und Sensitivy zu interpretieren sind.

Die Sache stimmt vollkommen so.

Es ist nur Deine Idee, das clk ein Clock sein soll.

Schreib es hin und es wird gehen,

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


Lesenswert?

Harald schrieb:
> Solange Du das nicht hinschreibst, ist es keiner ...
> Es ist nur Deine Idee, das clk ein Clock sein soll.
> Schreib es hin und es wird gehen,
Richtig, aber weil ich etwas vergessen habe ("and clk'event" beim 
elsif), scheint die Simulation korrekt zu sein, die synthetisierte 
Hardware ist aber ein Latch und verhält sich ganz anders.

Für eine korrekte Simulation der falschen Beschreibung fehlt "inp" in 
der Sensitivliste...

Mit einem
1
wait until clk='1';
wird das nie passieren, weil es keine Sensitivliste gibt.

von Harald (Gast)


Lesenswert?

Du unterstellst aber immer noch, dass CLK ein Takt ist. Wenn Du das tust 
und korrekt beschreibst, arbeitet SIM und SYN korrekt.

Wenn aber CLK kein Takt ist (und dann sähe das VHDL ja auch so aus) dann 
währe waituntil falsch!

Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf 
fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht 
gefüllt hast.

Im anderen Fall, in dem Das VHDl so korrekt formuliert ist, liegt die 
Idee daneben!

Im Übrigen sind fehlende Signale in der der Sens nicht zwingend ein 
Fehler sondern oft gewollte ereignisgesteurtes Verhaltensbeschreibung in 
SIMS.

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


Lesenswert?

> Du unterstellst aber immer noch, dass CLK ein Takt ist.
Richtig, "clk" soll ein Takt sein.
Aber ich habe in der Beschreibung das "and clk'event" vergessen (hast du 
noch nie was vergessen?). Und wenn ich das Ganze simuliere, sieht es 
aus, wie wenn alles korrekt beschreiben wäre: der Ausgang ändert sich 
nur in Abhängigkeit von "reset" und "clk".
Also, denke ich mir, alles gut, Simulation passt.
Aber in der Hardware taucht dann auf einmal ein Latch auf...

> Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf
> fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht
> gefüllt hast.
Der Fall kommt aus der Realität (wie auch die anderen Beispiele auf 
meiner HP), ist allerdings zur Veranschaulichung hier deutlich 
abgespeckt. In einem schönen großen Prozess siehst du das vergessene 
"and clk'event" nicht so leicht.

> Im Übrigen sind fehlende Signale in der der Sens nicht zwingend ein
> Fehler sondern oft gewollte ereignisgesteurtes Verhaltensbeschreibung in
> SIMS.
WOW. Das ist allerdings ein übler Stil, den ich meinem Nachfolger nicht 
zumuten würde. Der weiß nichts von meinen (damaligen) Gedankengängen, 
und denkt sich: Hoppla, da fehlt ein Signal...  :-o

von Klaus F. (kfalser)


Lesenswert?

> Das Problem ist, dass Du bei Deiner Betrachtung einseitig darauf
> fokussierst, dass Du diesen einen Fall hast und nur die Sens nicht
> gefüllt hast.

Das Problem ist, das VHDL Compiler für die Synthese MUSTER und 
STRUKTUREN erkennen, um daraus FFs, Latsches, usw. zu erkennen.
Das dahinterstehende VHDL interessiert sie überhaupt nicht, weil im FPGA 
nicht Prozesse laufen, sondern FFs schalten. Wenn jetzt in der 
Sensitivity List Signale fehlen, dann werden diese vom Compiler (LEIDER) 
stillschweigend ergänzt, im besten Fall kommt eine Warnung.
Sythese und Simulation stimmen dann nicht überein.

Im obigen Beispiel fehlt entweder das clk'event, dann wirds die 
Beschreibung eines FF's, oder es fehlt das Signal inp, dann wirds ein 
Latch.
So wie es da steht, ist es zwar VHDL für die Simulation, entspricht aber 
keiner möglichen Hardware.

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.