利用FPGA的DDS直接数字合成产生SPWM正弦调制方波_通过fpga产生spwm波是那种方法-程序员宅基地

技术标签: 硬件工程  fpga  数字通信  调制与编码策略  

1.原理

利用FPGA的DDS产生调制信号,利用计数器产生高频载波三角波,将两路信号通过比较器进行比较,产生调制SPWM方波。

        1.1        DDS基本结构:

                三个寄存器、两个加法器,第二个加法器可以输出地址作为ROM数据表模块的输入,从而提取ROM地址对应的数据,然后输出。

        1.2        DDS信号产生流程:

 

                        先是把mif文件生成的波形数据表提前存储在ROM中-->

                        通过输入的f、相位控制字以稳定步长从ROM中提取数据-->

                        提取数据通过D/A经过低通滤波器后-->

                        得到平滑的正弦波形!

        1.3        如何控制频率:

                 定义Fcnt和Fword为32位寄存器,不过只把Fcnt的高11位当做ROM地址位。例如:

                                当Fword<=22‘h200000时,每过1个时钟周期Fcnt只增加1;

                                当Fword<=21‘h100000时,每过2个时钟周期Fcnt才增加1;

                                当Fword<=23‘h400000时,每过1个时钟周期Fcnt要增加2;

                                当Fword<=23‘h600000时,每过1个时钟周期Fcnt要增加3;

                以达到控制频率的效果。

 

        1.4        ROM选型:

                宽度=数据宽度=DAC取值范围宽度;

                深度=地址个数;

2.软件程序

        2.1        verilog程序

module DDS(
    clk,
    reset_n,
    Fword,
    Pword,
	 
    DA_Data,
	 wave_out,
	 triangle_wave_out,
	 
	 spwm
 
);
	 
    input clk;
    input reset_n;
    input [31:0]Fword;
    input [10:0]Pword;
	 
    output [9:0]DA_Data;
	 output reg signed [9:0] wave_out;
	 output signed [9:0]  triangle_wave_out;
	 output spwm;

    reg [31:0]r_Fword;
    reg [10:0]r_Pword;
    reg [31:0]Fcnt;
	 reg [9:0] count;
	 
    wire [10:0]rom_addr;
	 wire [9:0]zbx;


	  
	/**********************三角波***计数器生成************************/
	always@(posedge clk or negedge reset_n) begin
		if(!reset_n) begin
			count <= 10'd0;
		end
		else if(count == 10'd77) begin                                         //三角波周期最大计数
			count <= 0;
		end
		else count <= count + 10'd1;                                            //三角波步长
	
	end
	
	always@(posedge clk or negedge reset_n) begin
		if(!reset_n) wave_out <= 10'd0;
		else if( count <= 10'd38) wave_out <= wave_out + 10'd26;                    //尖峰处计数值;上升时期每一步的幅度增加值
		else wave_out <= wave_out - 10'd26;                                      //翻转后;下降时期每一步的幅度减少值(=增加值)	
	end

	
	
	 /****************************正弦波***DDS*************************/
	 always @ (posedge clk )begin
		 r_Fword<=Fword;                                                  //读Fword和Pword
		 r_Pword<=Pword;
	 end

    always @ (posedge clk or negedge reset_n) begin
		 if(!reset_n)
			  Fcnt<=32'd0;
		 else
		 Fcnt<=Fcnt+r_Fword;                                              //每触发一次上升沿,Fcnt累加一次r_Fword,得到新地址
	 end
 

    assign rom_addr=Fcnt[31:21]+r_Pword;                                //Fcnt11位只取高位,剩下的低位都给r_Fword,以至于f可减
	 
	 assign  zbx=wave_out[9:0];
	 assign spwm=(zbx>DA_Data) ? 1'd1 : 1'd0;

	 rom rom(
		 .address(rom_addr),
		 .clock(clk),
		 .q(DA_Data)
	 );


endmodule

        

        2.2        testbench程序:

`timescale 1ns/1ns
module DDS_tb;
	reg clk;
	reg reset_n;
	reg [31:0]Fword;
	reg [10:0]Pword;
	
	wire [9:0]DA_Data;
	wire [9:0] wave_out;
	wire [9:0] triangle_wave_out;
	wire spwm;
	
	DDS DDS(
		 .clk(clk),
		 .reset_n(reset_n),
		 .Fword(Fword),
		 .Pword(Pword),
		 .DA_Data(DA_Data),
		 .wave_out(wave_out),
		 .triangle_wave_out(triangle_wave_out),
		 .spwm(spwm)
	);
	
	initial clk = 1;
	always #5 clk = ~clk;
	
	initial begin
		reset_n=0;
		Fword=858993;
		Pword=512;
		#201;
		reset_n=1;
	end
endmodule

                想要得到信号的f与时钟f的关系:

 

                产生以10ns为周期的时钟,频率为100MHz。想要得到周期为20KHz的正弦波,通过公式算出步长Fword<=858993,自定义相移512个数据。

3.结果

仿真生成spwm波形

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_58634335/article/details/121576904

智能推荐

Python 入门 之 初识面向对象_python 数据挖掘 面向对象编程实例-程序员宅基地

文章浏览阅读72次。1、初识面向对象编程 (核心–对象)(1)观察以下代码:# 面向过程编程s = "alexdsb"count = 0for i in s: count += 1print(count)s = [1,2,7,3,4,5,]count = 0for i in s: count += 1print(count)# 面向对象编程def my_len(s): ..._python 数据挖掘 面向对象编程实例

Linux MySQL安装驱动程序:三种常见的安装方式-程序员宅基地

文章浏览阅读791次。安装MySQL的方式常见的有三种:方式一:rpm安装(1) 操作系统发行商提供的(2) MySQL官方提供的(版本更新,修复了更多常见BUG)www.mysql.com/downloads关于MySQL中rpm包类型的介绍:MySQL-client 客户端组件MySQL-debuginfo 调试MySQL的组件MySQL-devel 想针对于MySQL编..._linux系统安装mysql驱动程序

基于多保真方法来估计方差和全局敏感度指数分析(Matlab代码实现)_基于方差的敏感性分析-程序员宅基地

文章浏览阅读662次。我们提出了多保真估计器,它将使用昂贵模型计算的一些高保真样本与使用更便宜的代理模型计算的许多低保真样本相结合,以产生固定计算预算的方差估计低于单独使用高保真模型获得的方差估计,同时保持高保真估计的准确性。当模型具有不确定的输入时,模型输出也是不确定的。基于方差的全局敏感性分析通过将总方差除以由于每个输入和输入之间的相互作用而产生的方差百分比来量化每个不确定输入对输出的相对影响。主要和总效应敏感性指数可以使用蒙特卡罗估计来估计。为了估计d输入的主效应敏感性指数和总效应敏感性指数,需要对每个蒙特卡罗样本进行(_基于方差的敏感性分析

【FA-BP预测】基于萤火虫算法优化BP神经网络回归预测研究(Matlab代码实现)-程序员宅基地

文章浏览阅读46次。在该研究中,将BP神经网络的权重和偏置作为优化的目标变量,利用萤火虫算法来搜索最优的权重和偏置组合,以提高预测模型的性能。然后,根据萤火虫的亮度值和距离,更新每个萤火虫的位置,即更新BP神经网络的权重和偏置。在该研究中,首先使用BP神经网络建立预测模型,然后利用萤火虫算法对BP神经网络的权重和偏置进行优化,以提高预测模型的性能。基于萤火虫算法优化BP神经网络回归预测研究是一种有效的方法,可以用于解决回归预测问题,并在实际应用中具有广泛的应用前景。通过萤火虫算法的优化,可以有效地提高BP神经网络的预测性能。

P8Z77-V-ASUS-2104-Nvme_Dell2.3.rar 我需要这个_p8z77v nvem bios-程序员宅基地

文章浏览阅读1.1k次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._p8z77v nvem bios

HTML 超详细空格标记_html空格标签-程序员宅基地

文章浏览阅读9.3k次,点赞3次,收藏33次。在HTML中,有多种表示空格的字符实体,用于插入不同宽度的空白字符,以。_html空格标签

随便推点

jar 包下载网址_abe.jar下载-程序员宅基地

文章浏览阅读947次。mysql-connector-java各种版本下载地址MYSQL :数据库https://mvnrepository.com/artifact/mysql/mysql-connector-java自行选择自己需要的 jar 包版本_abe.jar下载

Integer和Int_integer -1-程序员宅基地

文章浏览阅读171次。参考博客1参考博客21、Integer和int的区别Integer是int的包装类,int是八大基本数据类型之一Integer是类,默认值为null,int默认值为0Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值2 、Integer的自动拆箱和装箱自动拆箱和装箱是jdk1.5之后的功能装箱就是由基本数据类型封装成类的过程,拆箱反之。装箱:正常创建类的对象是new一个出来,但是Integer类可以直接Integer a=11;通过反编_integer -1

[Qt]Graphics View实现简单离线地图_graphicsmaplib-程序员宅基地

文章浏览阅读6.6k次,点赞24次,收藏118次。敬请期待_graphicsmaplib

计算机软件中级职称专业哪个容易考,计算机软考中级职称哪个最容易考-程序员宅基地

文章浏览阅读4.6k次。软考中级系统集成项目管理工程师知识点:面向对象系统分析面向对象的系统分析指运用面向对象的方法分析问题域,建立基于对象、消息的业务模型,形成对客观世界和业务本身的正确认识。面向对象的分析模型由用例模型、类-对象模型、对象-关系模型、对象-行为模型组成。(1)用例模型描述用户和系统间的交互;(2)类-对象模型描述系统涉及的全部对象和类;(3)对象-关系模型描述对象间的静态关系;(4)对象-行为模型描述..._计算机软考中级职称哪个容易

IT30: IT项目选型之18般武器_it30: it信息化成熟度评估模型-程序员宅基地

文章浏览阅读324次。做IT项目,必然会遇到选型的问题。每个软件只要有应用案例,软件公司只要还活着,说明依然有价值。但为什么同一个软件,会有截然不同的市场反馈?有人说好有人说坏,有上的成功的,也有上失败的。很多人都没有弄清楚这个道理。我用一句话总结,就是:“适合的才是最好的”。上IT项目是一件复杂的事,“适合”两个字大家都认识,但不一定懂得。“1-管理与软件”软件是工具,是管理思想落地的工具。我们抛开软件讲讲管理。管理需要指标衡量,有句话说的好:“没有衡量就没有管理”。衡量就意味着标准化,数据化,量化。但这仅仅只是基_it30: it信息化成熟度评估模型

CentOS搭建Discuz论坛_centos中discuz是啥-程序员宅基地

文章浏览阅读502次。????参考:腾讯云手动实验https://cloud.tencent.com/developer/labs/lab/10030Discuz 是基于PHP网页,在 Linux 和 windows 两平台均可部署的论坛工具。准备LAMP环境安装MySQL下载安装repo源[root@localhost ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm[root@localhost ~]# rpm -_centos中discuz是啥

推荐文章

热门文章

相关标签