最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

DDS电路设计

来源:动视网 责编:小OO 时间:2025-09-24 16:48:39
文档

DDS电路设计

DDS电路设计摘要本文介绍了DDS的原理,给出了用AlteraCyclone1EP1CQ240C8FPGA芯片实现直接数字频率合成器的工作原理、设计思路、电路结构和仿真结果以及频谱纯度分析。关键词:直接数字频率合成(DDS);现场可编程门阵列(FPGA);相位累加器1、DDS原理概述1、DDS在基本原理框图如图所示。它主要由标准参考频率源、相位累加器、波形存储器、数/模转换器、低通平滑滤波器等构成。其中,参考频率源一般是一个高稳定度的晶体振荡器,其输出信号用于DDS中各部件同步工作。DDS的实
推荐度:
导读DDS电路设计摘要本文介绍了DDS的原理,给出了用AlteraCyclone1EP1CQ240C8FPGA芯片实现直接数字频率合成器的工作原理、设计思路、电路结构和仿真结果以及频谱纯度分析。关键词:直接数字频率合成(DDS);现场可编程门阵列(FPGA);相位累加器1、DDS原理概述1、DDS在基本原理框图如图所示。它主要由标准参考频率源、相位累加器、波形存储器、数/模转换器、低通平滑滤波器等构成。其中,参考频率源一般是一个高稳定度的晶体振荡器,其输出信号用于DDS中各部件同步工作。DDS的实
DDS 电路设计

          

                 

摘要

本文介绍了DDS的原理,给出了用Altera Cyclone 1 EP1CQ240C8  FPGA芯片实现直接数字频率合成器的工作原理、设计思路、电路结构和仿真结果以及频谱纯度分析。

关键词:直接数字频率合成(DDS);现场可编程门阵列(FPGA);相位累加器

1、DDS原理概述

     1、DDS在基本原理

框图如图所示。它主要由标准参考频率源、相位累加器、波形存储器、数/模转换器、低通平滑滤波器等构成。其中,参考频率源一般是一个高稳定度的晶体振荡器,其输出信号用于DDS中各部件同步工作。DDS的实质是对相位进行可控等间隔的采样。

为实现全数字化的频率可调的频率合成器,本系统基于FPGA采用Verilog HDL设计而成直接数字频率合成器(DDS)。

 系统由加法器、累加寄存器、波形存储器、D/A转换器、低通滤波器构成。在FPGA里面做到的是D/A转换器之前的部分。

图一    DDS原理图

DDS系统的核心是相位累加器,它由一个N位累加器与N位相位寄存器构成。时钟脉冲每触发一次,累加器便将频率控制数据与相位寄存器输出的累加相位数据相加,然后把相加后的结果送至相位寄存器的数据输入端。相位寄存器将累加器在上一个时钟作用后所产生的新相位数据反馈到累加器的输入端,以使加法器在下一个时钟的作用下继续与频率控制数据相加。这样,相位累加器在参考时钟的作用下将进行线性相位累加,当相位累加器累加满时,就会产生一次溢出,以完成一个周期性的动作,这个周期就是DDS合成信号的一个频率周期,相位累加器的溢出频率就是DDS输出的信号频率。

2、DDS参数计算

      相位寄存器每经过2N/M个f c 时钟后回到初始状态,相应地正弦查询表经过一个循环回到初始位置,整个DDS系统输出一个正弦波。  

      输出正弦波频率:  

本设计中,N=10,M为位宽为32的频率控制字,fc=20Mhz

2、DDS电路结构设计

1、电路描述

接口信号

名称位宽方向描述备注
freq32输入输入频率字
reset1输入复位高电平异步复位
clock1输入时钟上升沿有效
sinout8输出输出波形2补码格式

2、电路结构

DDS模块RTL Viewer

累加器ACC模块RTL Viewer

ROM模块 RTL Viewer

3、DDS电路仿真结果

1、Quartus时序仿真

设定时序分析工具为 Class timing analyzer tool,观察电路最大运行频率 fMAX

用二补码格式观察

2、Modelsim时序仿真

参考时钟fc=20Mhz

(1)当freq = 32'b0000_0001_0000_0000_0000_0000_0000_0000;

Modelsim仿真波形如图 fo = 78Khz

(2)当freq = 32'b0000_0010_0000_0000_0000_0000_0000_0000;

Modelsim仿真波形如图      fo = 156Khz

(3)当freq = 32'b0000_0100_0000_0000_0000_0000_0000_0000;

Modelsim仿真波形如图fo = 312.5Khz

(4)当freq = 32'b0000_1000_0000_0000_0000_0000_0000_0000;

Modelsim仿真波形如图  fo = 625Khz

4、频谱纯度分析

可见,随着频率控制字的减小,频谱的杂散现象越来越严重。这是由相位截断所造成的。

5、代码附录

1、dds模块(顶层模块)

module dds(reset,clk20,freq,sinout);

input            reset,clk20;

input[31:0]        freq;

output[7:0]        sinout;

wire[31:0]        A;

wire[9:0]        address;

assign    address = A[31:22];

acc    u0(.reset(reset),.clock(clk20),.dataa(freq),.sum(A));

rom    u1(.clock(clk20),.address(address),.RD(sinout));

endmodule

2、acc模块  

module    acc    (reset,clock,dataa,sum);

input    reset,clock;

input[31:0]        dataa;

reg[31:0]        datar;

output[31:0]    sum;

reg[31:0]        sum;

always @ (posedge clock or posedge reset)    begin

if(reset)    begin

sum <= 0;

datar <= 0;

    end

else    begin

sum <= sum + datar;

datar <= dataa;

    end

end

endmodule

3、Rom模块

// module rom, a synchronized rom

module rom(

  clock   ,        // clock

  address    ,        // read address

  RD    );       // read data

input          clock;

input  [9 :0] address;

output [7 :0] RD;

reg    [7 :0] RD;

always @ (posedge clock)

case(address)

10'd0  : RD = #1 8'd0   ;//0

10'd1  : RD = #1 8'd1   ;//1

10'd2  : RD = #1 8'd2   ;//2

10'd3  : RD = #1 8'd2   ;//2

。    。    。    。    。    。    。

10'd1020  : RD = #1 -8'd3   ;//-3

10'd1021  : RD = #1 -8'd2   ;//-2

10'd1022  : RD = #1 -8'd2   ;//-2

10'd1023  : RD = #1 -8'd1   ;//-1

endcase

endmodule

clear

depth=1024;                 %存储单元数2^10;

widths=8;                    %数据宽度为8位;

fidc=fopen('rom.txt','wt');       %以"wt"的形式打开,\\n为换行

 

for(x=1:depth)

y=round(127*sin(2*pi*(x-1)/1024));

if y>=0

    fprintf(fidc,'10''d%d  : RD = #1 8''d%d   ;//%d\\n',x-1,y,y);

else

    fprintf(fidc,'10''d%d  : RD = #1 -8''d%d   ;//%d\\n',x-1,-y,y);

end

end

fclose(fidc);

 

其中,rom表的数据用matlab脚本自动生成,代码如下

*另外,为了做频谱分析,避免数据制式转换带来的麻烦,写ROM的时候,我又在原来的正弦波基础上加了个直流分量。

clear

depth=1024;                 %存储单元数2^10;

widths=8;                    %数据宽度为8位;

fidc=fopen('rom2.txt','wt');       %以"wt"的形式打开,\\n为换行

for(x=1:depth)

y=round(127*sin(2*pi*(x-1)/1024)+128);%加上一个直流分量

fprintf(fidc,'10''d%d  : RD = #1 8''d%d   ;\\n',x-1,y);

end

fclose(fidc);

 

等到要从Modelsim中读取数据再导入到matlab的时候,我又把这个直流分量减去。

clear

fs=20000000;

W=2048;

fid = fopen('data_out.txt','r'); 

    for i = 1 :1024; 

        num(i) = fscanf(fid, '%d', 1)-128;   

    end 

    fclose(fid);     

    plot(num);

    grid on

    title('原始信号')

    xlabel('时间')  

N=length(num);                %计算波形数据的长度

Hamming=window(@hamming,N)';    %加窗函数Hanning窗

dataout=num.*Hamming;     

H=fft(dataout,W);                %傅立叶变换

magH=abs(H); 

dBH=20*log10(magH);        %幅度换算成dB值

f=fs*(1:W)/W;

figure

                            %画图

xlabel('Frequency of the wave/Hz');

ylabel('Amplitude of the wave/V');

plot(f(1:W/8),dBH(1:W/8));

 grid on

 

xlabel(' Hz');

ylabel('dB');

 

 

 

因为没有找到很好的解决数据制式问题的办法,所以我就用这个办法也能从matlab中再把波形还原出来。

Testbench

    `timescale 1 ns/ 1 ps

module dds_vlg_tst();

reg clk20;

reg [31:0] freq;

reg reset;                                            

wire [7:0]  sinout;

integer w_file;

                     

dds i1 (

// port map - connection between master ports and signals/registers   

    .clk20(clk20),

    .freq(freq),

    .reset(reset),

    .sinout(sinout)

);

parameter    period = 50;

initial                                                

begin  

clk20 = 0;

freq = 32'b0000_0001_0000_0000_0000_0000_0000_0000;    

w_file = $fopen("data_out.txt");    

forever

        #(period/2) clk20 = ~clk20;                                                          

end                                                    

        

initial                                                

begin                                                  

reset = 1;

#1000 reset = 0;  

end   

always @(posedge clk20 ) begin

$fdisplay(w_file,"%d",sinout);

end                      

                                                                                                         

endmodule

参考文献

[1]张厥盛,曹丽娜.锁相与频率合成技术[M].成都:电子科技大学出版社

[2]Altera Inc.DATA BOOK.Altera Corporation,2001

[3]夏宇闻Verilog 数字系统设计教程[M].北京航空航天大学出版社.2003

文档

DDS电路设计

DDS电路设计摘要本文介绍了DDS的原理,给出了用AlteraCyclone1EP1CQ240C8FPGA芯片实现直接数字频率合成器的工作原理、设计思路、电路结构和仿真结果以及频谱纯度分析。关键词:直接数字频率合成(DDS);现场可编程门阵列(FPGA);相位累加器1、DDS原理概述1、DDS在基本原理框图如图所示。它主要由标准参考频率源、相位累加器、波形存储器、数/模转换器、低通平滑滤波器等构成。其中,参考频率源一般是一个高稳定度的晶体振荡器,其输出信号用于DDS中各部件同步工作。DDS的实
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top