VHDL mit Quartus II Web Edition und MAX II Board von Altera

Gast #631934
Lesenswert?

Xilinx hat doch einen PWM-Generator als Core im -> "Coregen", oder 
täusche ich micht da? (Irgendwo hatte ich den gesehen).

Was Du machen musst ist aber eigentich nur dies :

Anhand der Sollvorgabe das PWM-Verhältnis errechnen und dann zwei 
Zählerwerte setzen, die abgearbeitet werden.
Gast #632233
Lesenswert?

PWM ist nichts anderes, als ein Zähler. Etwas sowas:


signal cnt : integer range 0 to 64;
signal PWM : std_logic;


if rising_edge(clk) then
  if cnt<64 then
     cnt <= cnt + 1;
  else
     cnt <= 0;
  end if;

  if cnt < 16 then
    PWM <= '1';
  else
    PWM <= '0';
  end if;
end if;


p.s.: die Zahlen wurden willkürlich gewählt

Kest
Gast #632526
Lesenswert?

danke für den Code

ich brauche allerdings eine Variable (2 Taster für das erhöhen bzw. 
herabsetzen der Variable ) um meine PWM "steuerbar" zu machen.

Hast du eine ahnung wie ich eine schleife ablaufen lassen kann, die mir 
meine variable abhängig vom Eingang verändert und dann das PWM ausführt?

das ganze in einer Schleife bis ich einen weiteren Taster fürs Anhalten 
betätige.

Wenn du Ideeen hast bin ich dir sehr dankbar dafür.

(In C wäre die Aufgabe kein Problem aber in VHDL bin ich ein blutiger 
Anfänger deswegen die Fragerei :-) )
Gast #632546
Lesenswert?

Okay, etwas ausführlicher


library bla bla bla
  use ...

entity pwm_entity is
  port (
    clk    : in  std_logic;
    Taste1 : in  std_logic;
    Taste2 : in  std_logic;
    pwm    : out std_logic);

end pwm_entity;

architecture arch of pwm_entity is

  constant cMAX_PWM       : integefr := 64;
  constant cMAX_PWM_RANGE : integefr := 32;

  signal cnt       : integer range 0 to cMAX_PWM;
  signal pwm_range : integer range 0 to cMAX_PWM_RANGE;
  signal PWM       : std_logic;

begin

  process(clk)
  begin
    if clk = '1' and clk'event then

      -- PWM Counter
      if cnt < cMAX_PWM then
        cnt <= cnt + 1;
      else
        cnt <= 0;
      end if;

      -- PWM ausgeben
      if cnt < pwm_range then
        PWM <= '1';
      else
        PWM <= '0';
      end if;

      -- Tasten abfragen / Tastverhältnis verändern
      if Taste1 = '1' and pwm_range < cMAX_PWM_RANGE then
        pwm_range <= pwm_range + 1;
      elsif Taste2 = '1' and pwm_range > 0 then
        pwm_range <= pwm_range - 1;
      end if;

    end if;
  end process;


ich übernehme keine Garantie, dass alles richtig ist. Aber so, oder so 
ähnlich funktioniert es

Kest
Gast #677084
Lesenswert?

Nachtrag zum PWM Core von offizieller Seite

Hatte mir damals die Bücher für die Systemrealisierung(en) mit dem 
SOPC-Builder von Altera bestellt. Dort war unter anderem ein einfaches 
PWM beispiel angeführt, was aber mittlerweile nicht mehr zum download 
auf <www.altera.com/literature/quartus2/lit-qts-sopc.jsp> angeboten 
wird.

Ich stelle es jedem interessierten Neuling hier mal rein, der sich noch 
dafür interessieren dürfte. Ich fand es als lehrreiches Beispiel um mit 
dem SOPC Builder erste eigene Komponenten 'zusammenzubasteln'. Der 
Originalcode ist aber in Verilog, sollte aber leicht auf VHDL 
modifiziert werden können..

liebe grüsse
Angehängte Dateien:

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