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

evgoi

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

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

  • Посещение

Сообщения, опубликованные evgoi


  1. не надо трогать этот модуль

    надо сделать модуль обертку, который будет подавать увеличивающийся или уменьшающийся счетчик на вход этого модуля.

    Спасибо!...А как это сделать не подскажите?

  2. Доброго всем времени суток!...

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

×
×
  • Создать...