My title page contents

SPWM发生器VHDL正弦波脉宽调制频率相位可调仿真

名称:SPWM发生器VHDL正弦波脉宽调制频率相位可调仿真(代码在文末下载)

软件:Quartus II

语言:VHDL

代码功能:

        完成基于FPGA的SPWM发生器的设计,编写VHDL语言程序并调试,实现SPWM发生器的设计,可以输出三路频率和相位可调的SPWM信号。

       实现的方法:分别产生正弦波和三角波,将正弦波和三角波进行比较,得到SPWM波形


FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com


演示视频:

设计文档:

设计文档.doc

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 仿真图

整体仿真图

部分波形放大

相位累加器模块

初相位调整模块

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
--三路spwm波
ENTITY Sweep_frequency IS
   PORT (
      clk              : IN STD_LOGIC;--时钟
  sin_freq_1         : IN STD_LOGIC_VECTOR (9 DOWNTO 0);--频率控制字1
  sin_freq_2         : IN STD_LOGIC_VECTOR (9 DOWNTO 0);--频率控制字2
  sin_freq_3         : IN STD_LOGIC_VECTOR (9 DOWNTO 0);--频率控制字3
  phase_1          : IN STD_LOGIC_VECTOR(9 DOWNTO 0);--相位控制字1
  phase_2          : IN STD_LOGIC_VECTOR(9 DOWNTO 0);--相位控制字2
  phase_3          : IN STD_LOGIC_VECTOR(9 DOWNTO 0);--相位控制字3
      PWM_wave1        : OUT STD_LOGIC;--输出PWM波形1
  PWM_wave2        : OUT STD_LOGIC;--输出PWM波形2
  PWM_wave3        : OUT STD_LOGIC --输出PWM波形3
   );
END Sweep_frequency;
ARCHITECTURE behavioral OF Sweep_frequency IS
--sin ROM表
COMPONENT sin_ROM IS
PORT
(
address: IN STD_LOGIC_VECTOR (9 DOWNTO 0);
clock: IN STD_LOGIC  := '1';
q: OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END COMPONENT;
--三角波 ROM表
COMPONENT triangle_ROM IS
PORT
(
address: IN STD_LOGIC_VECTOR (9 DOWNTO 0);
clock: IN STD_LOGIC  := '1';
q: OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END COMPONENT;
 --相位累加器
   COMPONENT Freq_sum IS
      PORT (
         clk             : IN STD_LOGIC;
         freq_data       : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
         freq_out        : OUT STD_LOGIC_VECTOR(9 DOWNTO 0)
      );
   END COMPONENT;
--初相位调整
COMPONENT phase_crtl IS
   PORT (
      clk         : IN STD_LOGIC;
      freq_out    : IN STD_LOGIC_VECTOR(9 DOWNTO 0);--相位累加器输出
      phase_data  : IN STD_LOGIC_VECTOR(9 DOWNTO 0);--相位控制字10bit
      address     : OUT STD_LOGIC_VECTOR(9 DOWNTO 0)--查找表地址
   );
END COMPONENT;
   
   SIGNAL address_1  : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL address_2  : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL address_3  : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL freq_out_sin_1  : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL freq_out_sin_2  : STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL freq_out_sin_3  : STD_LOGIC_VECTOR(9 DOWNTO 0);
   SIGNAL q_sin1         : STD_LOGIC_VECTOR(9 DOWNTO 0);--ROM输出波形
SIGNAL q_sin2         : STD_LOGIC_VECTOR(9 DOWNTO 0);--ROM输出波形
SIGNAL q_sin3         : STD_LOGIC_VECTOR(9 DOWNTO 0);--ROM输出波形
   SIGNAL freq_out_triangle  : STD_LOGIC_VECTOR(9 DOWNTO 0);
   SIGNAL q_triangle         : STD_LOGIC_VECTOR(9 DOWNTO 0);--ROM输出波形
BEGIN
   
   
   --sin存储Rom表
   i1_sin_ROM : sin_ROM
      PORT MAP (
         address  => address_1,--查找表地址
         clock    => clk,--时钟
         q        => q_sin1--输出波形
      );
   --sin存储Rom表
   i2_sin_ROM : sin_ROM
      PORT MAP (
         address  => address_2,--查找表地址
         clock    => clk,--时钟
         q        => q_sin2--输出波形
      );
   --sin存储Rom表
   i3_sin_ROM : sin_ROM
      PORT MAP (
         address  => address_3,--查找表地址
         clock    => clk,--时钟
         q        => q_sin3--输出波形
      );
   --triangle存储Rom表
   i_triangle_ROM : triangle_ROM
      PORT MAP (
         address  => freq_out_triangle,--查找表地址
         clock    => clk,--时钟
         q        => q_triangle--输出波形
      );
   
   --正弦波相位累加器--频率控制
   i1_Freq_sum : Freq_sum
      PORT MAP (
         clk        => clk,
         freq_data  => sin_freq_1,--频率控制字10bit----1
         freq_out   => freq_out_sin_1--累加器输出
      );
  
   --正弦波相位累加器--频率控制
   i2_Freq_sum : Freq_sum
      PORT MAP (
         clk        => clk,
         freq_data  => sin_freq_2,--频率控制字10bit----2
         freq_out   => freq_out_sin_2--累加器输出
      );
   --正弦波相位累加器--频率控制
   i3_Freq_sum : Freq_sum
      PORT MAP (
         clk        => clk,
         freq_data  => sin_freq_3,--频率控制字10bit----3
         freq_out   => freq_out_sin_3--累加器输出
      );
  
--初相位调整-0
i1_phase_crtl: phase_crtl
   PORT MAP(
      clk         => clk,
      freq_out    => freq_out_sin_1,--累加器输出
      phase_data  => phase_1,--相位控制字10bit---"0000000000"
      address     => address_1--查找表地址
   );
--初相位调整
i2_phase_crtl: phase_crtl
   PORT MAP(
      clk         => clk,
      freq_out    => freq_out_sin_2,--累加器输出
      phase_data  => phase_2,--相位控制字10bit--"0101010101"
      address     => address_2--查找表地址
   );
--初相位调整
i3_phase_crtl: phase_crtl
   PORT MAP(
      clk         => clk,
      freq_out    => freq_out_sin_3,--累加器输出
      phase_data  => phase_3,--相位控制字10bit--"1010101010"
      address     => address_3--查找表地址
   );
   --三角波相位累加器
   i4_Freq_sum : Freq_sum
      PORT MAP (
         clk        => clk,
         freq_data  => "0000100000",--频率控制字10bit
         freq_out   => freq_out_triangle--累加器输出
      );
PWM_wave1<='1' when freq_out_triangle>q_sin1 else '0';--三角波大于正弦波时输出1,否则输出0
PWM_wave2<='1' when freq_out_triangle>q_sin2 else '0';--三角波大于正弦波时输出1,否则输出0
PWM_wave3<='1' when freq_out_triangle>q_sin3 else '0';--三角波大于正弦波时输出1,否则输出0
END behavioral;


代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » SPWM发生器VHDL正弦波脉宽调制频率相位可调仿真

发表评论

模板文件不存在: ./template/plugins/comment/pc/index.htm

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员