Advertisement
cursofpgavhdl

PWM

Dec 10th, 2019
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 2.22 KB | None | 0 0
  1. library IEEE;
  2. use     IEEE.std_logic_1164.all;
  3. use     IEEE.std_logic_unsigned.all;
  4. ---------------------------------------------------------------
  5. entity PWM is
  6.  port ( CLK     : in  std_logic; -- clock 50Mhz
  7.         ENABLE  : in  std_logic; -- Liga/desliga sinal PWM
  8.         DUTY    : in  std_logic_vector (9 downto 0); -- 10bits; 1024 valores possíveis,
  9.                                                      -- vamos usar 1000, ou seja LSB 0,1% de duty
  10.         PWM_OUT : out std_logic);
  11. end entity;
  12. ---------------------------------------------------------------
  13. architecture RTL of PWM is
  14.  
  15.  --                 Fclk                            50M                               50M
  16.  -- Fpwm = ------------------------, 50 = -----------------------,  PRESCALER = ---------------- = 499
  17.  --         (TIMER + 1)*PRESCALER          (1000 + 1)*PRESCALER                 (1000 + 1)*50
  18.  --
  19.  --
  20.  -- TIMER 10bits = 1000 (constante)
  21.  --
  22.  -- DUTY X%   = Duty/TIMER*100%
  23.  
  24.  
  25.  component divisor_clk
  26.   port ( CLK_IN : in  std_logic;
  27.          Q      : out  std_logic);
  28.  end component;
  29.  
  30.  signal s_OUT_CLK  : std_logic;
  31.  signal CYCLE_OFF  : std_logic_vector (9 downto 0);
  32.  --signal s_PWM_OUT  : std_logic;
  33.  signal CONT       : std_logic_vector (9 downto 0);
  34.  constant TIMER : std_Logic_Vector (9 downto 0) := "1111101000";
  35.  
  36.  
  37.  
  38.  begin
  39.  
  40.      PRESCALER: divisor_clk port map (CLK, s_OUT_CLK);
  41.      --s_oUT_CLK <= clk;
  42.      CYCLE_OFF <= TIMER - DUTY - '1'; -- PWM invertido
  43.      
  44.      process(s_OUT_CLK,ENABLE)
  45.      variable s_PWM_OUT  : std_logic:='0';
  46.      begin
  47.          
  48.         if rising_edge(s_OUT_CLK) then
  49.          
  50.             if( ENABLE = '1' ) then
  51.              
  52.                  -- CONTA PULSOS DO CLOCK
  53.                  CONT <= CONT + '1';
  54.              
  55.                  if ( DUTY >= TIMER ) then -- MÁX PERMITIDO É 100%
  56.                  
  57.                      s_PWM_OUT:= '1';
  58.                      CONT      <= "0000000000";
  59.                      
  60.                  elsif ( CONT = CYCLE_OFF ) then -- inicia Ton
  61.                  
  62.                     s_PWM_OUT:= '1'; -- BORDA DE SUBIDA DO PWM
  63.                    
  64.                  elsif ( CONT = TIMER ) then
  65.                  
  66.                      s_PWM_OUT:= '0'; -- BORDA DE DESCIDA DO PWM
  67.                      CONT      <= "0000000000";
  68.                      
  69.                  end if;
  70.          
  71.             else -- SE ENABLE 0
  72.              s_PWM_OUT:= '0';
  73.              CONT      <= "0000000000";
  74.             end if;
  75.            
  76.         end if;
  77.        
  78.         PWM_OUT <= s_PWM_OUT;
  79.          
  80.      end process;
  81.      
  82.      
  83.      
  84.      end RTL;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement