脉冲宽度调制(PWM)信号发生器的设计,包含三个主要模块:PULSE、LCNT8和CLKCTL。
CLK_10: 从CLKCTL得到的10倍频率时钟输出。
CAO1, CAO2: 从两个计数器输出的进位信号,指示是否达到设定计数。
LD1, LD2: 控制信号,决定是否加载数据到计数器。
PINT: 中间信号,用于决定 POUT 的值。
当 RESET_N 为低时,计数器复位;
当时钟上升沿到来时:
如果 LD 为高,CAO 设为低;
如果 COUNT 等于 D,则计数器复位并设置 CAO 为高;
否则,COUNT 加1。
当 RESET_N 为低时,cnt 复位;
在时钟上升沿到来时,如果 cnt 达到5000000(假设输入时钟频率为50MHz),将 cnt 复位并切换 CLKOUT 的状态。
操作方法与实验步骤
1)启动QUARTUS II软件
2)选择软件中的菜单 File>New Project Wizard,按照新建一个名为“PULSE”工程。
3)运用 VHDL或运用原理图描述正负脉宽数控调制信号发生器。
4)对设计文件进行编译,Quartus II编译器窗口包含了对设计文件处理的全过程。在Quartus II软件中选择 Processing>Start Compliation,则出现 Quartus II的编译器窗口。选择:Processing->Start Compilation进行编译。详细操作请参考 “1.3.3 对设计文件进行编译”
5)对设计的电路进行时序仿真,验证设计是否正确;然后将程序下载到实验箱之中进行硬件验证。按照“1.3.5对设计文件进行仿真”步骤进行仿真验证。
6)完成仿真设计后,再进行编译。选择Processing/Start Compilation。
7)在前面选择好一个合适的目标器件(在这个实验中选择为EP5CSEMA5F31C6),完成设计的分析综合过程,得到工程的数据文件以后,需要对设计中的输入、输出引脚指定到具体的器件管脚号码,指定管脚号码称为管脚分配或管脚锁定。这里介绍如下方法进行管脚锁定。
点击 Assignments菜单下面的Pin Planner,进入到引脚分配窗口。依照下表对所有端口进行管脚分配,如图所示。
在这里插入图片描述

所有引脚全部分配结束后的软件窗口
8)再次编译,值得注意的是,当管脚分配完之后一定要进行再进行一次全编译,以使分配的管脚有效,全局编译。Processing->Start Compilation。
9)按照“1.3.6 从设计文件到目标器件的加载”完成下载
10)实验现象:A是SW[3…0]和B是SW[9…6]拨码开关,对应两个输入,控制脉冲宽度的输出,改变拨码开关位置,观察输出引脚波形情况。

附录1:命名PULSE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY PULSE IS 
PORT (CLK:IN STD_LOGIC;
		RESET_N:IN STD_LOGIC;
      A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
       POUT:OUT STD_LOGIC);
 END ENTITY PULSE;
 ARCHITECTURE ART OF PULSE IS
     COMPONENT LCNT8 IS
       PORT(CLK,LD:IN STD_LOGIC;
				RESET_N:IN STD_LOGIC;
             D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
             CAO:OUT STD_LOGIC);
     END COMPONENT LCNT8;
	  COMPONENT CLKCTL IS
		PORT(CLKIN,RESET_N:IN STD_LOGIC;
			  CLKOUT:OUT STD_LOGIC);
		END COMPONENT CLKCTL;
	 SIGNAL CLK_10:STD_LOGIC;
    SIGNAL CAO1,CAO2:STD_LOGIC;
    SIGNAL LD1,LD2:STD_LOGIC;
    SIGNAL PINT: STD_LOGIC;
    BEGIN
	 U0: CLKCTL PORT MAP(CLKIN=>CLK,RESET_N=>RESET_N,CLKOUT=>CLK_10);
    U1: LCNT8 PORT MAP(CLK=>CLK_10,RESET_N=>RESET_N,LD=>LD1,D=>A,CAO=>CAO1);
    U2: LCNT8 PORT MAP(CLK=>CLK_10,RESET_n=>RESET_N,LD=>LD2,D=>B,CAO=>CAO2);
    PROCESS(CAO1,CAO2) IS
     BEGIN
        IF CAO1='1' THEN PINT<='0';
       ELSIF CAO2='1'  THEN  PINT<='1'; 
       END IF;
    END PROCESS ;
       LD1<=NOT(PINT);
       LD2<=PINT;
       POUT<=PINT;
  END ARCHITECTURE ART;
附录2:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
   USE ieee.std_logic_unsigned.all;
ENTITY LCNT8 IS
    PORT(CLK,LD:IN STD_LOGIC;
			RESET_N:IN STD_LOGIC;
          D: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
          CAO: OUT STD_LOGIC);
 END ENTITY LCNT8;
ARCHITECTURE ART OF LCNT8 IS
    SIGNAL COUNT: STD_LOGIC_VECTOR(3 DOWNTO 0);
  BEGIN
   PROCESS (CLK, RESET_N)
   BEGIN
      IF ((NOT(RESET_N)) = '1') THEN
         COUNT <= "0000";
      ELSIF (CLK'EVENT AND CLK = '1') THEN
         IF (LD = '1') THEN
            CAO <= '0';
         ELSIF (D = COUNT) THEN
               COUNT <= "0000";
               CAO <= '1';
            ELSE
               COUNT <= COUNT + "0001";
            END IF;
         END IF;
   END PROCESS;
 END ARCHITECTURE ART;
附录3:
LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;

ENTITY CLKCTL IS
   PORT (
      CLKIN    : IN STD_LOGIC;
      RESET_N  : IN STD_LOGIC;
      CLKOUT   : buffer STD_LOGIC
   );
END ENTITY CLKCTL;

ARCHITECTURE ART OF CLKCTL IS
   
   SIGNAL cnt          : STD_LOGIC_VECTOR(22 DOWNTO 0);
   
BEGIN
   PROCESS (CLKIN, RESET_N)
   BEGIN
      IF (RESET_N = '0') THEN
         cnt <= "00000000000000000000000";
      ELSIF (CLKIN'EVENT AND CLKIN = '1') THEN
         IF (cnt = 5000000) THEN
            cnt <= "00000000000000000000000";
            CLKOUT <= NOT(CLKOUT);
         ELSE
            cnt <= cnt + '1';
         END IF;
      END IF;
   END PROCESS;
   
   
END ARCHITECTURE ART;

四、实验结果分析及讨论
功能验证:
信号生成:在实验中,使用示波器观察 POUT 输出信号。应能确认 POUT 的波形具有预期的占空比和频率,且可以通过不同的输入数据 A 和 B 调节脉冲宽度。
计数器功能:分别测试LCNT8模块,确认其在LD信号激活时能够正确加载数据D,并当计数器达到设定值时,CAO信号能正确输出高电平。
时钟频率变换:通过CLKCTL模块生成的CLKOUT时钟信号应能验证分频功能,适当地将输入时钟频率降低(例如,从50MHz降到5Hz),确保可以驱动后续计数逻辑。
脉冲特性:
占空比调节:通过给A和B信号赋不同的值,观察POUT信号的占空比变化。占空比的变化应与输入信号A和B的计数分别相对应。
脉冲频率:POUT信号的频率取决于CLK_10和计数器的设置。实验中记录下不同输入条件下的POUT频率,并确认其符合设计预期。
实验结果表明,该设计能够正确生成PWM信号,输入数据A和B的变化会直接影响输出POUT的脉冲宽度和频率,这验证了模块间信息传递与逻辑控制的有效性。
通过实验,可以验证该代码实现的PWM信号发生器的正确性和有效性。实验结果不仅确认了设计目标,还为后续的优化和改进提供了依据。如在实验中遇到特定问题,可以针对性地进行调试与改善。进一步的实验可以扩展模块的复杂性,增加更多功能并优化设计。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐