PWM Signal erzeugen

OP (Firma: Uni Hannover) #1364275
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
#1364333
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.
OP (Firma: Uni Hannover) #1364731
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
Moderator (Firma: Titel) Persönliche Seite #1364747
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
;-)
OP (Firma: Uni Hannover) #1364889
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
Moderator (Firma: Titel) Persönliche Seite #1364908
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.
Gast #1365625
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.
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1365910
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.
Angehängte Dateien:
Gast #1366213
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,
Moderator (Firma: Titel) Persönliche Seite #1366236
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.
Gast #1367701
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.
Moderator (Firma: Titel) Persönliche Seite #1367852
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
#1367887
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren