基于FPGA的DDS信号发生器设计(频率、幅度、波形可调)

更新时间:2023-06-28 08:38:31 阅读: 评论:0

基于FPGA的DDS信号发⽣器设计(频率、幅度、波形可调)⽬录
⼀、DDS原理
DDS全称为直接数字频率合成(Direct Digital Synthesis),其基本原理是在⼀个周期波形数据下,通过选取其中全部数据或抽样部分数据组成新的波形,由奈奎斯特采样定理可知,最低两个采样点就可以组成⼀个波形,但实际上最少需要4个点。其原理框图如下:
其主要由相位控制字、频率控制字、相位累加器、波形存储器⼏部分组成。
波形存储器:存储⼀个周期波形的离散信号;
频率控制字:⽤以控制⽣成的波形频率。shoot
相位累加器:⽤来控制波形的相位累加,组成完整的波形显⽰。
相位控制字:⽤以控制波形起始位置。
⼆、整体系统设计
1、现有条件
朋友圈句子
本实验平台是⼩梅哥的AC620开发板,板载12位采样精度的DAC芯⽚TLV5618,输出电压范围为0V~4.096V,其最⾼时钟频率为20MHz。
2、实验性能分析
由于板载的DAC芯⽚最⾼采样频率为20MHz,为了设计余量,同时只是为了验证设计的正确性,这⾥将DAC采样频率设定为
男孩青春期10MHz,同时TLV5618的DAC芯⽚采⽤的是SPI借⼝通信,传输⼀次数据需要差不多16个时钟周期,这⾥将其看成20个时钟周期,因此接收数据的最⾼频率为10/20=0.5MHz。因此本实验信号发⽣器最⾼⽣成的频率设置为0.5MHz。
3、系统模块设计
这⾥没有做DAC驱动模块,在我前⾯的博客数据采集系统中有⽤到DAC驱动模块,由于我⾝边没有⽰波器,⽆法测波形,只能通过仿真软件测试设计的正确性,因此这⾥不做DAC驱动模块。下边将对各个模块分别讲解:
(1)频率设置模块(f_word_t.v)
这⾥通过按键依次对频率进⾏改变,这⾥设置可⽀持的频率包括 1Hz、10Hz、100Hz、500Hz、1KHz、5KHz、10KHz、
50KHz、100KHz、200KHz、500KHz 共11种不同的选择,按键按下依次切换。
这⾥对不同频率波形的频率控制字进⾏计算。为了获取1Hz、10Hz等低频信号,在对其进⾏相位累加的时候,需要进⾏其他的计数,这⾥选取20位宽供其累加,还有12位供波形数据累加,共32位数据进⾏累加操作,例如fre_acc[31:0],其中低20位数据作为补充累加,⾼12位作为波形数据累加。对于要⽣成1Hz波形来说,假设每次需要加x个时钟周期,1Hz周期为T=1/f(此处周期⽤ns表⽰),在Tns后32位数据加满,采⽤50MHz系统时钟,1系统时钟周期20ns,因此有:(T/20)*x=2^32,因此频率控制字计算公式为:            x =
(2^32)*20/T  =  (2^32)*20*f(hz)/1000000000  ;
最后得出的各个频率的控制字数据为:
1Hz~86;10Hz~859;100Hz~8590;500Hz~42950;1000Hz~85899;5000Hz~429497;10KHz~858993;
50KHz~4294967;100KHz~8589935;200KHz~17179869;500KHz~42949673。
代码如下,其中⾥边按键消抖模块采⽤前⾯博客写的按键消抖模块。
// Company  :
// Engineer :
// -----------------------------------------------------------------------------
// blog.csdn/qq_33231534    PHF's CSDN blog
// -----------------------------------------------------------------------------
// Create Date    : 2020-09-04 15:25:53
// Revi Data    : 2020-09-04 17:06:45
// File Name      : F_word_t.v
// Target Devices : XC7Z015-CLG485-2
// Tool Versions  : Vivado 2019.2
// Revision      : V1.1
// Editor        : sublime text3, tab size (4)
/
/ Description    : 频率控制字的⽣成
module F_word_t(
input    clk  ,
input    rst_n ,
input    key1_in ,
output reg [25:0] f_word
);
wire  key_flag ;
wire  key_state ;
wire  key_state ;
reg [3:0] cnt  ;
key_filter fword_key (
.clk      (clk),
.rst_n    (rst_n),
.key_in    (key1_in),
.key_flag  (key_flag),
.key_state (key_state)
);
always @(podge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 4'd0;
end
el if (key_flag) begin
if (cnt==4'd10) begin
cnt <= 4'd0;
end
el begin
cnt <= cnt + 1'b1;
end
end
end
always @(podge clk or negedge rst_n) begin
if (!rst_n) begin
f_word <= 0;
end
el begin
ca(cnt)
4'd0:f_word = 26'd86;  //1Hz
4'd1:f_word = 26'd859;  //10Hz
4'd2:f_word = 26'd8590;  //100Hz
4'd3:f_word = 26'd42950; //500Hz
4'd4:f_word = 26'd85899; //1kHz
4'd5:f_word = 26'd429497; //5kHz
4'd6:f_word = 26'd858993; //10kHz
4'd7:f_word = 26'd4294967; //50kHz
4'd8:f_word = 26'd8589935; //100kHz
4'd9:f_word = 26'd1*******; //200kHz
4'd10:f_word = 26'd4*******;//500kHz
default:;
endca
end
end
endmodule
(2)波形设置模块(wave_t.v)
这⾥主要通过按键设置4种波形:正弦波、三⾓波、锯齿波、⽅波。这⾥通过按键按下,改变波形控制字的数据,这⾥没有放各个波形的ROM模块,ROM模块放在DDS模块中,以便进⾏数据输出。
// Company  :
// Engineer :
// -----------------------------------------------------------------------------
// blog.csdn/qq_33231534    PHF's CSDN blog
// -----------------------------------------------------------------------------
// Create Date    : 2020-09-04 15:10:48
// Revi Data    : 2020-09-04 15:23:44
// File Name      : wave_t.v
// Target Devices : XC7Z015-CLG485-2
// Tool Versions  : Vivado 2019.2
// Revision      : V1.1
/
/ Editor        : sublime text3, tab size (4)
// Description    : dds信号发⽣器的波形选择,按键按下切换波形
寄予厚望什么意思
module wave_t(
input    clk  ,
input    rst_n ,
input    key0_in ,
output reg [1:0] wave_c  //wave_c oo~正弦波  01~三⾓波  10~锯齿波  11~⽅波
);
wire key_flag ;
wire key_state ;
key_filter wave_key (
.
clk      (clk),
.rst_n    (rst_n),
.key_in    (key0_in),
.key_flag  (key_flag),
.key_state (key_state)
);
always @(podge clk or negedge rst_n) begin
奥运会五环if (!rst_n) begin
wave_c <= 0; //默认正弦波
end
el if (key_flag) begin
wave_c <= wave_c + 1'b1;
end
end
韭菜鸡蛋馅包子endmodule
(3)幅度设置模块(amplitude_t.v)
通过按键控制波形幅度设置,这⾥可以设置为原波形的1倍、1/2倍、1/4倍、1/8倍、1/16倍。
// Company  :
// Engineer :
// -----------------------------------------------------------------------------
// blog.csdn/qq_33231534    PHF's CSDN blog
// -----------------------------------------------------------------------------
/
/ Create Date    : 2020-09-05 09:35:58
// Revi Data    : 2020-09-05 09:35:58
// File Name      : amplitude_t.v
// Target Devices : XC7Z015-CLG485-2
// Tool Versions  : Vivado 2019.2
// Revision      : V1.1
// Editor        : sublime text3, tab size (4)
// Description    : 信号电压幅度设置 1/2/4/8/16分之⼀
module amplitude_t(
input    clk  ,
input    rst_n ,
input    key2_in ,
output reg [4:0] amplitude
);
reg [2:0] cnt  ;
wire  key_flag ;
wire  key_state ;
key_filter amplitude_key (
.clk      (clk),
.rst_n    (rst_n),
.key_in    (key2_in),
.key_flag  (key_flag),beat耳机
.
key_state (key_state)
);
always @(podge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 3'd0;
观舞记end
el if (key_flag) begin
if (cnt == 3'd4) begin
cnt <= 3'd0;
end
el begin
cnt <= cnt + 1'b1;
end
end
end
always @(podge clk or negedge rst_n) begin
if (!rst_n) begin
amplitude <= 0;
end
el begin
ca(cnt)
3'd0: amplitude <= 5'd1;
3'd1: amplitude <= 5'd2;
3'd2: amplitude <= 5'd4;
3'd3: amplitude <= 5'd8;
3'd4: amplitude <= 5'd16;
default:amplitude <= 5'd1;
endca
end
end
endmodule
(4)DDS模块(DDS.v)
这个模块例化四个波形存储ROM模块(ROM模块很简单,在数据采集系统⾥也写过,这⾥不再赘述),同时进⾏DDS的相位累加,通过查找表,读出ROM中的数据。
// Company  :
// Engineer :
// -----------------------------------------------------------------------------
// blog.csdn/qq_33231534    PHF's CSDN blog
// -----------------------------------------------------------------------------

本文发布于:2023-06-28 08:38:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1057613.html

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

标签:波形   数据   频率   控制   模块   累加   按键   设置
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图