精华内容
下载资源
问答
  • 电子设计dds设计的项目
  • DDS设计与调试
  • 基于 matlab dds设计

    2015-04-13 16:07:04
    dds设计,基于matlab的dsp builder,设计方法简便,波形稳定
  • 基于FPGA的DDS设计

    2011-03-04 18:49:46
    基于FPGA的DDS设计基于FPGA的DDS设计基于FPGA的DDS设计基于FPGA的DDS设计
  • 基于Verilog HDL的DDS设计与仿真、电子技术,开发板制作交流
  • 基于FPGA的改进结构的DDS设计与实现
  • 基于FPGA的DDS设计与仿真,魏崇训,郑红党,本文基于FPGA技术,利用Verilog HDL语言设计DDS,实现正弦波形输出。文章首先介绍了DDS的技术特点,分析了DDS的设计原理。为了正确完成设
  • 基于DSP Builder的双DDS设计及其应用,石加彬,,从基于FPGA技术的DSP应用出发,论文简要的阐述了DDS的工作原理,采用了DSP Builder软件进行基本的DDS设计,可获得两路具有一定相位差且幅
  • FPGA 的DDS设计资料

    2010-10-11 10:50:10
    FPGA 的DDS设计资料,非常有用,也许对你有帮助
  • 文章目录基于FPGA的DDS设计方案1 DDS技术简介2 DDS结构原理2.1 基本结构2.2 基本原理3 基于FPGA的 DDS实现3.1 利用RTL实现DDS3.2 利用Xlinx DDS IP实现4 DDS用途 基于FPGA的DDS设计方案 1 DDS技术简介 随着电子...

    在这里插入图片描述

    The furure belongs to those who believe in the beauty of their dreams

    未来属于那些相信梦想美好的人们



    基于FPGA的DDS设计方案

    1 DDS技术简介

    • 随着电子技术的不断发展,传统的频率合成技术逐渐不能满足人们对于频率转换速度、频率分辨率等方面的追求,直接数字频率合成技术应运而生。

    • 直接数字频率合成技术(DDS) 是把一系列数据量形式的信号通过D/A转换器转换成模拟量形式的信号合成技术。DDS具有很多优点,比如:频率转换快、频率分辨率高、相位连续、低功耗、低成本与控制方便。

    • DDS技术满足了人们对于速度稳定性的需求,但是在一些控制较为复杂的系统中,DDS专用芯片不能很好的贴合要求。利用现场可编程门阵列(FPGA)实现DDS具有很大的灵活性,基本能满足现在通信系统的使用要求。

    2 DDS结构原理

    2.1 基本结构

    DDS基本结构框图主要由参考频率源、相位累加器、ROM查找表、DAC转换器、低通滤波器等构成。
    DDS基本结构框图
    相位累加器以一定的步长做累加, 而波形函数存储在ROM查找表中, 将相位累加器输出的相位值作为地址,寻找存储在ROM查找表中的波形函数的幅度值,从而完成相位到幅值的转换。其中,参考频率源一般是一个晶体振荡器,要求具有高稳定性,用于DDS中各部件之间的同步。

    2.2 基本原理

    DDS Core结构图
    上图为DDS Core结构图,∆θ是相位增量(对应图1中的频率控制字K),B∆θ 为相位累加器的位数,clk是参考时钟(对应图1中的参考频率源),A1、D1构成积分器(相位累加器),θ(n)是相位累加器输出的相位,Q1为量化器,用于将相位累加器位数与查找表地址之间的匹配,ϑ(n)为查找表输入地址,Bϑ(n) 为查找表输入地址位数,T1为查找表。

    下面介绍DDS设计过程中常用到的公式,主要是输出频率公式及其变形。

    1. 输出频率

    fout=fclkθ2Bθ(n)f_{out} = \frac{{f_{clk}}{∆θ}}{2^{B_{θ(n)}}}

    1. 相位增量

    θ=fout2Bθ(n)fclk{∆θ} = \frac{f_{out}2^{B_{θ(n)}}}{f_{clk}}

    1. 频率分辨率

    f=fclk2Bθ(n)∆f = \frac{f_{clk}}{2^{B_{θ(n)}}}

    1. 相位累加器位数

    Bθ(n)=log2(fclkf){B_{θ(n)}} =|{log}_2(\frac{f_{clk}}{∆f})|

    3 基于FPGA的 DDS实现

    For example:

    设计一个参考时钟为100MHz,频率分辨率要求能够达到0.03Hz,输出sin信号频率为5.00000005MHz、查找表地址12位;

    理论分析:

    已知频率分辨率∆f与参考时钟f_clk,带入相位累加器位数公式计算

    B∆θ = 31.634318
    

    由于位数为整数,取整数32,所以实际的频率分辨率为

    ∆f = 0.023283064365386962890625Hz
    

    将其带入相位增量公式计算,取整数

    ∆θ = 21474836694.7483648≈21474836
    

    相位累加器输出32位,而查找表输入地址为12位,取相位累加器高12位作为查找表输入地址

    3.1 利用RTL实现DDS

    使用matlab产生sin⁡(θ)数据,θϵ[0,π],点数为2^12=4096,并保存在FPGA的memory中。

    wid = 12;
    len = 2^wid; 
    amp = 10000;
    t=0:2*pi/len:2*pi - 2*pi/len;
    y = round(sin(t)*amp);
    plot(y);
    

    matlab生成sin信号
    相位累加器就是一个积分器,很容易用FPGA实现。最终FPGA仿真结果如下,clk为参考时钟,phase为相位累加器输出,addr为查找表地址,cos_i、sin_q为信号输出:
    DDS RTL仿真波形

    3.2 利用Xlinx DDS IP实现

    上述已经对DDS理论进行了详细概述,利用Xlinx DDS IP实现上述例子相对容易的多,只需要填入对应的参数信息。
    DDS IP配置界面1
    DDS IP配置界面2
    需要注意的是,输入相位端口S_AXIS_PHASE与输出信号端口M_AXIS_DATA的格式,通过设计界面的Information查看,CHAN_0_POFF为初始相位,没有特殊要求一般设置为0,CHAN_0_PINC为相位增量∆θ。
    数据端口格式
    仿真结果如下图所示:
    DDS IP仿真波形

    4 DDS用途

    DDS用途非常广泛,后续会利用Xlinx DDS IP设计一些有趣的信号,例如线性调频信号、非重复扫描系统等。

    展开全文
  • 基于fpga的dds设计报告

    千次阅读 2019-03-31 15:39:26
    dds设计报告 大马猴 2019-3-31 版本目录: 版本 :V1.0 作者: 大马猴 说明 :初版 备注 一.dds设计需求 首先使用matalab生成可供ROM初始化的mif文件,能够提供方波、锯齿波、三角波、正弦波。通过四个不同的按键...

    dds设计报告
    大马猴
    2019-3-31
    版本目录:
    版本 :V1.0 作者: 大马猴
    说明 :初版 备注

    一.dds设计需求
    首先使用matalab生成可供ROM初始化的mif文件,能够提供方波、锯齿波、三角波、正弦波。通过四个不同的按键,可以实现切换波形的类型、增加波形的频率、减小波形的频率、增加振幅,四种功能。另外,每次按键按下,蜂鸣器响一声进行响应。数码管作为显示模块,选择的是6位七段共阳数码管,最高位用1/2/3/4表示选择的波形种类,次高位显示0~7不同档位的振幅大小,剩下四位作为频率大小显示,单位是百赫兹。我们将每次加减的长度设置为100HZ,初始频率也是100HZ,低于此数值便不能进行减操作,上限为1Mhz。特殊要求:当处于某一状态时,此时切换信号输入,要保持状态的频率等参数不变,当状态循环一圈后,再次回到此状态时,参数不复位,保持原来的参数。

    二.顶层设计

    在这里插入图片描述

    三.架构图
    首先用IP核的锁相环生成50Mhz的频率,pll_locked作为全局的内部复位信号。
    在这里插入图片描述
    这里由于没有用visio,可能有一点小瑕疵,在show模块里面还包括bin转bcd模块,转成bcd后,再输入数码管模块里面进行显示(代码均在我主页里面)。大致的流程思想图如上所述,用verilog搭建顶层,然后进行分层挨着进行描述就可以了。

    仿真结果:

    在这里插入图片描述

    程序下载地址:https://download.csdn.net/download/weiyunguan8611/11072859

    展开全文
  • 基于VHDL的DDS设计

    2010-05-18 22:06:36
    基于vhdl的DDS设计,对正弦波采样256个点,后端可采用dac0832来转换。程序来子互联网
  • 最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴。  DDS(Direct Digital Synthesizer)直接数字合成器,这是直译过来的名字。设计人员一般把它叫做...

      最近在学习基于FPGA的DDS设计,借此机会把学习过程记录下来,当作自己的学习笔记也希望能够帮助到学习DDS的小伙伴。

      DDS(Direct Digital Synthesizer)直接数字合成器,这是直译过来的名字。设计人员一般把它叫做信号发生器,用它来产生一些数字意义上的波形。它的意义还是挺大的,例如我们学习滤波器,就需要一个高低频率叠加的波形,现时生活中到处都是,可以在设计中,怎么能做出这样的波形呢?学习各种载波调制,需要将信息加载到载波上,而载波也一般都是一定频率的正弦波。DDS就是能够产生这种波形,对于学习数字信号处理以及信号调制解调等有很大的作用。

      FPGA是数字电路,怎么产生模拟的波形呢?如果单纯的使用FPGA是无论如何也产生不了连续不断的波形,一般都是使用FPGA产生数字信号,再利用DAC(Digital-to-Analog Converter)转化成为模拟的波形(如图1)。DAC芯片是一堆模拟电路的东西了,如果感兴趣的小伙伴可以在自己学习一下数字信号转化为模拟信号的过程。  

    图1

      FPGA是数字信号,通过DAC转化为模拟值,笔者在进行学习的时候一直有个疑问:既然FPGA是数字信号,那么也就只能输出数字信号,输出相邻的两个点中间一定是有一定距离的,输出的模拟波形应该像楼梯一样(有一定的幅值跳跃),而不是连续变化的,像这种情况下还是我们还可以用吗?答案是肯定的,如果“楼梯”的高度跳跃很小,并且在一个周期中有很多小的跳跃,那么就是可以用的。其实微积分的概念和这个道理应该差不多就是用无限多的矩形来近似曲线(如图2)。

    图2

    所以在设计时,只要将波形的一个周期(周期波形)中分成N段输出就可以了。

      DDS的实现一般都是由频率控制器、相位累加器和波形存储器构成(如图3)。

     

    图3 

      刚刚开始的时候接触到这个信息,笔者也不太理解,经过一段的时间思考,大概明白了其中的设计原理。我们直接从最终的输出开始分析,要输出的一个波形(数字意义上),例如正弦波。那么怎么输出呢,可以给出一个公式sin(2*pi*n/256),将n从0增长到255,就可以输出一个波形。如果这么写的话,就已经把一个周期分成了256份,也可以分成任意份,为了方便数字电路设计,一般都是2的整数次幂份。以下分析都当作一个周期分为256份。n等于一个数值就会输出一个值,把n所对应的位置看作是相位。例如n等于64时,输出的值正好对应于相位pi/2时。在FPGA中去计算sin,一般都是利用查表法,也就是说将一个周期分为N份,当输入的值比较接近与某一个相位时,就把这个相位点的值输出。那其实也就是把波形等分多份,存储在存储器中,而此时存储器就叫做波形存储器。存储器的输出是按照输入地址来决定的,如果想要输出一个完整的不断的波形,就需要地址从最小到最大不变循环,而存储器就会不断的输出波形。地址从最小到最大的累加,就被成为相位累加器。如果相位累加器1S从最小到最大循环了1000次,那么输出的波形的频率就为1KHz。故而相位累加器累加的速度决定输出波形的频率,而累加速度是由外部控制器来决定,所以此控制器被称作频率控制器。

      原理就是上述的那样,下面可以考虑如何来实现上述的过程。

      在设计中,笔者采用INTEL FPGA来实现,故此采用Quartus Prime 18。首先制作波形存储器,在FPGA中有很多存储器资源可以来用,在此选择ROM来当作存储器。利用ROM当存储需要制作初始化文件.mif或者.hex,这两种都可以,在这里采用.mif文件。

              .mif在Quartus 中显示为一个一个小区域(如图4),但是其实就是一种文件格式(如图5)。

      

    图4

    图5

      

      利用某些计算工具将数值计算出来,然后填入表格中,这种速度太慢,也太麻烦。我们一般采用下面所述的两种方法:

           利用mifmaker软件生成(QQ群:173560979群文件中),此软件用起来比较简单。只需要简单的设置“设定波形”即可。在设定成功后,点击“文件->保存”即可生成对应的.mif文件(如图6)。

     

    图6

      

      另外一种方法就是利用matlab实现,此方法要求设计者要有一定的matlab基础。源码如下:

     

    复制代码
     1 clear;
     2 clc;
     3 
     4 width = 8;
     5 depth = 256;
     6 
     7 file_handle = fopen('sin.mif','w+');
     8 fprintf(file_handle,'--Created by Author xxx\r\n');
     9 fprintf(file_handle,'WIDTH = %d;\r\n',width);
    10 fprintf(file_handle,'DEPTH = %d;\r\n',depth);
    11 fprintf(file_handle,'ADDRESS_RADIX = HEX;\r\n');
    12 fprintf(file_handle,'DATA_RADIX = HEX;\r\n');
    13 fprintf(file_handle,'CONTENT BEGIN\r\n');
    14 for i = 0 : depth-1
    15     fprintf(file_handle,'%4x   :   %4x  ;  \r\n',i,floor((0.5+0.5*sin(2*pi*i/depth) ) *(2^width - 1)));
    16 end
    17 fprintf(file_handle,'END;\r\n');
    18 fclose(file_handle);
    复制代码

     

       产生了.mif后,就可以加载到ROM中。在quartus工程中,采用50MHz的时钟来进行驱动整个设计,让rom的地址每个时钟周期增加1。经过仿真可以得到正弦波(如图7)。

     

     图7

      产生了正弦波,在设置modelsim时,因为波形是按照无符号生成的数据,所以在设置成为模拟之前要先把进制改为无符号类型。即可产生图7波形。经过使用modelsim工具测试,产生的波形的频率为195.313KHz。我们自己也算以下:系统的驱动时钟为50MHz,一个周期为20ns,256个周期输出一个完整的波形。所以波形的周期为256x20ns=5120ns,经过计算频率为195.3125KHz,与上述使用modelsim工具测试结果一直,只是modelsim测试保留了频率的两位小数而已。

      相位累加器每次累加1,产生的波形的频率为195.313KHz,那么只要改变每次累加的数字就可以得到其他频率。如果每次增加的是整数比较好办,那如果每次增加的是带有小数呢?又该如何实现呢?

      笔者水平有限,如有不妥之处,恳请大佬指出。

      欢迎加好友探讨QQ:746833924,QQ群:173560979。

    展开全文
  • 基于V HDL编程的DDS设计,分析了DDS 的设计原理,基于V HDL 语言进行系统建模,对DDS 进行参数设计,实现了可重构的IP 核,能够根据需要方便的修改参数以实现器件的通用性。同时利用Quartus Ⅱ编译平台完成一个具体DDS ...
  • 电子科技dds设计与实现,一篇论文,讲的非常详细。dds的原理的以及实现方法。 cnki文件 打开。
  • 基于verilog的DDS设计

    2019-03-23 12:00:52
    设计一个完整的DDS波形发生器模块,可实现频率、相位可调,三种波形。 (1) 模式控制:正弦波/三角波/矩形波 (2) 频率控制:直接设置频率值 (3) ROM表地址长度2^8=256、数据位宽10位 (4) 分辨率优于1Hz
  • 基于verilog的DDS实验代码南京理工大学DDS实验。
  • 0 引言  随着现代电子技术的不断发展,在通信系统中往往需要在一定频率范围内提供一系列...目前在高频领域中,专用DDS芯片在控制方式、频率控制等方面与系统的要求差距很大,利用FPGA来设计符合自己需要的DDS系统就
  • DDS设计中,如果相位累加器每个时钟周期累加1,就会输出频率为195.313KHz的波形。如果每个时钟周期累加2,就会输出频率为2*195.313KHz的波形·······,如果每两个时钟周期累加1,就会输出195.313/2KHz的波形...

      在DDS设计中,如果相位累加器每个时钟周期累加1,就会输出频率为195.313KHz的波形。如果每个时钟周期累加2,就会输出频率为2*195.313KHz的波形·······,如果每两个时钟周期累加1,就会输出195.313/2KHz的波形······,如果按照这样来设计话,不太方便并且输出波形的频率是不连续的,只能输出一些特殊的频率。

      首先我们可以一起考虑一个问题,如果我们想要得到一个累加数字0~9,但是想要每次累加的数字有可能是整数也有可能是小数,那么此时整个计算又不让出现小数,应该怎么做呢?我们可以做一个三位数,然后把百位当作我们的输出,然后每次累加的数字自己可以随意调整,也就是相当于之前可以累加小数,小数最小精度为两位小数。000+011=011,123+001=124。如果按照此中方式,让数字一直不断的累加,数字会从最小到最大,不断循环。但是最高位依然是0~9的变化,只不过0~9变化的周期是受到每次累加的值的影响。如果每次累加001,那么百位0~9的循环就需要1000个累加(不要仅仅想0~900,要不断循环),如果每次累加010,那么百位0~9的循环就需要100个累加。

      如果考虑明白上述的问题,那么在DDS中,我们做了一个相位累加器,但是累加器只是负责ROM地址的输出也就是8位的。如果按照上述思想我们可以设计一个位宽为32位的计数器,把计数器的高八位当作ROM的地址。让计数器每个时钟周期累加1,地址从0增长到255,也就是8‘b00000000~8’b11111111,需要整个32位从全0到全1,一共需要2的32次幂个时钟周期,而这个也就是输出整个波形用的时间----波形周期。我们可以算出周期:2的32次幂*20ns,频率为0.01164153218Hz(这个数字太长了,用f0代替)。每次加1,频率为f0,如果每次加2,频率为2倍的f0。那么我们可以任意整数倍的f0,如果f0足够小(此时f0已经足够小),我们认为可以得到任意频率。如果f0的频率不够小,可以通过增加计数器的位宽来实现。

      建议读者不要每次加1去仿真,仿真时间太长,并且有可能导致整个仿真器卡主。笔者在此仿真每次累加100K。

    复制代码
     1 module addr_ctrl (
     2 
     3     input    wire                clk_50m,
     4     input    wire                rst_n,
     5     
     6     output    wire    [7:0]        addr
     7 );
     8 
     9     reg                [31:0]        cnt;
    10     
    11     assign     addr = cnt[31:24];
    12     
    13     always @ (posedge clk_50m, negedge rst_n) begin
    14         if (rst_n == 0)
    15             cnt <= 0;
    16         else
    17             cnt <= cnt + 100_000;
    18     end
    19 
    20 endmodule 
    复制代码

    仿真结果如图8。

    图8

      每次累加100K,仿真测试频率为1.164KHz。每次累加1,得出的频率为0.01164153218Hz。正好扩大了100K倍。现在我们只要知道做每次累加多少,就能够通过算基础这个频率的多少倍就能算出来频率,但是这么算是会有误差,因为上述得到的频率就是一个近似值。我们可以按照公式去计算频率,假如每次增加N,那么输出波形的周期应该是2的32次幂除以N乘以时钟周期(20ns),用1s除以周期就可以得到频率(如图9)。

    图9

      通过上面的方法,我们可以轻易知道,累加N所对应的频率。但是在实际应用中,往往是想要某一个频率的波形,而不是有了波形算波形的频率是多少。根据外部要求频率,算出来每次累加N的具体数值,这就是频率控制器。其实也是比较简单的,我们把上述公式转换以下就可以了(如图10)。

    图10

      把图10当中的公式在FPGA实现,输入F得到N就是频率控制器。在计算中会有可能存在一些误差,因为有可能计算的数值为12345.24,但是在累加时,会按照12345来进行累加,.24会被忽略,往往会带来一个误差,但是此误差一般都是可以接受的。

      好了DDS的设计到此结束了,但是如果想要真正输出一个模拟的波形还要驱动一个DAC器件,来达到真正的模拟波形的输出。

      笔者水平有限,如果设计中,有什么不妥的地方,恳请大佬们指出来。

      欢迎加好友探讨QQ:746833924,QQ群:173560979。

     

    展开全文
  • 采用CORDIC算法实时计算正弦值的方法,替代传统DDS中的正弦查找表,显著节省了硬件资源,极大提高了转换速度以及DDS的频率和相位分辨率。将基于改进的并行流水结构的CORDIC算法作为IP应用于高端DDS芯片中,同时利用...
  • FPGA实现DDS发生sine和cosine波,verilog
  • 利用可编程逻辑芯片设计DDS的方法通常是采用VHDL语言输入和原理图法相结合来设计整个信号发生电路,这种方法通常需要调用很多模块,综合性较强,对设计者要求较高。本文利用QuartusⅡ和Matlab/Simulink之间的接口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,713
精华内容 685
关键字:

dds设计