Forum: FPGA, VHDL & Co. pwm component verwenden, Anfänger


von olli (Gast)


Lesenswert?

hi,

folgende Fragen habe ich an euch. Hoffentlich könnt ihr mir helfen. Ich 
versuche seit längerem mit den lieben fpga warm zu werden und meine 
Denkbremsen los zu werden.
Ergebnis ist, daß immer mal wieder neu angefangen wird - so wie seit 
letzter Woche. nun soll es endlich strukturiert Erfolg bringen. Also 
wollte ich anfangen erst mal kleine Komponenten zu basteln, die sich 
dann hoffentlich irgendwie mal in ein Projekt fügen...

Ich habe hier unten folgendes für die pwm Erzeugung besrage natürlich - 
was würdet ihr anders machen (also im hinblick auf 'etwas' größeren 
Funktionsumfang der architecture)? Mehr aufsplitten? viele, viele kleine 
Prozesse oder ist es z.B. schon ok den takt zu teilen und dann nicht ein 
clock_enable zu benennen was in einem anderen Prozess zum hochzählen 
benutzt wird?

Frage 2: KERNFRAGE 1. Wenn ich nun diese Komponente pwm_chan mehrfach in 
einer top entity benutzen möchte. sagen wir mal ein Vektor 
brightness[4][16] enthält halt 4 Helligkeiten und soll der Eingang für 
pwm_chan sein. Wie schreibe ich das hin? mit einer for-Schleife? Da 
stehe ich echt auf dem Schlauch.
Weiterhin in dem Sinne. Werden dann (wenn ich das 4 mal zugewiesen 
bekäme) 4 mal die Ressourcen benützt? Also 4 mal der s_pwmcounter, 4 mal 
der Taktteiler? das kostet ja gar nicht so wenig Flipflops.

Frage 3: KERNFRAGE 2. Die Helligkeiten sollen irgendwie über spi 
reinkommen. Das wäre dann mein nächstes Modul. Wann und wie weise ich 
das spi register am besten der brightness[] zu? Direkt beim nächsten 
Takt? Direkt nach einer Stufe oder nach einer vollen Periode? Dahinter 
steht meine Frage ob man sonst die Änderungen bemerkt, wenn sich die 
Helligkeit mitten in einem Zyklus ändert.



1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity pwm_chan is
6
   Generic(FPWM     : natural := 100;
7
        FCLK     : natural := 50000000;
8
        PWMRES   : natural := 16);
9
    Port ( clk     : in  STD_LOGIC;
10
           brightness : in  STD_LOGIC_VECTOR (3 downto 0); --ein konstantes integer signal ist erst mal übersichtlicher für mich
11
           pwm_out   : out  STD_LOGIC);
12
end pwm_chan;
13
14
architecture Behavioral of pwm_chan is
15
signal s_fpwm : integer range 0 to FCLK/(FPWM*(PWMRES-1)) := 0; --16 Helligkeitsstufen sind möglich. 0 aus, 15 ganz hell
16
signal s_pwmcounter : integer range 0 to PWMRES-1 := 0;
17
begin
18
19
  clock_pwm : process( clk ) --Takt teilen und pwm Vergleichsgröße rundzählen
20
  begin
21
    if( rising_edge(clk) ) then
22
        if( s_fpwm < FCLK/(FPWM*(PWMRES-1)) ) then --Grundtakt so weit Teilen, wie für 16 Stufen nötig bei der pwm Frequenz
23
          s_fpwm <= s_fpwm + 1;
24
        else 
25
          s_fpwm <= 0;
26
          if( s_pwmcounter < (PWMRES-1) ) then
27
            s_pwmcounter <= s_pwmcounter + 1; --den zähler mit der nötigen Frequenz rundzählen für den an/aus Vergleich
28
          else
29
            s_pwmcounter <= 0;
30
          end if;
31
        end if;
32
    end if;--rising edge
33
  end process clock_pwm;
34
35
  pwm_out <= '0' when s_pwmcounter > to_integer(unsigned(brightness)) else '1';
36
37
end Behavioral;

Seid nachsichtig mit mir ich hab bei der Thematik echt ein Brett vorm 
Kopf und wahrscheinlich sehe ich gar nicht, daß meine Fragezeichen blöd 
sind.
Und ich hoffe, daß irgendwer meine Verwirrung nachvollziehen kann.

Als dann danke und nen schönen Abend euch

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


Lesenswert?

olli schrieb:
> Wenn ich nun diese Komponente pwm_chan mehrfach in
> einer top entity benutzen möchte. sagen wir mal ein Vektor
> brightness[4][16] enthält halt 4 Helligkeiten und soll der Eingang für
> pwm_chan sein. Wie schreibe ich das hin? mit einer for-Schleife?
Am einfachsten instantiirst du entsprechend viele Komponenten.
Eine Möglichkeit wäre auch ein Generate...

olli schrieb:
> when s_pwmcounter > to_integer(unsigned(brightness))
Bei dieser Abfrage sollte der s_pwmcounter um eines weiter zählen können 
als brightness, denn sonst wird die LED nie ganz aus sein...

olli schrieb:
> Wann und wie weise ich das spi register am besten der brightness[] zu?
Das ist bei einer simplen LED-Ansteuerung egal. Interessanter wäre es, 
wenn du damit eine H-Brücke ansteuern würdest, und quasi mittdendrin die 
Mosfets umpolst...

von olli (Gast)


Lesenswert?

generate werde ich mich dann mal kundig machen.

Wie sieht es denn allgemein damit aus. "Erkennen" die Tools i.d.R., daß 
da ein Zähler für alle Blöcke benutzt werden kann oder werden Ressourcen 
verpulvert? Könnte ja auch mal mehr werden.

Danke für den Tip bzgl. der nie ausgehen led. ich hab das nur simuliert 
und...ehrlich gesagt 0 gar nicht probiert, lediglich Vollgas.... :-(

Angenommen es WÄRE ein Motor. Dann erst am Ende einer Periode den neuen 
Wert übernehmen, richtig?

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


Lesenswert?

olli schrieb:
> Wie sieht es denn allgemein damit aus. "Erkennen" die Tools i.d.R., daß
> da ein Zähler für alle Blöcke benutzt werden kann
Das eher nicht.

Mit doppelt vorhandener Logik kommen sie gut zurecht, aber bei FFs tun 
sie sich doch recht schwer.

> oder werden Ressourcen verpulvert?
Du solltest deinen "äusseren" Zähler besser einzeln aufbauen und manuell 
verteilen...

> Angenommen es WÄRE ein Motor. Dann erst am Ende einer Periode den neuen
> Wert übernehmen, richtig?
Im Prinzip ja. Aber dann nimmt man auch gern irgendeine symmetrische PWM 
und schaltet jeweils in den Scheitelpunkten um...

von olli (Gast)


Lesenswert?

"Du solltest deinen "äusseren" Zähler besser einzeln aufbauen und 
manuell
verteilen..."

Meinst du damit einen 50 MHz clk und entsprechendes pwm_enable in die 
pwm entity?

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


Lesenswert?

olli schrieb:
> Meinst du damit einen 50 MHz clk und entsprechendes pwm_enable in die
> pwm entity?
Ich meinte damit den Vorteiler s_fpwm. Aber ich habe mir das nochmal 
genauer angeschaut und würde es (weil fast alles statisch ist) etwa so 
machen:
1  Zähler+Vorteiler (für den Vergleichswert)
16 Vergleicher

Hier könnte bestenfalls das gleichzeitige Schalten beim Zählerreset ein 
Problem darstellen. Dann wäre es besser, das Ganze so aufzubauen:
1 Vorteiler
16 Zähler (phasenversetzt initialisiert)
16 Vergleicher

Und: ich würde da nicht so viele Module/Entities drumrum aufbauen. Das 
passt locker und luftig alles zusammen auf 1 Bildschirmseite. Warum ein 
paar Dateien draus machen?

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.