Veränderbares PWM Signal in VHDL
Hi Leute.
Bin total am verzweifeln. Versuchen seit Tagen ein Programm zu schreiben, womit ich mit einem Tastendruck die Pulsbreite eines PWM-Signals vergrößern bzw verkleinern kann bei gleich bleibender Periodendauer.
Das PWM Signal ist kein Problem, das funks. Nur soblad ich was programmieren womit ich es ändern möchte, bricht es zusammen. wenn ich es mir am Oszi anschaue. Vielleicht kann mir jemand einen Tip gehen. Wäre super.
Quelltext von meiner Realisierung PWM(Puls 1,2ms Periode 20ms) hänge ich dran. Danke
-- STANDARD LIBRARIES --
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
-- BEGIN OF ENTITY --
ENTITY PWM_TEST IS
-- GLOBAL VARIABLE MAX-COUNT (Periodendauer 20 ms) --
GENERIC (period : INTEGER := 2000);
PORT (
-- GLOBAL CLOCK OF MAX II ALTERA --
glb_clk: IN BIT;
-- CLOCK FOR DISTANCE MEASUREMENT 100 KHz --
en: IN STD_LOGIC;
-- GLOBAL RESET USER PUSH BUTTON S1 --
nReset: IN BIT;
-- CLOCK FOR PWM-MODULATOR 50 Hz --
pwm_clk: OUT STD_LOGIC
);
END PWM_TEST;
-- END OF ENTITY --
-- BEGIN OF ARCHITECTURE --
ARCHITECTURE SCALER OF PWM_TEST IS
TYPE STATE_TYPE IS (START, MOTOR_ON, MOTOR_OFF);
SIGNAL state : STATE_TYPE;
BEGIN
PROCESS (glb_clk, en, nReset)
-- TEMPORARY VARIABLE FOR TIMING --
VARIABLE cnt : INTEGER := 0;
-- GLOBAL RESET --
BEGIN
IF (nReset = '0') THEN
cnt := 0;
state <= START;
-- GENERATING NEW CLOCK --
ELSIF (glb_clk'EVENT AND glb_clk='1') THEN
IF en = '1' THEN
IF cnt < period THEN
cnt := cnt + 1;
ELSE
cnt := 0;
END IF;
CASE state IS
WHEN START =>
IF cnt = 1 THEN
state <= MOTOR_ON;
ELSE
state <= state;
END IF;
WHEN MOTOR_ON =>
IF cnt = 122 THEN
state <= MOTOR_OFF;
ELSE
state <= state;
END IF;
WHEN MOTOR_OFF =>
state <= START;
END CASE;
END IF;
END IF;
END PROCESS;
pwm_clk <= '1' WHEN state = MOTOR_ON ELSE '0';
END SCALER;
-- END OF ARCHITECTURE --