dds简介:
dds 同 dsp(数字信号处理)一样,是一项关键的数字化技术。dds 是直接数字式频率合成器(direct digital synthesizer)的英文缩写。与传统的频率合成器相比,dds 具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
dds 芯片的功能主要包括频率控制寄存器、高速相位累加器和正弦计算器三个部分。频率控制寄存器可以串行或并行的方式装载并寄存用户输入的频率控制码;而相位累加器根据频率控制码在每个时钟周期内进行相位累加,得到一个相位值;正弦计算器则对该相位值计算数字化正弦波幅度(芯片一般通过查表得到)。
dds 芯片输出的一般是数字化的正弦波,因此还需经过高速 d/a 转换器和低通滤波器才能得到一个可用的模拟频率信号。关于想了解更多的 dds 的相关知识, 大家可以到百度直接搜索。
下面主要来给大家介绍fpga 程序的设计, dds ip 的配置和调试。
编写 dds_wave 的 verilog 程序
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// company: // engineer: // // create date: 1033 07/17/2018 // design name: // module name: dds_wave // project name: // target devices: // tool versions: // description: //// dependencies: //// revision: // revision 0.01 - file created// additional comments: ////////////////////////////////////////////////////////////////////////////////////module dds_wave(clk, key1,data,da_clk );input clk, key1;output [7:0] data;output da_clk; reg [15:0] key1_cout;reg [7:0] data_o;reg dds_we;reg [28:0] dds_data;reg [3:0] dds_freq = 0;reg dds_we_req; wire [7:0] sine; assign sine_reg = sine[6:0];assign da_clk = clk;assign data = data_o; //有符号数转化为无符号输出到daalways @(posedge clk)begin if(sine[7] == 1'b1) data_o <= sine - 128; else data_o <= sine + 128;end//控制dds输出不同always @(negedge clk)begin dds_we <= dds_we_req; case(dds_freq) 4'd0: dds_data <= 29'd107; //10hz:(dds_data*2^29/50*1000000) 4'd1: dds_data <= 29'd1074; //100hz:(dds_data*2^29/50*1000000) 4'd2: dds_data <= 29'd10737; //1khz:(dds_data*2^29/50*1000000) 4'd3: dds_data <= 29'd53687; //5khz:(dds_data*2^29/50*1000000) 4'd4: dds_data <= 29'd107374; //10khz:(dds_data*2^29/50*1000000) 4'd5: dds_data <= 29'd536871; //50khz:(dds_data*2^29/50*1000000) 4'd6: dds_data <= 29'd1073742; //100hz:(dds_data*2^29/50*1000000) 4'd7: dds_data <= 29'd5368709; //500hz:(dds_data*2^29/50*1000000) 4'd8: dds_data <= 29'd10737418; //1mhz:(dds_data*2^29/50*1000000) 4'd9: dds_data <= 29'd21474836; //2mhz:(dds_data*2^29/50*1000000) 4'd10: dds_data <= 29'd32212255; //3mhz:(dds_data*2^29/50*1000000) 4'd11: dds_data <= 29'd42949672; //4mhz:(dds_data*2^29/50*1000000) 4'd12: dds_data <= 29'd53687091; //5mhz:(dds_data*2^29/50*1000000) 4'd13: dds_data <= 29'd64424509; //6mhz:(dds_data*2^29/50*1000000) 4'd14: dds_data <= 29'd75161928; //7mhz:(dds_data*2^29/50*1000000) 4'd15: dds_data <= 29'd85899346; //8mhz:(dds_data*2^29/50*1000000) default: dds_data <= 29'd107; // 1khz:(dds_data*2^29/50*1000000) endcaseend //按钮处理程序,改变dds的输出频率always @(posedge clk)begin if(key1 == 1'b0) key1_cout <= 0; else if((key1 == 1'b1) & (key1_cout <= 16'hc350)) key1_cout <= key1_cout + 1'b1; if(key1_cout == 16'hc349) begin dds_freq <=dds_freq + 1'b1; dds_we_req <= 1'b1; end else begin dds_freq <=dds_freq; dds_we_req <= 1'b0; endend //dds ip产生sin/cos波形sin_cos sin_cos_inst( .clk(clk), .we(dds_we), .data(dds_data), .cosine(cosine), .sine(sine), .phase_out()); endmodule
程序通过检测开发板上按键 key1 ,如果按键 key1 每按下一次,寄存器 dds_freq 的值就会加 1, 程序就会对 dds ip 写入一个 data 数据来改变相位的增加量,从而改变输出波形的频率。程序中设置了 16 种相位的增加量,所以可以让 dds 产生 16 个不同频率的正弦波。在本实验的 dds ip 的配置中,相位增加的数据宽度为 29 位,所以最小的频率输出为50mhz/2^29, 约 0.093hz。如果想让 dds 输出 1khz 的波形,就需要写入相位增加值10737 。相位增加值和频率的计算公式如下:
相位增加值=( fhz * 2^29 )/( 50 * 1000000)
仿真图如下:
氧气减压阀的使用方法_氧气减压阀的使用注意事项
谷歌Pixel 3系列无线充电速度显示不准确问题修复
这款奥迪A4L你值得拥有,第三代EA888发动机和全新7速Stronic变速器
kava跨年上线MXC抹茶 - 2020,Defi的舞台才刚刚开幕
oppor11拍照亮点汇总,oppor11拍照大咖下月与你见面
Verilog实现DDS正弦波发生器
维修泰克MDO3034示波器上电后没任何反应
比特币能炒吗?比特币是少数人的玩具 7%的比特币在4%的参与者手中
开关磁阻电机的优缺点有哪些
基于展频IC抑制系统的EMI问题
行稳致远 进而有为 | 美格智能2021年年度经营管理会议顺利召开
浪涌保护器的正确接线方法和接线步骤
脉冲离子风机的工作原理、特点及其应用
恩智浦优先推出采用3D结构光的人脸识别方案
Litho路障威胁到40纳米以下的芯片生产
fireflyCORE-RK3328主板JD4升级固件介绍
停车场变频车牌识别系统的应用方案分析
“行走中国·2019海外华文媒体高层重庆行”参访团走进重庆经开区
蓝牙+GPS/北斗RTK化工厂人员定位系统解决方案
华为畅享MAX评测 5000mAh超大电池成追剧神器