2745|1

6952

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

FPGA---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:    10:01:33 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;

//有符号数转化为无符号输出到DA
always @(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)
        endcase
end
       
//按钮处理程序,改变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;
        end
end       

//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)


最新回复

FPGA做这玩意得心应手,如果用MCU做就麻烦很多  详情 回复 发表于 2019-4-10 08:16
点赞 关注(1)
 

回复
举报

1373

帖子

6

TA的资源

版主

沙发
 
FPGA做这玩意得心应手,如果用MCU做就麻烦很多
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表