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