Verilog代码编写DDS信号发生器(幅频相可调正弦波、方波、三角波、锯齿波)纯VIVA。。。

沥青阻尼板Verilog代码编写DDS信号发⽣器(幅频相可调正弦波、⽅波、三⾓波、锯齿波)纯VIVA。。。
DDS(Direct Digital Synthesizer)即数字合成器,是⼀种新型的频率合成技术,具有相对带宽⼤,频率转换时间短、分辨率⾼和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,⼴泛应⽤于通信领域。摩托车雨棚
DDS的基本结构框图如下所⽰:
由图可以看出,DDS 主要由相位累加器、相位调制器、波形数据表以及D/A 转换器构成。本次实验仅在VIVADO平台上完成DDS的仿真,故设计流程不需要D/A转换器,在PC端完成仿真设计即可。若需要结合FPGA开发板使⽤,则需要再外接⼀个D/A转换模块,将产⽣的数字信号转换为模拟信号即可。
其中相位累加器由 N 位加法器与 N 位寄存器构成。每个时钟周期的时钟上升沿,加法器就将频率控制字与累加寄存器输出的相位数据相加,相加的结果⼜反馈⾄累加寄存器的数据输⼊端,以使加法器在下⼀个时钟脉冲的作⽤下继续与频率控制字相加。这样,相位累加器在时钟作⽤下,不断对频率控制字进⾏线性相位累加。即在每⼀个时钟脉冲输⼊时,相位累加器便把频率控制字累加⼀次。相位累加器输出的数据就是合成信号的相位。相位累加器输出的数据,作为波形存储器的相位采样地址,这样就可以把存储在波形存储器⾥的波形采样值经查表出,完成相位到幅度的转换。波形存储器的输出数据送到 D/A 转换器,由 D/A 转换器将数字信号转换成模拟信号输出。
DDS 信号流程⽰意图如下:
这⾥相位累加器位数为 N 位(N 的取值范围实际应⽤中⼀般为 24~32),相当于把正弦信号在相位上的精度定义为 N 位,所以其分辨率为1⁄2^N。 若 DDS 的时钟频率为Fclk,频率控制字 fword 为 1,则输出频率为Fout = Fclk/2^N ,这个频率相当于“基频”。若fword 为 B,则输出频率为Fout = B × Fclk /2^N 。
因此理论上由以上三个参数就可以得出任意的Fout输出频率。且可得出频率分辨率由时钟频率和累加器的位数决定的结论。当参考时钟频率越⾼,累加器位数越⾼,输出频率分辨率就越⾼。
从上式分析可得,当系统输⼊时钟频率Fclk不变时,输出信号频率由频率控制字 B 所决定。其中 B 为频率字且只能取整数。为了合理控制 ROM 的容量,此处选取 ROM 查询的地址时,可以采⽤截断式,即只取 32 位累加器的⾼ M 位。这⾥相位寄存器输出的位数⼀般取10~16 位。
故按照⼀定的时钟,产⽣顺序的相位值,将该值作为ROM查表的地址,即可顺序读出存储的正弦波表数据,作为数据输出,同样的,为了产⽣其他不同类型的波形,只需要改变波表数据即可。
为了实现频率的改变,只需要加⼊⼀个频率控制字,按照⼀定的规则取地址即可(⽐如三点取⼀点、五点取⼀点),这样依然能输出完整的波形,只不过取的点数变了,导致频率改变。
为了实现相位的改变,只需要加⼊⼀个相位控制字,根据该值选择起始的地址点即可,实现波形的移动,相位的改变。
为了实现幅值的改变,只需要加⼊⼀个幅度控制字,按照⼀定⽐例将该值与产⽣数据相乘,即可改变输出数据的⼤⼩,实现幅度的改变。
在此设计了四种波形的幅频相可调的波形发⽣器,可以产⽣⼀定频率范围内的波形数据。根据不同的输⼊产⽣不同的输出波形。
基于FPGA编写的DDS信号波形发⽣器,通过波表查的⽅式⽣成正弦波。设置系统的时钟为50MHz,输出数据位宽为10位,从0-1023。可以输⼊波形控制字、频率控制字、相位控制字及幅度控制字来控制所⽣成波形的形式。该DDS模块可以产⽣正弦波、⽅波、三⾓波与锯齿波,频率范围为1KHz-5MHz,相位0-360°,幅度为0-1023的波形数据。其中设定D/A模块为10位的D/A转换器,产⽣的波形幅值为0-5V,因此根据不同的输出数据将转换为0-5V的电压值输出。
其中各端⼝定义如下:
clk:系统时钟输⼊
rst:复位信号
wave[3:0]:波形选择输⼊,00 正弦波,01 ⽅波,10 三⾓波,11 锯齿波
Fword[9:0]:频率控制字,选择输出频率
Pword[9:0]:相位控制字,选择输出相位
Aword[9:0]:幅度控制字,选择输出幅度
clkout:输出同步时钟,此处与输⼊时钟⼀致
dataout[9:0]:波形数据输出
代码如下:
1//DDS数字信号发⽣器
2//波形控制字:
3//wave: 00:正弦波 01:⽅波 10:三⾓波 11: 锯齿波
4//频率控制字:
5//fout=fclk*Fword/2^(N) N:相位累加器的位数,Fword:频率控制字,当Fword=2^(32(位宽)-N)时达到基频
6//设置基频为50KHz,对于正弦波、三⾓波、锯齿波、⽅波的Fword为4194304,Fword变⼤,频率变⼤,Fword变⼩,频率变⼩
7//此时 fout=fclk/2^(N)
7//此时 fout=fclk/2^(N)
8//频率分辨率=fclk/2^32(位宽)=0.01164Hz
9//想获得任意频率,Fword=f/0.01164,⼀般⼤于0,⼩于fclk/2
10//fout=fclk*Fword/2^(32)选⽤不同的Fword,得到不同的fout
11//相位控制字:
12//Pword:从0-1024,对应0-2pi
f型钢
13//幅度控制字:
14//Aword:从0-1024,设定对于模拟输出0-5V,初始为1023,对应5V 15module DDS(
16    input clk,
17    input rst,
18    input [1:0]wave,
19    input [31:0]Fword,
20    input [9:0]Pword,
21    input [9:0]Aword,
22    output clkout,
23    output [9:0]dataout
24);
25
26//波形数据:
27reg [9:0] wavedata;
28//波形信号:
29wire [9:0] sindata;
30wire [9:0] squdata;
31wire [9:0] tridata;
32wire [9:0] sawdata;
33assign clkout = clk;
34//正弦波形产⽣:
35//相位寄存器:
36reg [31:0]frechange;
37
38always @(posedge clk or negedge rst) begin
39  if(!rst)
40      frechange <= 32'd0;
41  else
42      frechange <= frechange + Fword;
43end
44
45//相位累加器:
46reg [9:0]romaddr;
47
48always @(posedge clk or negedge rst) begin
49  if(!rst)
50      romaddr <= 10'd0;
51  else
52      romaddr <= frechange[31:22] + Pword;
53end
54
55//正弦波表:
网络大容量存储空间56rom_sin romsin (
57  .clka(clk),      // input wire clka
58  .addra(romaddr),  // input wire [9 : 0] addra
59  .douta(sindata)      // output wire [9 : 0] douta
60);
61
62//其他波形产⽣器:
63reg [31:0] phaseacc;
64always @(posedge clk or negedge rst) begin
65 if(!rst)
66    phaseacc <= 32'b0;
67 else
68    phaseacc <= phaseacc+Fword;
69end
70
71wire [31:0] phase=phaseacc+Pword;
72
72
73//⽅波:
74assign squdata = phase[31] ? 10'd1023:10'd0;
75//三⾓波:
76assign tridata = phase[31]? (~phase[30:21]): phase[30:21];
77//锯齿波:
78assign sawdata = phase[31:22];
79
80//波形选择:
电子除垢器
81always @(*) begin
82 case(wave)
83  2'b00: wavedata<= sindata;
84  2'b01: wavedata<= squdata;
85  2'b10: wavedata<= tridata;
86  2'b11: wavedata<= sawdata;
87  default: wavedata<= sindata;
88 endcase
89end
90
91//调幅:
92wire [9:0] data;
93assign data = wavedata;
94reg [19:0] AMdata;
95always@(posedge clk)
96  if(!rst)
97      AMdata<=1'd0;
98  else
99      AMdata<=data*Aword;
100assign dataout = AMdata[19:10];
手机摄像头驱动101
102endmodule
正弦波波表数据 存储在ROM⾥,这⾥调⽤了VIVADO的IP核,波表数据的coe⽂件可以利⽤MATLAB或者相关的软件⽣成,这⾥不再赘述,需要可以在附件中下载。
仿真部分:
利⽤设计的DDS模块,可以在VIVADO平台上仿真得到波形,此处编写testbench以后,仿真显⽰了多种波形和调幅、频、相后的结果。
例化四个DDS模块,⽣成1.56MHz,幅值为1024单位的四种不同类型的波形信号,仿真结果如下所⽰:
图中产⽣了四种不同类型的波形,按照不同的波形控制字得到不同的输出,波形的频率为1.56MHz,此处只测量了正弦波的频率,其他波形的频率也⼀样。由图中数据可知T=649us,故f约等于1.56MHz。
例化四个DDS模块,⽣成1.56MHz,幅值为1024单位的四个不同相位的正弦波,分别为0°,90°,180°,270°,实现调相功能,仿真结果如下所⽰:
以绿⾊波形为0°基准,四个波形各相差90°,完成功能实现。
例化四个DDS模块,⽣成1.56MHz,相位为0°,幅值⼤⼩不同的四个正弦波,分别为1024、512、256、128(如DA部分⽣成电压为0-5V,则分别对应电压幅值为5V、2.5V、1.25V、0.625V),仿真结果如下所⽰:
由各波形的输出峰值⼤⼩可以看出,四个波形的数字输出各有不同,经过D/A以后输出的模拟波形幅值就是不⼀样的,实现了调幅功能。
例化四个DDS模块,⽣成相位为0°,幅值为1024单位,频率⼤⼩不同的四个正弦波,分别为1.56MHz、780KHz、390KHz、195KHz,仿真结果如下所⽰:

本文发布于:2024-09-22 16:54:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/164389.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:频率   相位   波形   输出   控制   数据   时钟   信号
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议