您现在的位置: 无忧电子商务网 >> 信息学院 >> 论文中心 >> 理工论文 >> 计算机与信息技术论文 >> 正文

基于CPLD的三相多波形函数发生器设计

作者:佚名    信息学院来源:网络整理    点击数:    更新时间:2006-4-2 我要参与讨论

      摘要:介绍了基于可编程逻辑器件CPLD和直接数字频率合成技术(DDS)的三相多波形函数发生器的基本原理,并在此基础上给出了基于CPLD的各模块设计方法及其VHDL源程序。sO100
    关键词:CPLD;直接数字频率合成;函数发生器;VHDL
    1引言
    直接数字频率合成DirectDigitalSynthesis,DDS是20世纪60年代末出现的第三代频率合成技术。该技术从相位概念出发,以Nyquist时域采样定理为基础,在时域中进行频率合成。DDS频率转换速度快,频率分辨率高,并在频率转换时可保持相位的连续,因而易于实现多种调制功能。DDS是全数字化技术,其幅度、相位、频率均可实现程控,并可通过更换波形数据灵活实现任意波形。此外,DDS易于单片集成,体积小,价格低,功耗小,因此DDS技术近年来得到了飞速发展,其应用也越来越广泛。
    基于CPLD和DDS技术的函数发生器可以实现信号波形的多样化,而且方便可靠,简单经济,系统易于扩展,同时可大大提高输出信号的带宽。
    2系统原理
    2.1CPLD内部设计
    CPLD的内部结构框图如图1所示,图中,首先由控制寄存器将外部控制器(如单片机)送入的数据转换为频率和幅度控制字;然后再由分频器根据频率控制字进行分频并将输出作为寻址计数器的时钟;寻址计数器的寻址空间为360字节,可对ROM中的查找表进行寻址;而通过模360加法器可以产生120°的相位差。
    2.2CPLD的外围电路
    图2所示是CPLD的外围电路连接图。图中,CPLD幅度控制字经D/A转换输出后,可作为查找表输出DAC的参考电压,该参考电压可通过改变幅度控制字来进行改变,从而改变输出信号的幅度。
    3CPLD各模块的设计
    3.1控制寄存器的设计
    控制寄存器设计主要是将外部控制器输入的数据转换为频率和幅度控制字。其程序代码如下:
    --////////////调库////////////--
    entitycontrolleris
    port(clk:instd_logic;
    datain:instd_logic;
    ad:outstd_logic_vector(16downto0);
    freq:outstd_logic_vector(16downto0));
    end;
    architecturedataflowofcontrolleris
    signalout1:std_logic_vector(16downto0);
    begin
    s2p:process(clk,datain)
    variabletemp:std_logic_vector(16downto0);
    begin
    ifclk'eventandclk=‘1’then
    temp:=temp(15downto0)&datain;
    endif;
    out1<=temp;
    endprocesss2p;
    mux:process(out1(16))
    begin
    ifout1(16)=‘1’then
    ad<=out1(15downto0);--1号寄存器为幅度控制字
    else
    freq<=out1(15downto0);--0号寄存器为频率控制字
    endif;
    endprocessmux;
    end;
    图3
    3.2分频比可变的分频器模块设计
    该设计主要是根据频率控制字决定分频倍数,从而输出与频率控制字相对应的频率时钟,此模块的输出可作为寻址计数器的时钟。具体代码如下:
    processclk--clk为外部时钟(如晶振)
    variabletemp,fen:std_logic_vector(15downto0);
    constanttemp1:std_logic_vector(15downto0):=“1111111111111111”;
    variablea:std_logic;
    begin
    fen:=temp1-fen_in;--使分频后的频率正比于频率控制字
    ifclk=‘1’andclk'eventthen
    iftemp=(‘0’&fen(15downto1))then--相当于除2运算
    a:=nota;
    temp:=temp+1;
    elsiftemp=fenthen
    a:=nota;
    temp:=“0000000000000000”;
    else
    temp:=temp+1;
    endif;
    endif;
    fenout<=a;--fenout为输入时钟的频率fen倍分频
    endprocess;
    3.3寻址计数器设计
    寻址计数器主要用于产生对ROM寻址输出波形数据的寻址信号,寻址空间为360字节,具体的程序代码如下:
    process(clk)
    variabletemp:integerrange0to359;
    begin
    ifclk=‘1'andclk'eventthen
    iftemp<359then
    temp:=temp+1;
    else
    temp:=0;
    endif;
    endif;
    adress<=temp;
    endprocess;
    3.4模360加法器设计
    此模块用来产生120°的相移,以形成三相相差为120°的输出波形。由于寻址空间为360字节,故在输出寻址数大于360时,须对360取模。程序如下:
    process(adress_in)
    variabletempintegerrange0to511;
    begin
    temp:=adressin+120;--相移120°
    iftemp<360then;
    adressout<=temp
    else
    adress_out<=temp-360;--综合工具不支持取模运算,故采用减法器来实现
    endif;
    endprocess;
    3.5查找表ROM设计
    此模块主要用于存储各种波形数据,以便通过寻址计数器寻址输出并经D/A转换来输出各种波形,其中包括正弦波、三角波、方波以及锯齿波。代码如下:
    process(adress,sel)
    begin
    ifsel=“00”then--sel为波形选择端口,选择输出波形,00为正弦波
    caseadressis
    when000=>data<=0;when001=>data<=4;......--正弦波查找表
    whenothers=>null;
    endcase;
    elseifsel=“01”then--01输出方波,
    ifadress<180then
    data<=255;
    else
    data<=0;
    endif;
    elseifsel=“10”then--锯齿波
    data<=adress/2;
    else--三角波
    ifadress<180then
    data<=adress;
    else
    data<=adress-180;
    endif;
    endif;
    endprocess;
    由以上各模块组成的三相波形发生器原理图如图3所示。
    4结束语
    此方案可以方便地输出多种三相波形,而且,由于CPLD具有可编程重置特性,因而可以方便地改变控制方式或更换波形数据,而且简单易行,易于系统升级,同时具有很高的性价比。ImgLoad(document.getElementById("BodyLabel"));

在google里搜索更多基于CPLD的三相多波形函数发生器设计

Google
Web www.51ec.org
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
我来说两句 对此文章发表了评论
  昵 称: *必填    ·注册用户·
  评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
评 论
内 容

 
评论列表 (最新 评论仅限网友观点!)

推荐文章
  • 此栏目下没有推荐信息学院
  • 热门文章
  • 此栏目下没有热点信息学院
  • 供求信息




    | 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明