Перейти к содержанию
    

evgoi

Новичок*
  • Постов

    3
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Доброго всем времени суток!... Прошу помощи, мне требовалось сделать ШИМ с настройкой периода и частоты, при этом сейчас появилась необходимость добавить к уже имеющемуся коду настроечный вход типа "ПИЛЫ". Для 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;
×
×
  • Создать...