Autor Tema: Mejorando un PWM  (Leído 5813 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Mejorando un PWM
« en: 18 de Abril de 2012, 20:37:33 »
Hola  :)

Recién terminé este PWM súper sencillo y pues ya está sintetizado y funcionando como esperaba. Me gustaría preguntarles si ustedes le ven áreas de mejora al código... si está ocupando mucho de la FPGA, o si se puede hacer más rápido, optimizarlo, no sé, los típicos comentarios que luego los gurús nos hacen a los noobs jejeje

El PWM solito ocupa los siguientes porcentajes de la Cyclone IV...

Flow Status   Successful - Wed Apr 18 18:28:34 2012
Quartus II 32-bit Version   11.1 Build 259 01/25/2012 SP 2 SJ Web Edition
Revision Name   pwm_test
Top-level Entity Name   PWM
Family   Cyclone IV E
Device   EP4CE22F17C6
Timing Models   Final
Total logic elements   128 / 22,320 ( < 1 % )
Total combinational functions   128 / 22,320 ( < 1 % )
Dedicated logic registers   33 / 22,320 ( < 1 % )
Total registers   33
Total pins   66 / 154 ( 43 % )
Total virtual pins   0
Total memory bits   0 / 608,256 ( 0 % )
Embedded Multiplier 9-bit elements   0 / 132 ( 0 % )
Total PLLs   0 / 4 ( 0 % )

Y el código es...

Código: [Seleccionar]
--PWM

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PWM is
  port (
   clk : in std_logic;
period : IN STD_LOGIC_VECTOR (31 downto 0);
   duty_cycle : IN STD_LOGIC_VECTOR (31 downto 0);
--count_out : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); --Debug
   pwm_out : out STD_LOGIC
  );
end PWM;

architecture behavior of PWM is
  
begin
  process(clk, period, duty_cycle)
  
  variable  count : std_logic_vector(31 downto 0) := "00000000000000000000000000000000";
  
  begin

    if rising_edge(clk) then
count := count + 1;

if(count >= period) then
count := "00000000000000000000000000000000";
end if;

if(count >= duty_cycle) then
pwm_out <= '0';
else
pwm_out <= '1';
end if;

    end if;

--Debug
--count_out <= count;

  end process;

end behavior;

Gracias =)

Desconectado Chipcon

  • PIC12
  • **
  • Mensajes: 63
Re: Mejorando un PWM
« Respuesta #1 en: 23 de Abril de 2012, 15:07:27 »
Que tal mig el código esta bien pero si quieres evitar poner tantos cerosssssssss a una variable o señal puedes
utilizar la palabra OTHERS esto quedaría así;

count := (others => '0');
count_out <= (others => '0');

Indica que se asigne a 0 a todos los bits,creo es mejor que estar contado ceros mas para el caso de ese tipo variables o señales con un ancho de bits enorme.
También es valido utilizar un valor hexadecimal si tu señal o variable es múltiplo y es anteponiendo la x.

count := x"00000000"; 
count_out <= x"00000000";

Finalmente creo la bifurcación puede ser if elsif else ejemplo;

                if (count >= period) then
         count := (others => '0');
      
      elsif (count >= duty_cycle) then
         pwm_out <= '0';

      else
         pwm_out <= '1';
      end if;

finalmente solo es un consejo que elimina un par de lineas o mejora la legibilidad del código, pero definitivamente la mejor optimización es la manera en que uno resuelve la tarea y como cualquier lenguaje solo se logra con practica.
Saludos cordiales

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Mejorando un PWM
« Respuesta #2 en: 23 de Abril de 2012, 15:53:45 »
Hola Chipcon  :mrgreen:

Gracias por responder. Tienes razón, los cambios que sugieres no mejoran u optimizan el uso de la FPGA, me salieron los mismos resultados en la síntesis, pero hicieron más legible el programa.

¿Qué ejercicios me recomendarías para seguir practicando con VHDL?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Mejorando un PWM
« Respuesta #3 en: 24 de Abril de 2012, 13:05:25 »
los típicos comentarios que luego los gurús nos hacen a los noobs jejeje



creo que el tu serias uno de los gurus  ;-), ya que esto me parece será un minicurso en futuras referencias.

se me ocurren como ejemplos el uso de un teclado matricial y una lcd



"Nada es imposible, no si puedes imaginarlo"

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Mejorando un PWM
« Respuesta #4 en: 24 de Abril de 2012, 13:52:51 »
jaja bueno fuera pero en cuestiones de VHDL sintetizable me falta mucho, por eso es que pido la opinión de los demás.

Lo más complicado que he querido hacer fue un SPI con una máquina de estados Moore... pero hacía puras locuras =(

Desconectado Chipcon

  • PIC12
  • **
  • Mensajes: 63
Re: Mejorando un PWM
« Respuesta #5 en: 25 de Abril de 2012, 20:15:52 »
andaba un poco desconectado, pues en mi caso inicie haciendo un contador cíclico, que lo hice en la tarjeta spartan 3A, utilizando 3 dígitos de 7 segmentos.
me sirvió mucho pues hice mi base de tiempo de 1 segundo, y lo mas interesante es como hacer el barrido multiplexado
ya que puedes hacerlo en forma secuencial  o concurrente.

tanto en ALTERA como XILINX puedes revisar algunas notas de aplicación sobre el tema.
dejame ver si encuentro el link para que le des una hojeada.
Saludos




 

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Mejorando un PWM
« Respuesta #6 en: 25 de Abril de 2012, 22:38:44 »
Sí, conozco los tutoriales de Altera, están muy bien. Ya he visto un par... sólo que están muuuy largos jeje

Voy a hacer un SPI otra vez, para leer el ADC de mi entrenadora. Ya les cuento cómo me va.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mejorando un PWM
« Respuesta #7 en: 06 de Mayo de 2012, 21:39:15 »
Llegaron mis nuevos "juguetes"  :mrgreen:


Me acorde y mire tu PWM. Lo único que agregaría es en la entidad, dentro de un generic definir la resolución. De esa manera es un módulo más flexible, si quieres un PWM de otra resolución no andas buscando donde dice 31  ;-)

Código: VHDL
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.all;
  3. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  4.  
  5. entity PWM is
  6.         generic(
  7.                 RESOLUCION: integer:=32
  8.         );
  9.         port (
  10.                 clk: in std_logic;
  11.                 period: IN STD_LOGIC_VECTOR (RESOLUCION-1 downto 0);
  12.                 duty_cycle: IN STD_LOGIC_VECTOR (RESOLUCION-1 downto 0);
  13.                 pwm_out: out STD_LOGIC
  14.         );
  15. end PWM;
  16.  
  17. architecture behavior of PWM is
  18.  
  19. begin
  20.   process(clk, period, duty_cycle)  
  21.   variable  count: std_logic_vector(RESOLUCION-1 downto 0):= (others => '0');
  22.  
  23.   begin
  24.     if rising_edge(clk) then
  25.                 count:= count + 1;             
  26.                 if(count >= period) then
  27.                         count:= (others => '0');
  28.                 end if;        
  29.                 if(count >= duty_cycle) then
  30.                         pwm_out <= '0';
  31.                 else
  32.                         pwm_out <= '1';
  33.                 end if;        
  34.     end if;    
  35.   end process;
  36.  
  37. end behavior;

A practicar  :) Porque si que soy noobs en esto  :tongue:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Mejorando un PWM
« Respuesta #8 en: 07 de Mayo de 2012, 11:12:17 »
Es cierto, es configurable de esa manera.  :mrgreen:

Cyclone II... de lujo  ;-)


 

anything