0% encontró este documento útil (0 votos)
64 vistas37 páginas

S12 S12-Material

Este documento presenta información sobre modulación por ancho de pulso (PWM). Explica que la PWM consiste en montar un valor de voltaje estable sobre una señal digital variable para variar el voltaje promedio. Luego describe aplicaciones de la PWM como control de intensidad de luz, control de color de LED RGB y control de servomotores. Finalmente, propone diseños de circuitos en VHDL para generar señales PWM y dividir frecuencias de forma reconfigurable.

Cargado por

juantezco
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
64 vistas37 páginas

S12 S12-Material

Este documento presenta información sobre modulación por ancho de pulso (PWM). Explica que la PWM consiste en montar un valor de voltaje estable sobre una señal digital variable para variar el voltaje promedio. Luego describe aplicaciones de la PWM como control de intensidad de luz, control de color de LED RGB y control de servomotores. Finalmente, propone diseños de circuitos en VHDL para generar señales PWM y dividir frecuencias de forma reconfigurable.

Cargado por

juantezco
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 37

Diseño de Sistemas

Computacionales para
Aplicación Específica
Sesión 12
Ciclo: Agosto 2021
Logro de la sesión

Al final de la sesión el estudiante estará en capacidad de:

• Explicar las características de una señal modulada por ancho de pulso (PWM).

• Indicar las principales aplicaciones de la modulación por ancho de pulso.

• Utilizar una señal PWM para controlar la intensidad luminosa de LEDs.

• Utilizar señales PWM para controlar LEDs RGB.

• Utilizar una señal PWM para controlar la posición de un servomotor.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


Contenido de la sesión:
• Modulación por ancho de pulso (PWM)
• Aplicaciones de la PWM
• Diseño de divisor de frecuencia reconfigurable
• Control de intensidad de un LED
• Control de servomotor
• Control de LED RGB

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


1.- CONCEPTOS Y DEFINICIONES
1.1.- Modulación por ancho de pulso

¿Qués es una señal modulada por


ancho de pulso?

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


1.- CONCEPTOS Y DEFINICIONES
1.1.- Modulación por ancho de pulso (PWM)

Duty
Cycle
(%)
Amplitud

Señal PWM con sistema de primer orden


Periodo

1V

0V
Respuesta del sistema de primer orden Respuesta aproximada a la señal PWM

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


1.- CONCEPTOS Y DEFINICIONES
1.1.- Modulación por ancho de pulso (PWM)

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


1.- CONCEPTOS Y DEFINICIONES
1.1.- Modulación por ancho de pulso (PWM)

La modulación por ancho de pulso consiste en “montar” un valor de voltaje estable sobre una
señal digital variable. Ésta última consiste en una señal rectangular, con periodo fijo, llamada
señal PWM.

A pesar de que el periodo es fijo, el tiempo en ALTO de esta señal puede ser variado. Al variar el
tiempo en ALTO, se logra cambiar el voltaje promedio (DC) sobre un periodo de la señal
rectangular. Para que este cambio en el voltaje promedio tenga efecto, es necesario que el
sistema sobre el que se aplica la señal PWM presenta cierta “inercia” (resistencia al
cambio) en su salida.

El tiempo en ALTO es directamente proporcional al voltaje promedio (DC) contenido en la señal


rectangular, por lo tanto, el tiempo en ALTO puede ser empleado como un índice de la cantidad
de energía que se entrega a un sistema. Por este motivo, a la proporción entre el tiempo en
ALTO y el periodo de la señal rectangular se le conoce como ciclo de trabajo o, en Inglés, duty
cycle. Usualmente, se expresa el ciclo de trabajo en forma de porcentaje:

Ciclo de trabajo(%) = (tiempo en alto / periodo) x 100%

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


2.- APLICACIONES DE LA PWM
2.1.- Generación de señal analógica

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


2.- APLICACIONES DE LA PWM
2.2.- Control de intensidad de luz (dimmer)

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


2.- APLICACIONES DE LA PWM
2.3.- Control de color LED RGB

Control de un LED RGB con 03 señales PWM de 08 bits.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


2.- APLICACIONES DE LA PWM
2.4.- Control de servomotor

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.1.- Divisor de frecuencia reconfigurable

Antes de comenzar a diseñar circuitos para aplicaciones de PWM, es conveniente diseñar un


divisor de frecuencia configurable, el cual podremos instanciar cada vez que haga falta, por
medio del estilo de código estructural.

En este caso, diseñaremos un divisor de frecuencia que cuente con un parámetro genérico
“n_bits”, el cual indica la cantidad de bits que tiene el contador en el interior del circuito, lo cual, a
su vez, indica el valor máximo que puede alcanzar dicho contador.

Además, también se incluirá una entrada “divider”, la cual indicará el valor del divisor que se
desea aplicar a la señal de reloj original. Por ejemplo, si se desea dividir la señal original entre
10, entonces la entrada “divider” debe ser igual a 10.

El diagrama de bloques y el código VHDL correspondiente al divisor de frecuencia reconfigurable


se muestra en las siguientes diapositivas.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.1.- Divisor de frecuencia reconfigurable

Diagrama de bloques del divisor de frecuencia reconfigurable.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.1.- Divisor de frecuencia reconfigurable
--Declaracion de librerias
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;

--Declaracion de la entidad
ENTITY frequency_divider IS
GENERIC(n_bits: integer := 20);
PORT(
divider: IN unsigned((n_bits - 1) downto 0);
clk_in: IN std_logic;
clk_div: OUT std_logic
);
END frequency_divider;

--Definicion de arquitectura
ARCHITECTURE frequency_divider OF frequency_divider IS

CONSTANT UNO: unsigned((n_bits- 1) downto 0) := (0 => '1', OTHERS => '0');


SIGNAL count: unsigned((n_bits- 1) downto 0);

BEGIN

--Divisor de frecuencia
PROCESS(clk_in)
BEGIN
if(rising_edge(clk_in)) then
if(count = (divider - UNO)) then
count <= (OTHERS => '0’);
clk_div <= '1’;
else
count <= count + UNO;
clk_div <= '0’;
end if;
end if;
END PROCESS;

END frequency_divider;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.2.- Generador de señal PWM reconfigurable

Ahora que tenemos listo el divisor de frecuencia, pasaremos a diseñar un generador de señal
PWM reconfigurable, el cual podremos instanciar cada vez que haga falta, por medio del estilo
de código estructural.

Diseñaremos un generador PWM que cuente con un parámetro genérico “n_bits”, el cual indica
la cantidad de bits que tiene el contador en el interior del circuito, lo cual, a su vez, indica el valor
máximo que puede alcanzar dicho contador.

Además, también se incluirá una entrada “time_high” y una entrada “period”, las cuales indican el
tiempo en alto y el periodo, respectivamente, ambos expresados en pasos. Por ejemplo, si se
desea una señal PWM de 300 pasos con 50% de ciclo de trabajo (150 pasos), “period” debe ser
igual a 300 y “time_high” debe ser igual a 150. Evidentemente, “time_high” no puede ser mayor
que “period”.

El código VHDL correspondiente al generador PWM reconfigurable se muestra en la siguiente


diapositiva.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.2.- Generador de señal PWM reconfigurable

Diagrama de bloques del generador de señal PWM reconfigurable.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.2.- Generador de señal PWM reconfigurable

--Declaracion de librerias BEGIN


LIBRARY ieee;
USE ieee.std_logic_1164.all; --Contador
USE ieee.numeric_std.all; PROCESS(clk)
BEGIN
if(rising_edge(clk)) then
--Declaracion de la entidad if(count = (period - UNO)) then
ENTITY pwm_generator IS count <= (OTHERS => '0’);
GENERIC(n_bits: integer := 8); else
PORT( count <= count + UNO;
period: IN unsigned((n_bits - 1) downto 0); end if;
time_high: IN unsigned((n_bits - 1) downto 0); end if;
clk: IN std_logic; END PROCESS;
pwm_out: OUT std_logic
); --Comparador
END pwm_generator; pwm_out <= '1' when (count < time_high) else
'0';
--Definicion de arquitectura
ARCHITECTURE pwm_generator OF pwm_generator IS END pwm_generator;

CONSTANT UNO: unsigned((n_bits- 1) downto 0) := (0 => '1', OTHERS => '0');


SIGNAL count: unsigned((n_bits- 1) downto 0);

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.3.- Control de intensidad de un LED

El primer ejemplo aplicativo que se verá consiste en el control de intensidad luminosa de un


LED. Para ello, vamos a generar una señal PWM con un periodo de 255 pasos (constante), la
cual presente una frecuencia alrededor de los 100 KHz.

Considerando que contamos con una fuente de reloj con una frecuencia de 50 MHz, para
alcanzar los valores especificados debemos emplear un divisor de frecuencia entre 2. Este
divisor de frecuencia nos entregará una señal de reloj de 25 MHz.

Posteriormente, la señal de reloj de 25 MHz se conectará al generador PWM. Se sabe que la


frecuencia de la señal PWM será igual a la frecuencia de reloj del generador PWM, dividido entre
el número de pasos del periodo, lo cual da resultado 98.00 KHz, aproximadamente.

El tiempo en alto del generador PWM se controlará mediante una entrada llamada
“INTENSIDAD”, la cual irá conectada a unos interruptores, y la salida “pwm_out” del generador
PWM se conectará a una salida llamada “LED”.

El diagrama de bloques y el código VHDL, correspondientes a este circuito, se muestran en las


siguientes diapositivas.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.3.- Control de intensidad de un LED

Diagrama de bloques del circuito para control de intensidad luminosa de LED.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.3.- Control de intensidad de un LED

--Declaracion de librerias COMPONENT pwm_generator IS


LIBRARY ieee; GENERIC(n_bits: integer := 8);
USE ieee.std_logic_1164.all; PORT(
USE ieee.numeric_std.all; period: IN unsigned((n_bits - 1) downto 0);
time_high: IN unsigned((n_bits - 1) downto 0);
clk: IN std_logic;
--Declaracion de la entidad pwm_out: OUT std_logic
ENTITY control_led IS );
PORT( END COMPONENT;
intensidad: IN unsigned(7 downto 0);
clk: IN std_logic; --Declaración de señales
led: OUT std_logic SIGNAL clk_div: std_logic;
);
END control_led; BEGIN
--Definicion de arquitectura U1: frequency_divider GENERIC MAP(n_bits => 2)
ARCHITECTURE control_led OF control_led IS PORT MAP(divider => "10", clk_in => clk, clk_div => clk_div);
U2: pwm_generator GENERIC MAP(n_bits => 8)
--Declaración de componentes PORT MAP(period => x"FF", time_high => intensidad, clk => clk_div,
COMPONENT frequency_divider IS pwm_out => led);
GENERIC(n_bits: integer := 20);
PORT( END control_led;
divider: IN unsigned((n_bits - 1) downto 0);
clk_in: IN std_logic;
clk_div: OUT std_logic
);
END COMPONENT;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.4.- Control de un servomotor

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.4.- Control de un servomotor

Para poder controlar un servomotor, es necesario generar una señal PWM con un periodo
específico y con un tiempo en ALTO que se encuentre dentro de un rango específico.

El servomotor que controlaremos en nuestro ejemplo, requiere una señal PWM con un periodo
de 20 ms. Asimismo, el tiempo en ALTO puede variar en el intervalo desde los 0.5 ms hasta los
2.5 ms.

Considerando que contamos con una fuente de reloj con una frecuencia de 50 MHz,
emplearemos un divisor de frecuencia entre 50, el cual nos entregará una señal de 1 MHz.
Posteriormente, conectaremos dicha señal a la entrada de reloj de un generador PWM con un
periodo de 20 000 pasos. Esto nos dará como resultado una señal PWM con periodo de 20 ms.

Esta vez, los valores del tiempo en alto no serán ingresados mediante interruptores, sino que
serán extraídos de una ROM de 4x16 bits, la cual almacenará los valores necesarios para que el
servomotor se ubique en las posiciones 0°, 60°, 120° y 180°. Accederemos a cada uno de los
valores almacenados a través de interruptores, la señal de reloj de la ROM será generada con
un pulsador.

El diagrama de bloques y código VHDL correspondientes se muestran a continuación.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.4.- Control de un servomotor

Diagrama de bloques del circuito para control de servomotor.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.4.- Control de un servomotor

--Declaracion de librerías
LIBRARY ieee; CONSTANT my_memory: vector_array := (x“01F4", --0°
USE ieee.std_logic_1164.all; x“048F", --60°
USE ieee.numeric_std.all; x“072A“, --120°
x“09C4“ —180°
--Definición de la interfaz );
ENTITY my_rom IS

GENERIC( BEGIN
ADDR_BITS: integer := 2;
DATA_BITS: integer := 16 PROCESS(clk)
); BEGIN

PORT( if(rising_edge(clk)) then


clk, en: IN std_logic; if(en='1') then
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0); data_bus <= my_memory(to_integer(addr_bus));
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0) else
); data_bus <= (OTHERS => ‘Z’);
END my_rom; end if;

--Definición de la arquitectura end if;


ARCHITECTURE my_rom OF my_rom IS
END PROCESS;
TYPE vector_array is array(0 to ((2**ADDR_BITS) - 1)) of
std_logic_vector((DATA_BITS- 1) downto 0); END my_rom;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.4.- Control de un servomotor
--Declaracion de librerias COMPONENT my_rom IS
LIBRARY ieee; GENERIC(
USE ieee.std_logic_1164.all; ADDR_BITS: integer := 2;
USE ieee.numeric_std.all; DATA_BITS: integer := 16
);
PORT(
--Declaracion de la entidad clk, en: IN std_logic;
ENTITY control_servo IS addr_bus: IN unsigned((ADDR_BITS - 1) downto 0);
PORT( data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0)
position: IN unsigned(1 downto 0); );
clk, rom_clk: IN std_logic; END COMPONENT;
servo: OUT std_logic
); --Declaración de señales
END control_servo; SIGNAL clk_div: std_logic;
SIGNAL time_h: std_logic_vector(15 downto 0);
--Definicion de arquitectura
ARCHITECTURE control_servo OF control_servo IS BEGIN

--Declaración de componentes U1: frequency_divider GENERIC MAP(n_bits => 8)


COMPONENT frequency_divider IS PORT MAP(divider => x"32", clk_in => clk, clk_div => clk_div);
GENERIC(n_bits: integer := 20); U2: pwm_generator GENERIC MAP(n_bits => 16)
PORT( PORT MAP(period => x"4E20", time_high => unsigned(time_h), clk => clk_div,
divider: IN unsigned((n_bits - 1) downto 0); pwm_out => servo);
clk_in: IN std_logic; U3: my_rom PORT MAP(clk => rom_clk, en => '1', addr_bus => position, data_bus =>
clk_div: OUT std_logic time_h);
);
END COMPONENT; END control_servo;

COMPONENT pwm_generator IS
GENERIC(n_bits: integer := 8);
PORT(
period: IN unsigned((n_bits - 1) downto 0);
time_high: IN unsigned((n_bits - 1) downto 0);
clk: IN std_logic;
pwm_out: OUT std_logic
);
END COMPONENT;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

Control de un LED RGB con 03 señales PWM de 08 bits.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

Como último ejemplo de las aplicaciones de las señales PWM, tenemos el control de un LED
RGB, el cual nos permitirá generar diferentes colores, en base a los colores primarios ROJO
(R),VERDE (G) y AZUL (B).

El objetivo es generar 04 colores compuestos, para lo cual emplearemos una ROM de 4x8 bits
para cada color primario, 03 ROM en total. Asimismo, utilizaremos el divisor de frecuencia y el
generador PWM empleados en el primer ejemplo.

Se debe tomar en cuenta que el LED que se utilizará para este ejercicio es del tipo ánodo
común, lo cual quiere decir que cada color primario se activará con un nivel lógico de ‘0’. Por
este motivo, será necesario agregar inversores en serie con las salidas PWM.

El diagrama de bloques y el código VHDL correspondiente a este circuito se encuentran en la


siguientes diapositivas.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

Diagrama de bloques del circuito para control de un LED RGB tipo ánodo común.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

--Declaracion de librerías
LIBRARY ieee; CONSTANT my_memory: vector_array := (x“FF", --ROJO
USE ieee.std_logic_1164.all; x“00", --VERDE
USE ieee.numeric_std.all; x“FF“, --AMARILLO
x“30“ —MORADO
--Definición de la interfaz );
ENTITY r_rom IS

GENERIC( BEGIN
ADDR_BITS: integer := 2;
DATA_BITS: integer := 8 PROCESS(clk)
); BEGIN

PORT( if(rising_edge(clk)) then


clk, en: IN std_logic; if(en='1') then
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0); data_bus <= my_memory(to_integer(addr_bus));
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0) else
); data_bus <= (OTHERS => ‘Z’);
END r_rom; end if;

--Definición de la arquitectura end if;


ARCHITECTURE r_rom OF r_rom IS
END PROCESS;
TYPE vector_array is array(0 to ((2**ADDR_BITS) - 1)) of
std_logic_vector((DATA_BITS- 1) downto 0); END r_rom;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

--Declaracion de librerías
LIBRARY ieee; CONSTANT my_memory: vector_array := (x“00", --ROJO
USE ieee.std_logic_1164.all; x“FF", --VERDE
USE ieee.numeric_std.all; x“FF“, --AMARILLO
x“00“ —MORADO
--Definición de la interfaz );
ENTITY g_rom IS

GENERIC( BEGIN
ADDR_BITS: integer := 2;
DATA_BITS: integer := 8 PROCESS(clk)
); BEGIN

PORT( if(rising_edge(clk)) then


clk, en: IN std_logic; if(en='1') then
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0); data_bus <= my_memory(to_integer(addr_bus));
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0) else
); data_bus <= (OTHERS => ‘Z’);
END g_rom; end if;

--Definición de la arquitectura end if;


ARCHITECTURE g_rom OF g_rom IS
END PROCESS;
TYPE vector_array is array(0 to ((2**ADDR_BITS) - 1)) of
std_logic_vector((DATA_BITS- 1) downto 0); END g_rom;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

--Declaracion de librerías
LIBRARY ieee; CONSTANT my_memory: vector_array := (x“00", --ROJO
USE ieee.std_logic_1164.all; x“00", --VERDE
USE ieee.numeric_std.all; x“00“, --AMARILLO
x“FF“ —MORADO
--Definición de la interfaz );
ENTITY b_rom IS

GENERIC( BEGIN
ADDR_BITS: integer := 2;
DATA_BITS: integer := 8 PROCESS(clk)
); BEGIN

PORT( if(rising_edge(clk)) then


clk, en: IN std_logic; if(en='1') then
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0); data_bus <= my_memory(to_integer(addr_bus));
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0) else
); data_bus <= (OTHERS => ‘Z’);
END b_rom; end if;

--Definición de la arquitectura end if;


ARCHITECTURE b_rom OF b_rom IS
END PROCESS;
TYPE vector_array is array(0 to ((2**ADDR_BITS) - 1)) of
std_logic_vector((DATA_BITS- 1) downto 0); END b_rom;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB
COMPONENT pwm_generator IS
GENERIC(n_bits: integer := 8);
PORT(
--Declaracion de librerias period: IN unsigned((n_bits - 1) downto 0);
LIBRARY ieee; time_high: IN unsigned((n_bits - 1) downto 0);
USE ieee.std_logic_1164.all; clk: IN std_logic;
USE ieee.numeric_std.all; pwm_out: OUT std_logic
);
END COMPONENT;
--Declaracion de la entidad
ENTITY rgb_led_control IS COMPONENT r_rom IS
PORT( GENERIC(
color: IN unsigned(1 downto 0); ADDR_BITS: integer := 2;
clk, rom_clk: IN std_logic; DATA_BITS: integer := 8
led_r,led_g,led_b: OUT std_logic );
); PORT(
END rgb_led_control; clk, en: IN std_logic;
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0);
--Definicion de arquitectura data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0)
ARCHITECTURE rgb_led_control OF rgb_led_control IS );
END COMPONENT;
--Declaración de componentes
COMPONENT frequency_divider IS COMPONENT g_rom IS
GENERIC(n_bits: integer := 20); GENERIC(
PORT( ADDR_BITS: integer := 2;
divider: IN unsigned((n_bits - 1) downto 0); DATA_BITS: integer := 8
clk_in: IN std_logic; );
clk_div: OUT std_logic PORT(
); clk, en: IN std_logic;
END COMPONENT; addr_bus: IN unsigned((ADDR_BITS - 1) downto 0);
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0)
);
END COMPONENT;

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


3.- APLICACIONES CON VHDL
3.5.- Control de LED RGB

COMPONENT b_rom IS U5: r_rom PORT MAP(clk => rom_clk, en => '1', addr_bus => color, data_bus
GENERIC( => time_h_r);
ADDR_BITS: integer := 2; U6: g_rom PORT MAP(clk => rom_clk, en => '1', addr_bus => color, data_bus
DATA_BITS: integer := 8 => time_h_g);
); U7: b_rom PORT MAP(clk => rom_clk, en => '1', addr_bus => color, data_bus
PORT( => time_h_b);
clk, en: IN std_logic;
addr_bus: IN unsigned((ADDR_BITS - 1) downto 0); led_r <= NOT pwm_r;
data_bus: OUT std_logic_vector((DATA_BITS - 1) downto 0) led_g <= NOT pwm_g;
); led_b <= NOT pwm_b;
END COMPONENT;
END rgb_led_control;
--Declaración de señales
SIGNAL clk_div: std_logic;
SIGNAL time_h_r, time_h_g, time_h_b: std_logic_vector(7 downto 0);
SIGNAL pwm_r, pwm_g, pwm_b: std_logic;

BEGIN

U1: frequency_divider GENERIC MAP(n_bits => 2)


PORT MAP(divider => "10", clk_in => clk, clk_div => clk_div);

U2: pwm_generator GENERIC MAP(n_bits => 8)


PORT MAP(period => x"FF", time_high => unsigned(time_h_r), clk =>
clk_div, pwm_out => pwm_r);
U3: pwm_generator GENERIC MAP(n_bits => 8)
PORT MAP(period => x"FF", time_high => unsigned(time_h_g), clk =>
clk_div, pwm_out => pwm_g);
U4: pwm_generator GENERIC MAP(n_bits => 8)
PORT MAP(period => x"FF", time_high => unsigned(time_h_b), clk =>
clk_div, pwm_out => pwm_b);

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


4.- CONCLUSIONES

• La modulación por ancho de pulso permite generar niveles de voltaje analógico en base a niveles
de voltaje digitales.

• Para definir una señal PWM es necesario establecer el periodo (fijo) y el tiempo en ALTO de la
señal.

• Es común que, en aplicaciones embebidas, los términos “ciclo de trabajo” y “tiempo en alto” se
utilicen de forma intercambiable.

• En muchas ocasiones, resulta conveniente guardar valores de ciclo de trabajo pre-calculados en


memorias, para poder extraerlos posteriormente.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


5.- REFERENCIAS

[1] Thomas L. Floyd, Fundamentos de sistemas digitales, Novena Edición,


Prentice Hall, 2006.

[2] Stephen Brown & Zvonko Vranesic, Fundamentos de lógica digital con
diseño VHDL, Segunda Edición, McGraw Hill, 2006.

[3] Volnei A. Pedroni, Circuit Design with VHDL, Third Edition, The MIT
Press, 2020.

[4] Frank Vahid, Digital Design with RTL Design, VHDL and Verilog, John
Wiley & Sons, Second Edition, 2011.

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso


6- PREGUNTAS

DISEÑO DE SISTEMAS COMPUTACIONALES S12.s12 – Modulación por ancho de pulso

También podría gustarte