--三个通道的PWM,d1,d2,d3分别显示出不同的亮度
library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY MyPWM IS
GENERIC(n:integer:=256);
PORT
(
clk:IN std_logic; --系统时钟
d1,d2,d3:OUT std_logic --发光二极管
);
END ENTITY;
ARCHITECTURE behave OF MyPWM IS
SIGNAL tmp1,tmp2,tmp3:std_logic;
SIGNAL cnt:INteger RANGE 0 to n;
BEGIN
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
cnt<=cnt + 1;
IF cnt>=n THEN -- 一个周期开始时全部输出1
cnt<=0;
tmp1<='1';
tmp2<='1';
tmp3<='1';
ELSE
-- PWM1
IF cnt>=n/200 THEN -- 到pwm值后输出0
tmp1<='0';
END IF;
-- PWM2
IF cnt>=n/20 THEN
tmp2<='0';
END IF;
--PMW3
IF cnt>=n/2 THEN
tmp3<='0';
END IF;
END IF;
--把信号连接到发光二极管
d1<=tmp1;
d2<=tmp2;
d3<=tmp3;
END IF;
END PROCESS;
END ARCHITECTURE;
--两个通道的PWM,d1,d2渐明渐暗
library ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY Pwm2 IS
PORT
(
clk:IN std_logic; --系统时钟
d1,d2:OUT std_logic
);
END ENTITY;
ARCHITECTURE behave OF Pwm2 IS
constant Sum1:integer :=255; -- PWM精度为8位即1/256,频率为48,000,000/256=187,500Hz
constant Sum2:integer :=300000; -- 占空比自行变化的周期
constant Max_Rat:integer :=150; -- 占空比最大值
SIGNAL Cnt:integer RANGE 0 to Sum1;
SIGNAL Cnt2:integer RANGE 0 to Sum2;
SIGNAL Duty_Ratio:integer RANGE 0 to Sum1;--可变占空比
SIGNAL Flag:std_logic; --上升或下降的标志
SIGNAL Out_Tmp1,Out_Tmp2:std_logic; --临时输出状态
--variable Out_Tmp1,Out_Tmp2:bit;
BEGIN
PROCESS(clk) -- 系统时钟
BEGIN
IF rising_edge(clk) THEN --系统时钟上升沿
--占空比变化定时计数器
Cnt2<=Cnt2 + 1;
IF Cnt2>=Sum2 THEN
Cnt2<=0;
IF Duty_Ratio>=Max_Rat THEN
Duty_Ratio<=0;
Flag<=not Flag;--输出方向标志
ELSE
Duty_Ratio<=Duty_Ratio + 1;
END IF;
END IF;
-- PWM 周期计时器
Cnt<=Cnt + 1;
IF Cnt>=Sum1 THEN -- 一个新周期开始时全部输出1
Cnt<=0;
Out_Tmp1<='1';
Out_Tmp2<='1';
ELSE
-- PWM1
IF Cnt>=Duty_Ratio THEN -- 到占空比计数值后输出0
Out_Tmp1<='0';
END IF;
-- PWM2
IF Cnt>=Max_Rat-Duty_Ratio THEN
Out_Tmp2<='0';
END IF;
END IF;
-- 交换输出信号达到渐明渐暗的效果
IF Flag='1' THEN
d1<=Out_Tmp1;
d2<=Out_Tmp2;
ELSE
d1<=Out_Tmp2;
d2<=Out_Tmp1;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE;