基于fpga的直接数字频率合成器的.docx
《基于fpga的直接数字频率合成器的.docx》由会员分享,可在线阅读,更多相关《基于fpga的直接数字频率合成器的.docx(54页珍藏版)》请在冰点文库上搜索。
基于fpga的直接数字频率合成器的
毕业设计论文
基于FPGA的直接数字频率合成器的设计
摘要在频率合成领域,常用的频率合成技术有直接模拟合成、模拟锁相环、小数分频锁相环等,直接数字频率合成(DirectDigitalFrequencySynthesis,DDFS,简称DDS)是近年来的新的频率合成技术。
本文介绍了直接数字频率合成器的基本组成及设计原理,给出了基于FPGA的具体设计方案及编程实现方法。
仿真结果表明,该设计简单合理,使用灵活方便,通用性好,可写入各种FPGA芯片,最高可将频率提高100万倍。
具有良好的性价比。
关键词直接数字频率合成器(DDS)FPGA
DesignofdirectdigitalfrequencysynthesizerbasedonFPGA
AbstractInFrequencydomain,thecommonSynthesistechnologyhasDirectsimulation,phaselockloopsimulation,decimalFrequencyandphaselockloop,DirectDigitalFrequencySynthesis(assomeDDFS,Digital,referredtoasspuriousbio-synthesis)inrecentyearsisthenewFrequencySynthesistechnology.ThestructureandprinciplesofDirectDigitalFrequencySynthesizerisintroduced.AlsoadetaileddesignandthemethodofprogramrealizationbasedonFPGAareintroduced.Theresultofsimulationshowsthatthedesignissimpleandfeasible,convenientandflexible,highuniversality,writeablevariousFPGAchip,thehighestfrequencycanbe100milliontimes.Ratioforqualitytoprice.
KeywordsDirectDigitalfrequencySynthesizer(DDS)FPGA
前言
在频率合成领域,常用的频率合成技术有直接模拟合成、模拟锁相环、小数分频锁相环等,直接数字频率合成(DDS)是近年来的新的频率合成技术。
DDS以稳定度高的参考时钟为参考源,通过精密的相位累加器和数字信号处理,再通过高速D/A变换器产生所需的数字波形,这个数字滤波经过一个模拟滤波器后,得到最终的模拟信号波形。
DDS是产生高精度、快速频率变换、输出波形失真小的优先选用技术。
随着可编程逻辑器件的飞速发展,使用FPGA(Field-ProgrammableGateArray)设计DDS系统成为一种很好的选择,由于FPGA现场可编程,设计复杂或者简单系统完全从实际需要出发,通过重写RAM/ROM数据,可以做到任意波形输出和动态波形输出,这是其他方法所无法比拟的。
本章提出了一种基于FPGA的直接数字频率合成设计方法,并利用比例乘法器,将频率分辨率提高到惊人的程度。
1DDS原理
顾名思义频率合成技术,就是能从一个高稳定和准确度的标准频率中产生千百万个同一高稳定度和准确度的频率。
频率合成技术广泛地应用于通信、导航、雷达、仪器仪表、军事装备等领域、现代的电子系统对频率合成器提出越来越高的要求,主要表现在:
转换速度快、频段宽、步进间隔小、杂散小、体积小、重量轻、功耗低等。
随着大规模集成电路的发展,频率合成技术日趋完善,目前,主要有以下几种方式。
1.1直接模拟(DAS)
直接模拟合成技术是通过对标准参考频率进行加、减、乘、除运算而合成一系列相干频率,其换频率速度主要由电路部件响应速度决定,相位噪声指标也还不错。
主要技术问题是杂波干扰,由于直接模拟合成引入了大量的混频器、倍频器、分频器,这些非线性的部件使得杂波抑制相当困难、在实际应用中,这种技术的电路结构比较复杂,体积、重量、成本等方面缺点大大限制其应用、
1.2间接式频率合成(PLL)
间接式频率合成技术重要有鉴频器、环路滤波器、压控振荡器、分频器等4个基本部件构成,如下图1-1所示。
锁相环是一个相位误差反馈控制系统,它比较输入信号和压控振荡器经分频后输出信号之间的相位差,从而产生误差控制电压来调整压控制振荡器的输出频率,以达到与输入信号倍频的关系。
锁相环的频率转换速度与环路滤波器的带宽有关,环路带宽越宽,转换速度越快,而环路带宽又取决于鉴相器频率。
才用这种技术产生的频谱较纯,系统体积小、重量轻、成本低、易集成,具有广泛的应用前景。
但是,它也有一个致命的缺点,就是在高分辨率情况下,换频速度较慢。
图1-1锁相环电路基本结构
为了解决高分辨率于高鉴相频率之间的矛盾,可以采用多环技术或者小数分频技术。
如果要求分辨率很高,那么采用多环PLL就显得电路结构复杂、成本高、调试困难;而采用小数分频技术,可以轻易解决高分辨率问题,但是小数分频的主要问题是“尾数难抑”,国内外对这方面的研究不少,但是还没有彻底解决。
1.3直接数字频率合成(DDS)
DDS的概念最初是有美国学者J.Tierncy,C.M.Rader和B.Gold提出的,它是以全数字技术,从相位概念出发直接合成所需波形的一种新的频率合成技术,典型的DDS系统由相位累加器,波形查找表(ROM/RAM),D/A,低通滤波器(LowPassFilter简称LPF)构成,如图1-2所示。
图1-2DDS原理框图
图中,m为相位累加器步长,也有资料称为频率控制字,
是参考频率,
是合成频率。
其系统的核心是相位累加器,它由一个累加器和一个n位相位寄存器组成(也可用带有输出锁存的累加器代替),如图1-3所示。
每来一个时钟脉冲
,相位累加器以步长m累加,其结果作为波形查找表地址。
当相位累加器加满量程,就会产生一次溢出,完成一个周期性的动作,这个周期是合成信号的一个周期,换句话说,累加器的溢出频率也就是DDS的合成信号频率。
相位累加器的输出数据作为波形查找表地址,进行波形的相位—幅值的转换,即可在给定的时间上确定输出波形的抽样幅值,如图1-4所示。
n位的寻址RAM/ROM相当于把
正弦信号离散成具有
个样值的序列,以二进制数值形式存储在
个地址单元,按照地址不同输出相应的信号幅值。
D/A转换器的作用是把合成的数字波形转换成模拟波形。
离散量化幅度序列S(n)经D/A转换后变成了阶梯波S(t),值得注意的是,频率合成系统对D/A转换器的分辨率有一定要求,D/A转换器的分辨率越高,合成的阶梯波S(t)台阶数越多,输出的波形的精度也就越高,减少了量化失真。
图1-3相位累加器
图1-4相位幅度变换原理图
低通滤波器的作用不容忽视。
对D/A输出的阶梯波S(t)进行频谱分析,可知S(t)中除了主频
外,还存在分布在
,2
……两边±
处的非谐波分量。
因此,为了取出主频
,必须在D/A转换器的输出端接入截止频率为
的低通滤波器。
DDS具有以下特点:
(1)频率分辨率高。
DDS的频率分辨率在
固定时,取决于相位累加器的位数n,只要n足够大,理论上就可以获得相应的分辨率精度,这是传统方法难以实现的。
(2)频率变换速度快。
在DDS中,一个频率的建立时间通常取决于滤波器的带宽。
影响因素为相位累加器,ROM/RAM的工艺结构,D/A转换器及它信号处理过程中可能产生的时延。
其中,信号处理的时延与时钟周期相关。
由于DDS中不要相位反馈控制,频率建立及切换快,与频率分辨率,频谱纯度相互独立,明显优于PLL。
(3)DDS中相位改变是线性过程。
数字相位累加器是优良的线性数字增值发生器。
因此,DDS的相位误差主要依赖于时钟的相位特性,相位误差小。
另外,DDS的相位是连续变化的,形成的信号具有良好的频谱特性,这是传统的直接频率合成法所无法实现的。
(4)输出频率范围宽。
理论上,DDS输出的频率范围在
,实际上,考虑到低通滤波器的设计,为
,而FPGA的时钟频率可达到100MHz,因此,利用FPGA,可以实现输出频率范围很宽的信号。
根据前面的讲述,可以得到一下公式:
其中,
是输出波形的周期,n是相位累加器位数,m是相位累加器步长,
是输入波形周期。
是参考频率,
是输出波形频率,
是最小分辨率,
是最高合成频率。
根据奈奎斯特(Nyquist)定理,即采样频率必须不小于被采样信号的最高频率,否则原信号不能被恢复,所以当
时,得到最高合成频率,当然,这仅是理论值,实际上与D/A精度、转换速度,滤波网络性能密切相关,一般取
,例如,晶振时钟为100MHz时,可知输出合成波频率将出现在较宽频段上。
2系统设计
本章所需要设计的直接数字频率合成系统与前面介绍的DDS原理完全一致。
从实现方式上看,有如下特色:
(1)引入8级级联的BCD比例乘法器,将频率分辨率提高100万倍!
(2)利用FPGA内部嵌入式存储单元,在FPGA内部集成了2Kbit容量双端口RAM,降低了硬件难度,提高了系统可靠性。
从前面的介绍中可以知道,增加相位累加器的位数n,可以提高频率分辨率,最低输出频率可达Hz、mHz甚至是μHz,即DDS的最低合成频率接近零频。
有人计算过,如果
为50MHz,那么当n为48位时,其分辨率可达179nHz。
但是,增加相位累加器的位数n将使加法算法过于庞大,消耗惊人的FPGA资源。
何不从
入手,对
实现任意可分频,利用降低
来换取高分辨率呢?
事实证明,使用比例乘法器是可行的,经过8级BCD比例乘法器的分频,分频比达到
,例如,晶振频率为100MHz,经过分频
可以是
Hz任意整数频率,整个分频模块仅消耗65个宏单元。
现代FPGA内部集成了存储单元,这些是宝贵的存储资源,通常只有通过利用开发商提供的知识产权核(IPCORE)才能使用,这些知识产权核经过严格的测试和优化,可以在特定器件上发挥最大效能,利用这些模块,就是将优秀EDA开发人员的硬件成果嵌入到自己设计中,缩短了开发时间,提高了效率。
本章设计的参数选取如下。
由相位累加器位数n=8,存储容量256×8=2048bit,晶振频率为100MHz,可知:
(1)频率分辨率
Hz
(2)最高合成频率
MHZ
前面讲过,这仅是理论值,实际中与具体电路(D/A,滤波器)有关。
(3)相位步进
本设计按照模块化层次化设计方法,根据结构功能,可以划分出3个功能模块,即微控制器接口模块、相位累加器模块、双端口RAM模块,其连接关系如图2-1所示。
图2-1
2.1微控制器接口模块
微控制器接口模块向微控制器提供友好,方便的操作接口,MCU可通过片选(CS)、地址选通(AS)、数据选通(DS)、数据总线和地址总线来操作其内部寄存器。
微控制器接口模块内部实现了6个寄存器,其中,4个位分频寄存器,1个位控制寄存器,1个位数据输入寄存器。
此外,8级比例乘法器组成的分频模块以端口映射的方式例化在控制器接口模块中,对外输出参考时钟频率fclk。
2.2相位累加寄存器
相位累加寄存器是系统的核心模块,使用经过分频器分频后的时钟,范围相当宽广。
相位累加器输出相位码序列,作为查寻地址送入双端口RAM,相应地,还有读使能和读时钟信号。
相位累加步长m可取
,n=0,1,2,…,7这里,为了减小失真,一般m取值不超过32
2.3双端口RAM
利用ALtera提供的MegaWizardPlug-InManager定制了数据线和地址线宽度均为8位,存储容量为2048bit的双端口RAM,独立的两套读/写接口,有兴趣的读者不妨使用MegaWizardPlug-InManager定制其他的存储器,看看哪种存储器使用起来最方便。
接口信号说明如下:
RESET,系统复位,低电平有效;
CS,片选信号,低电平有效;
AS,地址选通信号,低电平有效;
DS,数据选通信号,低电平有效;
DATABUS,数据总线;宽度为8位;
ADDRBUS,地址总线,宽度为3位。
顶层实体的VHDL程序如下:
--dds.vhd
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYddsIS
PORT(
--与微控制器接口信号
--全局复位
reset:
INSTD_LOGIC;
--全局时钟
clk:
INSTD_LOGIC;
--地址总线
addrbus:
INSTD_LOGIC_VECTOR(2DOWNTO0);
--数据总线
databus:
INSTD_lOGIC_VECTOR(7DOWNTO0);
--片选
cs:
INSTD_LOGIC;
--地址选通
as:
INSTD_LOGIC;
--数据选通
ds:
INSTD_LOGIC;
--数据输出,送至D/A转换器
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDdds;
ARCHITECTURErtlofddsIS
--元件说明
--接口模块
COMPONENTinterface
port(
--与微控制器接口信号
--全局复位
reset:
INSTD_LOGIC;
--全局时钟
clk:
INSTD_LOGIC;
--地址总线
addrbus:
INSTD_LOGIC_VECTOR(2DOWNTO0);
--数据总线
databus:
INSTD_lOGIC_VECTOR(7DOWNTO0);
--片选
cs:
INSTD_LOGIC;
--地址选通
as:
INSTD_LOGIC;
--数据选通
ds:
INSTD_LOGIC;
--与内部模块接口信号
--DDS扫频使能
ddsen:
OUTSTD_LOGIC;
--经比例乘法器分频后的时钟
fclk:
OUTSTD_LOGIC;
--步长
m:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--数据输出,送至双端口RAM
dataout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--地址输出,送至双端口RAM
addrout:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
--双端口RAM写使能
wren:
OUTSTD_LOGIC;
--双端口RAM写时钟
wrclock:
OUTSTD_LOGIC
);
ENDCOMPONENT;
--双端口RAM
COMPONENTramdp
PORT(
wren:
INSTD_LOGIC;
wrclock:
INSTD_LOGIC;
rden:
INSTD_LOGIC;
rdclock:
INSTD_LOGIC;
data:
INSTD_LOGIC_VECTOR(7DOWNTO0);
wraddress:
INSTD_LOGIC_VECTOR(7DOWNTO0);
rdaddress:
INSTD_LOGIC_VECTOR(7DOWNTO0);
q:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
--相位累加器
COMPONENTphasesum
PORT(
--全局复位
reset:
INSTD_LOGIC;
--分频时钟
fclk:
INSTD_LOGIC;
--扫频使能
ddsen:
INSTD_LOGIC;
--相位累加步长
m:
INSTD_LOGIC_VECTOR(7DOWNTO0);
--读RAM时钟
rdclock:
OUTSTD_LOGIC;
--读RAM使能
rden:
OUTSTD_LOGIC;
--读RAM地址
rdaddress:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDCOMPONENT;
--信号说明
SIGNALddsen:
STD_LOGIC;
SIGNALfclk:
STD_LOGIC;
SIGNALwren:
STD_LOGIC;
SIGNALwrclock:
STD_LOGIC;
SIGNALrdclock:
STD_LOGIC;
SIGNALrden:
STD_LOGIC;
SIGNALdataout:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALaddrout:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALm:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALrdaddress:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
------------------------------------------------------------
--元件例化
------------------------------------------------------------
INTER_CONTROL:
interface
PORTMAP(
--与微控制器接口信号
--全局复位
reset=>reset,
--全局时钟
clk=>clk,
--地址总线
addrbus=>addrbus,
--数据总线
databus=>databus,
--片选
cs=>cs,
--地址选通
as=>as,
--数据选通
ds=>ds,
--与内部模块接口信号
--DDS扫频使能
ddsen=>ddsen,
--经比例乘法器分频后的时钟
fclk=>fclk,
--步长
m=>m,
--数据输出,送至双端口RAM
dataout=>dataout,
--地址输出,送至双端口RAM
addrout=>addrout,
--双端口RAM写使能
wren=>wren,
--双端口RAM写时钟
wrclock=>wrclock
);
--双端口RAM
DP_RAM:
ramdp
PORTMAP(
wren=>wren,
wrclock=>wrclock,
rden=>rden,
rdclock=>rdclock,
data=>dataout,
wraddress=>addrout,
rdaddress=>rdaddress,
q=>q
);
--相位累加器
PHASE_ADDER:
phasesum
PORTMAP(
--全局复位
reset=>reset,
--分频时钟
fclk=>fclk,
--扫频使能
ddsen=>ddsen,
--相位累加步长
m=>m,
--读RAM时钟
rdclock=>rdclock,
--读RAM使能
rden=>rden,
--读RAM地址
rdaddress=>rdaddress
);
ENDrtl;
图2-2是顶层实体仿真波形,由图中可以看到,首先,向地址为000的寄存器写数据00010000,表示将晶振频率10分频,然后向地址为100的寄存器写数据10000000,表示相位累加器使能,随后,输出波形。
读者可能暂时还不能理解整个系统的工作原理,这里只需了解系统的轮廓即可,后面会详细介绍各模块的设计与实现。
3模块设计与实现
如前面所述,顶层实体由3个模块构成:
微控制器接口模块、相位累加器模块及双端口RAM模块。
由8个比例乘法器级联组成的分频器模块以端口定义的形式例化在微控制器模块中,属于后者的子模块,但是由于比例乘法器的本设计中所发挥的作用很大,加之相关资料少之又少,为了加深读者的领悟,决定单独作为一节。
3.1微控制器接口模块
微控制器接口向8位、16位、32位微处理器级微控制器提供友好的操作接口,如图3-1所示。
其输入引脚前面已经介绍过,这里不再重复。
现在,介绍一下输出引脚。
图3-1
ddsen:
相位累加器使能,有效时为高电平;
fclk:
分频时钟,作为相位累加器的输入时钟;
m:
相位累加步长,m=
,n=0,1,2,…,7;
dataout:
数据输出,作为RAM输入数据;
addrout:
地址输出,作为RAM输入地址;
wern:
RAM写使能信号;
wrclock:
RAM写时钟信号。
前面已经提到,DDS内部实现了6个寄存器,其中,4个位分频寄存器,1个位控制寄存器,1个位数据输入寄存器,这些寄存器的地址在表3-1中。
表3-1寄存器地址
名称
访问属性
地址
FWORD1
Write
000
FWORD2
Write
001
FWORD3
Write
010
FWORD4
Write
011
DDSCR
Write
100
DATA
Write
101
3.1.1分频寄存器(FWORD1-FWORD4)
以FWORD1为例,如表3-2所示。
分频寄存器用于存储分频系数,分频模块由8个BCD比例乘法器构成。
每一个比例乘法器需要4位二进制码来确定分频系数,4×8=32bit,也就是4byte。
FWORD1对应第一级和第二级比例乘法器,FWORD2对应第三级和第四级比例乘法器,以此类推,FWORD4对应第七级和第八级比例乘法器。
表3