FPGA实验8:PWM信号发生器的设计

一、实验目的与要求

1、熟悉Quartus Ⅱ软件的基本使用方法;

2、熟悉EDA实验开发系统的基本使用方法;

3、学习VHDL程序中数据对象、数据类型、顺序语句和并行语句的综合使用。

二、实验原理

设计并调试好一个脉宽数控调制信号发生器,此信号发生器是由两个完全相同的可自加载加法计数器LCNT8组成的,它的输出信号的高/低电平脉宽可分别由两组8位预置数进行控制。用EDA实验开发系统(事先应选定拟采用的实验芯片的型号)进行硬件验证。

三、实验内容

1.系统设计思路

PWM即脉冲宽度调制,就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。PWM从处理器到被控系统信号都是数字式的,无需进行数/模转换。让信号保持为数字形式可将噪声影响降到最小,因此广泛应用在测量、通信和功率控制与变换的许多领域中。

图17-1是一种PWM(脉冲宽度调制)信号发生器的逻辑图,此信号发生器是由两个完全相同的可自加载加法计数器LCNT8组成的,它的输出信号的高、低电平脉宽可分别由两组8位预置数进行控制。

 

如果将初始值可预置的加法计数器的溢出信号作为本计数器的初始预置加载信号LD,则可构成计数初始值自加载方式的加法计数器,从而构成数控分频器。图中,D触发器的一个重要功能就是均匀输出信号的占空比,提高驱动能力,这对驱动,诸如扬声器或电动机十分重要。

2VHDL源程序

 1) 8位可自加载加法计数器的源程序LCNT8.VHD

LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    ENTITY LCNT8 IS 				--8位可自加载加法计数器
      PORT(CLK, LD: IN STD_LOGIC; 		--工作时钟/预置值加载信号
            D: IN INTEGER RANGE 0 TO 255; 	--8位分频预置数
            CAO: OUT STD_LOGIC); 		--计数溢出输出
    END ENTITY LCNT8;
    ARCHITECTURE ART OF LCNT8 IS 
      SIGNAL COUNT: INTEGER RANGE 0 TO 255; 	--8位计数器设置 
BEGIN
      PROCESS(CLK) IS
        BEGIN
        IF CLK'EVENT AND CLK='1' THEN
          IF LD='1' THEN COUNT<=D;  	--LD为高电平时加载预置数
          ELSE COUNT<=COUNT+1; 		--否则继续计数
          END IF;
        END IF;
      END PROCESS;
      PROCESS(COUNT)   IS
        BEGIN
        IF COUNT=255 THEN CAO<='1'; 	--计数满后,置于溢出位
        ELSE  CAO<='0';
        END IF;
      END PROCESS;
    END ARCHITECTURE ART; 

2) PWM信号发生器的源程序PWM.VHD

LIBRARY IEEE; 				--PWM信号发生器顶层文件
    USE IEEE.STD_LOGIC_1164.ALL;
    ENTITY PWM IS 
      PORT(CLK: IN STD_LOGIC; 		--计数时钟
            A,B: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --8位计数预置数
            PWM: OUT STD_LOGIC); 		--计数溢出并分频输出
    END ENTITY PWM;
    ARCHITECTURE ART OF PWM IS
      COMPONENT LCNT8 IS
        PORT(CLK,LD: IN STD_LOGIC; 
	D: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CAO: OUT STD_LOGIC);
      END COMPONENT LCNT8;
      SIGNAL CAO1, CAO2: STD_LOGIC;
      SIGNAL LD1,LD2: STD_LOGIC;
      SIGNAL SPWM: STD_LOGIC;
      BEGIN
      U1: LCNT8 PORT MAP(CLK=>CLK, LD=>LD1, D=>A, CAO=>CAO1);
      U2: LCNT8 PORT MAP(CLK=>CLK, LD=>LD2, D=>B, CAO=>CAO2);
     PROCESS(CAO1,CAO2)  --程序没问题,我将这里重输了一下,编译就没问题了。
        BEGIN
        IF CAO1='1' THEN SPWM<='0';
        ELSIF CAO2'EVENT AND CAO2='1' THEN SPWM<='1';
        END IF;
     END PROCESS;
      LD1<=NOT SPWM; LD2<=SPWM; PWM<=SPWM;
    END ARCHITECTURE ART;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x陌北x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值