www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL PWM auf fpga4fun.com


Autor: Sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich spiel gerade mit VHDL herum und wollte eine PWM implementieren.

Da meine ersten Versuche in die Hose gingen bin ich bei Freund Google 
mal auf Ideensuche gegangen und habe folgendes gefunden:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PWM is
  port (
   clk : in std_logic;
   PWM_in : in std_logic_vector (7 downto 0) := "00000000";
   PWM_out : out std_logic
  );
end PWM;

architecture PWM_arch of PWM is
  signal  PWM_Accumulator : std_logic_vector(8 downto 0);
begin
  process(clk, PWM_in)
  begin
    if rising_edge(clk) then      
      PWM_Accumulator  <=  ("0" & PWM_Accumulator(7 downto 0)) + ("0" & PWM_in);
    end if;
  end process;

  PWM_out <= PWM_Accumulator(8);
end PWM_arch;
Quelle: http://www.fpga4fun.com/PWM_DAC.html


Wenn ich mir das recht überlege, hab ich hier doch aber keine echte 
Puls-Weiten-Modulation sondern eher eine Pulsfrequenzmodulation 
(http://de.wikipedia.org/wiki/Pulsfrequenzmodulation) oder?

Ich hab eine Konstante Pulsbreite von einem clk Zyklus.

Entweder das stimmt so, wie ich es sage oder ich stehe auf dem Schlauch.

Danke

Gruß
Sepp

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ist keine PWM. PFM aber auch nicht, weil der Abstand der Pulse nicht 
konstant ist (Bsp: PWM_IN=255 gibt 0-0-1-0-1-0...-1-0-0-1...). Also eher 
eine Pulse Distribution Modulation... PDM ist an sich nicht verkehrt, 
weil zB. der Ripple nach einem RC-Glied bei vielen PWM-Werten kleiner 
wird. Aber mit der Methode habe ich es auch noch nicht gesehen...

Der Code ist aber ohnehin nicht so toll. In der Entity gibts eine 
Default-Zuweisung an PWM_in, dabei ist das doch grad der wichtigste 
Eingang... Dafür fehlt eine Initialisierung vom Akku, entweder per 
explizitem Reset oder := in der Deklaration. Damit ist der Akku 
undefiniert ('U'). Geht zwar in echt, aber nur da. Obiges wird im 
Simulator nach einem Takt lauter nette rote 'X'e produzieren, weil 
'U'+irgendwas immer 'X' gibt...

Weiterhin will man "IEEE.STD_LOGIC_UNSIGNED.ALL" nicht mehr verwenden. 
Trotz des Namens ist das kein Standard. Nimm den Typ unsigned von 
"IEEE.NUMERIC_STD.all" (hätte auch signed). Vermutlich ist das auch der 
Grund, warum es bei dir nichts geworden ist. Normale Vektoren sind reine 
Aneinanderreihung von Bits ohne arithmetische Interpretation. D.h. +/- 
oder Grössenvergleiche ausser = Gleichheit sind eigentlich nicht 
definiert. Synopsys hat ein paar Bibliotheken verbrochen (u.a. obige), 
die das mit diversen Nebenwirkungen reingewürgt haben.

Wenn man numeric_std nimmt, kann man als Typen zB. unsigned(7 downto 0) 
definieren und die ganze Arithmetik geht ohne grösseren Aufwand, soweit 
Overloading und Typprüfung in VHDL das zulassen...

Mit numeric_std und passend definierten Signalen würde der innere Teil 
einer PWM zB so aussehen:

pwm_acc<=pwm_acc+1;
pwm_out<='0';
if pwm_acc<pwm_in then
  pwm_out<'1';
end if;

Ist aber nicht ganz optimal, da das < eine Subtraktion produziert. Man 
kann auch nur bei Gleichheit das Bit setzen und nur beim Wraparound 
wieder auf 0 zwingen. Aber viel bringts nicht und ist bei heutigen FPGAs 
auch recht egal.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Synopsys hat ein paar Bibliotheken verbrochen
und wie so soft wurden sie dafür nie zur Verantwortung gezogen, obwohl 
sie tausende Programmierer behindert und millionen Arbeitsstunden 
vernichtet haben :-)

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.