Forum: FPGA, VHDL & Co. Array in der Port-Liste der Entity


von Robert S. (razer) Benutzerseite


Lesenswert?

Hallo an alle,

Vor zwei Wochen begann ich mich mit dem Thema FPGA und VHDL zu 
beschäftigen.
Als Übung habe ich eine Mehrphasige PWM Beschreibung entworfen.

Dazu habe ich jedoch eine Frage
1
library IEEE;
2
use ieee.numeric_std.all;
3
4
package rgbdata_pgk is
5
        type pwmdata_t is array (0 to 2) of unsigned(8 downto 0);
6
end rgbdata_pgk;
7
8
library IEEE;
9
library work;
10
use work.rgbdata_pgk.all;
11
use IEEE.std_logic_1164.all;
12
use IEEE.numeric_std.all;
13
14
15
entity rgbpwm is
16
  generic(outputs : integer := 3;
17
          resolution : integer := 9);
18
  
19
  port(clk : in std_ulogic;
20
       reset : in std_ulogic;
21
       pwmdata : in pwmdata_t;
22
       pwm : out std_logic_vector(outputs-1 downto 0));
23
end rgbpwm;
24
25
architecture behaviour of rgbpwm is
26
27
signal pwm_cnt : unsigned(resolution-1 downto 0) := (others => '0');
28
signal pwm_data_i : pwmdata_t;
29
30
begin
31
  
32
  PWMCALC: process(clk, reset)
33
  begin
34
    if(reset = '1') then
35
      pwm_cnt <= (others => '0');
36
      for i in 0 to outputs-1 loop
37
        pwm_data_i(i) <= (others => '0');
38
      end loop;
39
    elsif(rising_edge(clk)) then
40
      if(pwm_cnt = 2**resolution-1) then
41
        pwm_cnt <= (others => '0');
42
        for i in 0 to outputs-1 loop
43
          pwm_data_i(i) <= pwmdata(i);
44
        end loop;
45
      else
46
        pwm_cnt <= pwm_cnt + 1;
47
      end if;
48
    end if;
49
  end process;
50
  
51
  PWMOUT: process(clk)
52
  begin
53
    for i in 0 to outputs-1 loop
54
      if(pwm_cnt>pwm_data_i(i)) then
55
        pwm(i) <= '1';
56
      else
57
        pwm(i) <= '0';
58
      end if;
59
    end loop;
60
  end process;
61
62
end behaviour;

Oben ist mein Code. Was mir nicht gefällt, ich habe das Array in einem 
Package definiert. Wenn ich jetzt die Anzahl der Phasen bzw. deren 
Auflösung ändern möchte muss ich das im Package und bei den Generics 
ändern.

Wie kann ich das machen, dass ich das nur an einer Stelle ändern muss.

Wie beurteilt ihr prinzipiell meinen Code?

Danke im Voraus
lg Robert

von dr.schmock (Gast)


Lesenswert?

du kannst die Konstanten für die Generics ja auch ins Package packen.

Wo ist die clk-Abfrage in "PWMOUT: process(clk)"?

von Robert S. (razer) Benutzerseite


Lesenswert?

dr.schmock schrieb:
> Wo ist die clk-Abfrage in "PWMOUT: process(clk)"?

Danke für den Hinweis. Mea Culpa, leider hatte ich das falsche File 
upgeloadet :/
1
 PWMOUT: process(clk)
2
  begin
3
  if(rising_edge(clk)) then
4
    for i in 0 to ouputs-1 loop
5
      if(pwm_cnt>pwm_data_i(i)) then
6
      pwm(i) <= '1';
7
      else
8
      pwm(i) <= '0';
9
      end if;
10
    end loop;
11
  end if;
12
  end process;

Durch die Definition der Konstanten kann ich die aber durch die Entity 
darüber nicht mehr konfigurieren, oder?

lg Robert

von dr.schmock (Gast)


Lesenswert?

Ich hab diese Konstanten immer bei der Instantiierung übergeben (so weit 
ich weiß).
z.B.
1
PWM_Inst : rgbpwm is
2
generic map (outputs => konst_aus_package,
3
--usw.

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.