[原创] 菜鸟上路的第二个作品,三路PWM

吴下阿蒙   2015-2-17 15:30 楼主
--三个通道的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;


回复评论 (5)

贴张图片效果会更好。。
点赞  2015-2-18 09:51
--两个通道的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;
点赞  2015-2-18 14:23
视频上传不了 pwm.png 本帖最后由 吴下阿蒙 于 2015-2-18 14:39 编辑
点赞  2015-2-18 14:27
代码的格式你是怎么保持的,我粘贴过来缩进就会乱掉
点赞  2015-4-29 23:02
高大上的VHDL
点赞  2015-4-30 13:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复