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