Hi Leute,
habe ein PWM Modul geschrieben, welches in duty cycle und frequenz
einstellbar ist. Funktioniert so weit auch alles wie gewünscht.
Lediglich bei einem duty cycle von 100% (also duty_cycle = x"FF") ist
das PWM Signal nicht dauerhaft 1. Das kommt daher, dass der counter
duty_c zuerst mit dem endwert verglichen wird und dann erhöht. Jemand ne
idee wie man die 100% duty cycle noch hinbiegen kann?
und hier der vollständige code:
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.all;
|
3 | use IEEE.std_logic_unsigned.all;
|
4 | use IEEE.numeric_std.all;
|
5 |
|
6 |
|
7 | entity PWM is
|
8 | Port (en : in STD_LOGIC;
|
9 | clk : in STD_LOGIC;
|
10 | reset : in STD_LOGIC;
|
11 | duty_cycle : in STD_LOGIC_VECTOR (7 downto 0);
|
12 | freq : in STD_LOGIC_VECTOR (7 downto 0);
|
13 | pwm : out STD_LOGIC);
|
14 | end PWM;
|
15 |
|
16 | architecture Behavioral of PWM is
|
17 |
|
18 | SIGNAL duty_c : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
19 | SIGNAL cnt : STD_LOGIC_VECTOR(7 DOWNTO 0);
|
20 | SIGNAL ce : STD_LOGIC;
|
21 |
|
22 | begin
|
23 |
|
24 | -----------------------------------------------
|
25 | -- Clock enable Generator
|
26 | -----------------------------------------------
|
27 |
|
28 | PROCESS (clk)
|
29 | BEGIN
|
30 |
|
31 | IF reset = '1' THEN
|
32 | cnt <= (OTHERS => '0');
|
33 | ce <= '0';
|
34 | ELSIF rising_edge(clk) THEN
|
35 | IF en = '1' THEN
|
36 | IF cnt = freq THEN
|
37 | ce <= '1';
|
38 | cnt <= (OTHERS => '0');
|
39 | ELSE
|
40 | ce <= '0';
|
41 | cnt <= cnt + '1';
|
42 | END IF;
|
43 | ELSE
|
44 | cnt <= (OTHERS => '0');
|
45 | ce <= '0';
|
46 | END IF;
|
47 | END IF;
|
48 |
|
49 | END PROCESS;
|
50 |
|
51 | ------------------------------------------------
|
52 | -- PWM Signal Erzeugung
|
53 | ------------------------------------------------
|
54 | PROCESS (reset, clk, ce)
|
55 | BEGIN
|
56 |
|
57 | IF reset = '1' THEN
|
58 | duty_c <= (OTHERS => '0');
|
59 | pwm <= '0';
|
60 | ELSIF rising_edge(ce) THEN
|
61 | IF (en = '1') THEN
|
62 | IF (duty_c < duty_cycle) THEN
|
63 | pwm <= '1';
|
64 | ELSE
|
65 | pwm <= '0';
|
66 | END IF;
|
67 | duty_c <= duty_c + '1';
|
68 | ELSE
|
69 | pwm <= '0';
|
70 | END IF;
|
71 | END IF;
|
72 |
|
73 | END PROCESS;
|
74 |
|
75 | end Behavioral;
|