Доброго всем времени суток!...
Прошу помощи, мне требовалось сделать ШИМ с настройкой периода и частоты, при этом сейчас появилась необходимость добавить к уже имеющемуся коду настроечный вход типа "ПИЛЫ". Для 1 должна быть пила, а для 0 обратная пила.
Я даже теоретически не представляю себе как его сделать. Помогите пожалуйста дописать к уже имеющемуся коду данную настройку. Исходный код выложу ниже. Спасибо.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY pwm IS
GENERIC(
sys_clk : INTEGER := 50_000_000;
pwm_freq : INTEGER := 100_000;
bits_resolution : INTEGER := 8;
phases : INTEGER := 1);
PORT(
clk : IN STD_LOGIC;
reset_n : IN STD_LOGIC;
ena : IN STD_LOGIC;
duty : IN STD_LOGIC_VECTOR(bits_resolution-1 DOWNTO 0);
pwm_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0);
pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0));
END pwm;
ARCHITECTURE logic OF pwm IS
CONSTANT period : INTEGER := sys_clk/pwm_freq;
TYPE counters IS ARRAY (0 TO phases-1) OF INTEGER RANGE 0 TO period - 1;
SIGNAL count : counters := (OTHERS => 0);
SIGNAL half_duty : INTEGER RANGE 0 TO period/2 := 0;
BEGIN
PROCESS(clk, reset_n)
BEGIN
IF(reset_n = '0') THEN
count <= (OTHERS => 0);
pwm_out <= (OTHERS => '0');
pwm_n_out <= (OTHERS => '0');
ELSIF(clk'EVENT AND clk = '1') THEN
IF(ena = '1') THEN
half_duty <= conv_integer(duty)*period/(2**bits_resolution)/2;
END IF;
FOR i IN 0 to phases-1 LOOP
IF(count(0) = period - 1 - i*period/phases) THEN
count(i) <= 0;
ELSE
count(i) <= count(i) + 1;
END IF;
END LOOP;
FOR i IN 0 to phases-1 LOOP
IF(count(i) = half_duty) THEN
pwm_out(i) <= '0';
pwm_n_out(i) <= '1';
ELSIF(count(i) = period - half_duty) THEN
pwm_out(i) <= '1';
pwm_n_out(i) <= '0';
END IF;
END LOOP;
END IF;
END PROCESS;
END logic;