最新文章专题视频专题问答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
当前位置: 首页 - 正文

基于VHDL的DDS设计

来源:动视网 责编:小OO 时间:2025-10-01 18:28:53
文档

基于VHDL的DDS设计

信息与通信工程学院VHDL课程设计2013年5月基于VHDL语言的DDS的设计1.设计内容DDS即直接数字频率合成,是近年来发展起来的一种新的频率合成技术,其主要优点是相对带宽很大,频率转换时间极短(可小于20ns),频率分辨率很高,全数字化结构便于集成,输出相位连续可调,且频率、相位和幅度均可实现程控。DDS能够与计算机技术紧密结合在一起,克服了模拟频率合成和锁相频率合成等传统频率合成技术电路复杂、设备体积较大、成本较高的不足,因此它是一种很有发展前途的频率合成技术。DDS技术现已在接收机本
推荐度:
导读信息与通信工程学院VHDL课程设计2013年5月基于VHDL语言的DDS的设计1.设计内容DDS即直接数字频率合成,是近年来发展起来的一种新的频率合成技术,其主要优点是相对带宽很大,频率转换时间极短(可小于20ns),频率分辨率很高,全数字化结构便于集成,输出相位连续可调,且频率、相位和幅度均可实现程控。DDS能够与计算机技术紧密结合在一起,克服了模拟频率合成和锁相频率合成等传统频率合成技术电路复杂、设备体积较大、成本较高的不足,因此它是一种很有发展前途的频率合成技术。DDS技术现已在接收机本
信息与通信工程学院

 

VHDL课程设计

 

2013年5月

           基于VHDL语言的DDS的设计  

1.设计内容    

DDS即直接数字频率合成,是近年来发展起来的一种新的频率合成技术,其主要优点是相对带宽很大,频率转换时间极短(可小于20 ns),频率分辨率很高,全数字化结构便于集成,输出相位连续可调,且频率、相位和幅度均可实现程控。DDS 能够与计算机技术紧密结合在一起,克服了模拟频率合成和锁相频率合成等传统频率合成技术电路复杂、设备体积较大、成本较高的不足,因此它是一种很有发展前途的频率合成技术。DDS 技术现已在接收机本振、信号发生器、通信系统、雷达系统等方面得到广泛应用。数字频率合成器作为一种信号产生装置己经越来越受到人们的重视,它可以根据用户的要求产生相应的波形,具有重复性好、实时性强等优点,己经逐步取代了传统的函数发生器。

我们组本次课程设计的目的是设计基于所学课程VHDL硬件描述语言开发出一个能产生正弦波、方波、三角波、锯齿波等波形的信号源。

2.实现方案 

 2.1 DDS原理 

直接数字频率合成是采用数字化技术,通过控制相位的变化速度,直接产生各种不同频率、不同波形信号的一种频率合成方法。DDS 的基本结构如图1 所示,它主要由相位累加器、正弦ROM 表、D/A 转换器和低通滤波器构成。

 图1 DDS工作原理图

DDS 工作时,在时钟脉冲f 的控制下对频率控制字K 用累加器进行处理以得到相应的相位码,然后由相位码寻址波形存储器进行相位码―幅度编码变换,再经过D/A 数模变换器得到相应的阶梯波,最后经过低通滤波器对阶梯波进行平滑处理即可得到由频率控制字K 决定的频率可调的输出波形。参考频率源一般是高稳定的晶体振荡器,用于DDS 中各部件的同步工作,因此DDS 输出的合成信号频率稳定度与晶体振荡器是相同的。在标准频率参考源的控制下,频率控制字K可决定相应的相位增量,相位累加器则以步长K进行线性累加,相位累加器积满时就会产生一次溢出,从而完成一个周期性动作,这个动作周期即是DDS合成信号的一个周期。通常N 位相位累加器的最小值为0,最大值为2N −1,故最后输出信号的频率为f= Kfc /2,频率分辨率的大小为Δ f= f/2。实际运用中,根据实际需要所计算出的K 很难为整数,因此不可避免地会存在频率误差。如将计算出来的K的小数部分舍去,那么最终输出信号的频率误差不超过频率分辨率Δf ;如果将K 的小数部分四舍五入,则频率误差不会超过0.5Δf 。

DDS 技术可以理解为数字信号处理中信号综合的硬件实现问题,即给定信号幅度、频率、相位参数,产生所需要的信号波形,也可以认为是给定输入时钟和频率控制字K,输出一一对应的正弦信号。由于DDS采用了不同于传统频率合成方法的全数字结构,所以它具有直接模拟频率合成和间接频率合成方法所不具备的一些优点。

2.2 基于FPGA 的DDS 模块设计

DDS 遵循奈奎斯特(Nyquist)取样定律,即最高的输出频率是时钟频率的一半(f=0.5 f)。在实际应用中DDS 的最高输出频率还由允许输出的杂散水平决定,一般情况下f≤0.4 f。在使用FPGA 设计DDS 时,要在满足系统要求和保持DDS 原有优点的基础上,尽量减少硬件复杂性,降低芯片面积和功耗,提高芯片速度。综合以上考虑,所设计DDS 电路的电路结构如图2 所示。

 图2  用FPGA实现的DDS电路功能框图

2.3 采用方案

   上述框图中的实现方案需要ROM模块,用来存储波形的取样值.mif.文件。相位累加器模块产生波形数据ROM 的8 位读取地址RomAdder,设计复杂程度相对高,所以我们组另辟蹊径,并没有采用ROM实现,而采用了描点法,对应于不同的相位值给定不同的波形幅度取样值。此设计中,我们取样了个相位点,随着相位点的变化,针对不同要求的输出波形,给定相对应的输出幅值,从而产生不同的输出波形。通过拨码开关可以选择输出正弦波,三角波,方波等不同波形。在FPGA工程文件中,采用Sel[3..0]l来选择,当Sel为0001时,输出正弦波;当Sel为0010时,输出方波;当Sel为0100时,输出三角波;当Sel为1000时,输出锯齿波。将输出端接到实验板中的DAC0832,实现数模转换后,通过示波器即可观察到相应的实验波形。

3实验仿真

此次课程设计初衷是打算在示波器上观察输出波形,但是由于实验箱中的DAC0832数模转换在连接后并没有输出,但模拟端是有电压值显示。究其原因可能是DAC0832是与CPLD相连,而不是FPGA芯片连接,实验中所给出的管脚分配不对应导致。所以只能选择通过仿真软件示出波形。本设计中所采用的仿真软件是Modelsim6.4版本。

                       图3 Modelsim软件

波形仿真结果如下:

case sel is

when "0001"=> --正弦波

  将时间轴展宽,可以看到波形呈阶梯状,且较为明显,这是由于本设计中取样值为点,点数较少,如果增加取样值到256点或这更多,如1024点时,波形就会呈现出较平滑的特性。

 正弦波

when "0010"=> --方波

 方波

方波波形较为清晰,规整,这是由于方波本身只有高低电平,幅值只有两个,不需要多点连续变化。

when "0100"=> --三角波

 三角波

展宽时间轴,同样会出现类似正弦波的情形,原因也是取样值较少,波形没有呈现平滑变化的特点。

when"1000"=>--锯齿波

                            锯齿波

锯齿波的产生原理同三角波,只是在到最高点后下一时刻直接返回到最低点,之后继续。

在最后的仿真波形中,通过对波形周期的抓取,T=2560ns,在一个时间轴中分别显示了三周期的正弦波、三角波、方波、锯齿波,仿真结果如下:

4.心得体会

 本次课程设计虽然我们组在做DDS的时候采用的是一种相对简单的方案进行实现,但是在调试过程中也遇到了很多问题,比如说在实验仿真过程中,起初打算用DAC0832进行数模转换,后接到示波器上进行波形显示,在实验箱中配置

完对应的管脚后,不出现波形,最开始以为是实验程序问题,反复对程序进行修正,但是不管怎么修改,示波器始终没有波形出现,由于实验中用到的DAC0832是和CPLD相连接,而不是和FPGA直接相连,所以在实验指导中管脚分配可能出现错误。不得不放弃用示波器示出波形,转而考虑用仿真软件Modelsim去显示,经过反复调试终于正确的显示了想要的波形。完成本课程设计的同时,收获了很多,在遇到问题不断想办法去解决的过程中才是一个真正能学习到东西的过程。我们组在调试的过程中,相互配合,尤其在孙永昌身上我觉得可以学到很多,他那种遇到问题不放弃,始终乐观去思考、去解决的态度让我感触很深,这也正是我所欠缺的。

经过我们的努力虽然完成本次课程设计的内容,但是仍有很多不足或者可以改进的地方,比如我们所采用的描点法实现直接数字频率计,由于取样点数目只有点,必定会导致波形不是很平滑的过渡,有些地方呈现明显的阶梯状,波形不完美。另外由于没有使用ROM,不能对波形进行频率的调节,功能较为单一。这些都是我们需要改进的地方,我看到了我的不足,日后会加以改进。

                     附录

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity test is

    port(    clk : in std_logic;

            sel : in std_logic_vector (3 downto 0);

            pout: out integer range  255 downto 0

        );

end;

architecture dacc of test is

    signal q:  integer range 63 downto 0;

    signal d:  integer range 255 downto 0;

    --signal q1:  integer range 3 downto 0;

begin

    process(clk)

    begin

        if clk'event and clk='1' then

         if q<63 then

             q<=q+1;

            else 

             q<=0;

            end if;

        end if;

    end process;

    

    process(q,sel)

    begin

        case sel is

         when "0001"=> --正弦波

            case q is

             when 00=>d<=255; when 01=>d<=254; when 02=>d<=252;

              when 03=>d<=249; when 04=>d<=245; when 05=>d<=239;

              when 06=>d<=233; when 07=>d<=225; when 08=>d<=217;

              when 09=>d<=207; when 10=>d<=197; when 11=>d<=186;

              when 12=>d<=174; when 13=>d<=162; when 14=>d<=150;

              when 15=>d<=137; when 16=>d<=124; when 17=>d<=112;

              when 18=>d<=99;  when 19=>d<=87;  when 20=>d<=75;

              when 21=>d<=;  when 22=>d<=53;   when 23=>d<=43;      

             when 24=>d<=34; when 25=>d<=26; when 26=>d<=19;

              when 27=>d<=13;  when 28=>d<=8; when 29=>d<=4;

              when 30=>d<=1;   when 31=>d<=0;    when 63=>d<=255;

              when 62=>d<=254; when 61=>d<=252;  when 60=>d<=249;

             when 59=>d<=245; when 58=>d<=239;  when 57=>d<=233;

              when 56=>d<=225; when 55=>d<=217;  when 54=>d<=207;

              when 53=>d<=197; when 52=>d<=186;  when 51=>d<=174;

              when 50=>d<=162; when 49=>d<=150;  when 48=>d<=137;

             when 47=>d<=124; when 46=>d<=112;  when 45=>d<=99;

              when 44=>d<=87;  when 43=>d<=75;  when 42=>d<=;

              when 41=>d<=53; when 40=>d<=43;   when 39=>d<=34;

              when 38=>d<=26; when 37=>d<=19;  when 36=>d<=13;

             when 35=>d<=8; when 34=>d<=4;   when 33=>d<=1;

              when 32=>d<=0;

             when others=>null;

            end case;

    

      when "0010"=> --方波

            case q is

             when 00=>d<=255; when 01=>d<=255; when 02=>d<=255;

              when 03=>d<=255; when 04=>d<=255; when 05=>d<=255;

              when 06=>d<=255; when 07=>d<=255; when 08=>d<=255;

              when 09=>d<=255; when 10=>d<=255; when 11=>d<=255;

when 12=>d<=255; when 13=>d<=255; when 14=>d<=255;

when 15=>d<=255; when 16=>d<=255; when 17=>d<=255;

when 18=>d<=255; when 19=>d<=255; when 20=>d<=255;

when 21=>d<=255; when 22=>d<=255; when 23=>d<=255;

when 24=>d<=255; when 25=>d<=255; when 26=>d<=255;

when 27=>d<=255; when 28=>d<=255; when 29=>d<=255;

when 30=>d<=255; when 31=>d<=255; when 63=>d<=0;

when 62=>d<=0;   when 61=>d<=0;  when 60=>d<=0;

when 59=>d<=0;   when 58=>d<=0;  when 57=>d<=0;

when 56=>d<=0;   when 55=>d<=0;  when 54=>d<=0;

when 53=>d<=0;   when 52=>d<=0;  when 51=>d<=0;

when 50=>d<=0;   when 49=>d<=0;  when 48=>d<=0;

when 47=>d<=0;   when 46=>d<=0;  when 45=>d<=0;

when 44=>d<=0;   when 43=>d<=0;  when 42=>d<=0;

when 41=>d<=0;   when 40=>d<=0;  when 39=>d<=0;

when 38=>d<=0;   when 37=>d<=0;  when 36=>d<=0;

when 35=>d<=0;   when 34=>d<=0;  when 33=>d<=0;

when 32=>d<=0;

             when others=>null;

            end case;

    

     when "0100"=> --三角波

            case q is

             when 00=>d<=0;  when 01=>d<=8;  when 02=>d<=16;

              when 03=>d<=24;  when 04=>d<=32; when 05=>d<=40;

                 when 06=>d<=48; when 07=>d<=56;  when 08=>d<=;

when 09=>d<=72; when 10=>d<=80; when 11=>d<=88;

when 12=>d<=96; when 13=>d<=104; when 14=>d<=112;

when 15=>d<=120; when 16=>d<=128; when 17=>d<=136;

when 18=>d<=144; when 19=>d<=152; when 20=>d<=160;

                  when 21=>d<=168; when 22=>d<=176; when 23=>d<=184;

when 24=>d<=192; when 25=>d<=200; when 26=>d<=208;

when 27=>d<=216; when 28=>d<=224; when 29=>d<=232;

when 30=>d<=240; when 31=>d<=248; when 63=>d<=8;

when 62=>d<=16; when 61=>d<=24; when 60=>d<=32;

              when 59=>d<=40; when 58=>d<=48; when 57=>d<=56;

                 when 56=>d<=; when 55=>d<=72; when 54=>d<=80;

                 when 53=>d<=88; when 52=>d<=96;  when 51=>d<=104;

when 50=>d<=112; when 49=>d<=120; when 48=>d<=128;

when 47=>d<=136; when 46=>d<=144; when 45=>d<=152;

when 44=>d<=160; when 43=>d<=168; when 42=>d<=176;

when 41=>d<=184; when 40=>d<=192; when 39=>d<=200;

when 38=>d<=208; when 37=>d<=216; when 36=>d<=224;

when 35=>d<=232; when 34=>d<=240; when 33=>d<=248;

when 32=>d<=255;

             when others=>null;

            end case;

    

     when "1000"=> --锯齿波

            case q is

             when 00=>d<=0; when 01=>d<=4; when 02=>d<=8;

                  when 03=>d<=12;  when 04=>d<=16; when 05=>d<=20;

when 06=>d<=24; when 07=>d<=28;  when 08=>d<=32;

when 09=>d<=36; when 10=>d<=40; when 11=>d<=44;

when 12=>d<=48; when 13=>d<=52; when 14=>d<=56;

when 15=>d<=60;  when 16=>d<=; when 17=>d<=68;

when 18=>d<=72; when 19=>d<=76;  when 20=>d<=80;

when 21=>d<=84; when 22=>d<=88; when 23=>d<=92;

when 24=>d<=96; when 25=>d<=100; when 26=>d<=104;

when 27=>d<=108; when 28=>d<=112; when 29=>d<=116;

when 30=>d<=120; when 31=>d<=124;when 63=>d<=252;

when 62=>d<=248; when 61=>d<=244; when 60=>d<=240;

when 59=>d<=236; when 58=>d<=232; when 57=>d<=228;

                 when 56=>d<=224; when 55=>d<=220; when 54=>d<=216;

when 53=>d<=212; when 52=>d<=208; when 51=>d<=204;

when 50=>d<=200; when 49=>d<=196; when 48=>d<=192;

when 47=>d<=188; when 46=>d<=184; when 45=>d<=180;

when 44=>d<=176; when 43=>d<=172; when 42=>d<=168;

when 41=>d<=1; when 40=>d<=160; when 39=>d<=156;

when 38=>d<=152; when 37=>d<=148; when 36=>d<=144;

when 35=>d<=140; when 34=>d<=136; when 33=>d<=132;

when 32=>d<=128;

             when others=>null;

            end case;    

     when others=>null;

        end case;

     end process;

  pout<=d;

end;

文档

基于VHDL的DDS设计

信息与通信工程学院VHDL课程设计2013年5月基于VHDL语言的DDS的设计1.设计内容DDS即直接数字频率合成,是近年来发展起来的一种新的频率合成技术,其主要优点是相对带宽很大,频率转换时间极短(可小于20ns),频率分辨率很高,全数字化结构便于集成,输出相位连续可调,且频率、相位和幅度均可实现程控。DDS能够与计算机技术紧密结合在一起,克服了模拟频率合成和锁相频率合成等传统频率合成技术电路复杂、设备体积较大、成本较高的不足,因此它是一种很有发展前途的频率合成技术。DDS技术现已在接收机本
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top