mikrocontroller.net

Forum: FPGA, VHDL & Co. PWM Signal erzeugen


Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schon vergessen.Ich arbeite mit FPGA Spartan 3

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

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

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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
;-)

Autor: Michael Milan (Firma: Uni Hannover) (babybk)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht lesenswert
Den Hexwert in die Tabelle zu initialisieren ist möglich, genauso wie 
z.B. ein einzelnes Signal zu initialisieren:
  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.

Autor: Harald (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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  ;-)
library IEEE;
use IEEE.std_logic_1164.ALL;
use IEEE.numeric_std.ALL;

entity SinusPWM is
    Port ( clk : in  STD_LOGIC;
           pwmout : out  STD_LOGIC);
end SinusPWM;

architecture Behavioral of SinusPWM is
   component DDFS is
      Port ( CLK       : in  std_logic;
             Freq_Data : in  std_logic_vector (7 downto 0);
             Dout      : out std_logic_vector (7 downto 0));
   end component;
  
   component PWM is
      Port ( clk      : in  std_logic;
             pwmvalue : in  std_logic_vector (7 downto 0);
             pwmout   : out std_logic);
   end component;

   signal sinus  : std_logic_vector(7 downto 0);
   signal sinusplusoffset  : std_logic_vector(7 downto 0);

begin
   I_ddfs : DDFS 
   port map ( CLK => clk, Freq_Data => x"bb", Dout => sinus);

   sinusplusoffset <= std_logic_vector(unsigned(sinus)+to_unsigned(128,8));

   I_pwm : PWM
   port map ( CLK => clk, pwmvalue => sinusplusoffset, pwmout => pwmout);

end Behavioral;
Die Waveform ist als Screenshot angehängt.

Autor: Harald (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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-Geta...

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,

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

Bewertung
0 lesenswert
nicht 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
wait until clk='1';
wird das nie passieren, weil es keine Sensitivliste gibt.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

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.