微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 基于FPGA的直接数字频率合成技术设计

基于FPGA的直接数字频率合成技术设计

时间:11-08 来源:互联网 点击:
直接数字频率合成(DirectDigital FraquencySyn-thesis即DDFS,一般简称DDS)是从相位概念出发直接合成所需波形的一种新的频率合成技术。它在相对带宽、频率转换时间、相位连续性、正交输出、高分辨率以及集成化等一系列性能指标方面已远远超过了传统频率合成技术。当累加器的N很大时,最低输出频率可达Hz、mHz甚至μHz。也就是说:DDS的最低合成频率接近于零频。如果fc为50MHz, 那么当N为48位时,其分辨率可达179nHz。转换时间最快可达10ns的量级,这都是传统频率合成所不能比拟的。但它的不足之处是最高工作频率会受限、噪声和杂波不够理想。

本设计采用ALTERA公司的FPGA芯片EP1K30TC-144来实现DDS技术。EP1K30芯片属ALTERA公司的ACEX系列,该系列是ALTERA公司着眼于通信、音频处理及类似场合应用而推出的FPGA器件系列芯片,它采用0.22/0.18微米混合工艺,密度从10000门到100000门。所有ACEX系列器件均兼容64bit、66MHz的PCI,并支持锁相环电路。ACEX1K采用查找表(LUT)和EAB(嵌入式阵列块)相结合的结构,可用来实现存储器、专用逻辑功能和通用逻辑功能,每个EBA能提供4096比特的存储空间,每个LE包含4个输入LUT、一个可编程的触发器、进位链和一个层叠链。合理运用进位链能够提高系统运行速度。

EP1K30TC-144的最大系统门数为119000,它有1728个逻辑宏单元数和5个嵌入式阵列块,最大可提供2kB的ROM/RAM位,因而可完全满足DDS设计的要求。

1 DDS的实现过程

图1为DDS系统的基本原理图,图中的相位累加器由N位全加器和N位累加寄存器级联而成,可对频率控制字的2进制码进行累加运算,是典型的反馈电路,产生的累加结果的高M位作为ROM查找表的取样地址值,而此查找表中储存了一个周期的正弦波幅度值。显然,此处存储器ROM可以看作一个从相位到正弦幅值的转换器。这样,用ROM的输出值来驱动DAC,然后经滤波即可转换成所需要的模拟正弦波形;同时N位累加输出又可作为全加器的下一轮数据与频率数据相加,直到相位累加器加满产生溢出,从而完成一个周期,也就是DDS信号的频率周期。



2 DDS在FPGA中的实现

考虑到本系统的规模以及以后的扩展需要,该系统中的DDS电路采用VHDL硬件描述语言来实现,因为VHDL语言设计的电路模块可以方便地移植到不同的FPGA芯片中。由于硬件原因,本系统的最高频率为100kHz,因此,采用常规设计即可满足要求,但若要应用于高速系统,还要采用一些提高系统运行速度的措施,如采用流水线技术,即在设计中把延时较大的组合逻辑块切割成两块大致相等的组合逻辑块,并在这两个逻辑块中插入触发器,也可通过多个触发器时钟来提高系统速度,还可以采用ALTREA 公司的FPGA器件所特有的进位链来设计高速电路。

图2所示为一个具有频率、相位与幅度调制的DDS系统的FPGA组成框图。它的频率调制可以在调谐寄存器与相位累加器之间插入一加法器来实现,频率调制与相位调制有相同的分辨率,因此,频率可以覆盖整个调谐频段。相位调制器可通过在相位累加器后插入一个加法器来实现。幅度调制则是在正弦查找表后插入一个乘法器来实现。该系统具有高精度、高稳定性等特点。



2.1 ROM查找表的设计

ROM查找表在整个设计中是一个比较重要的部分。为了保证波形的平滑,设计时可将一个周期分为1024个点。但是,点数太多时,用文本方式输入可能有很多困难。因此,应当用C语言描述正弦方程式,最后再将其转化为所需的mif文件。以下是其C语言的源程序:

main()

{int i;float s;

for(i=0;i<1024;i++)

{ s = sin(atan(1)*8*i/1024);

......

2.2 DDS主模块设计

DDS主模块部分可根据上述原理,采用VHDL来描述,以下是部分源程序:

BEGIN

PROCESS (clk)

BEGIN

IF(clk'event AND clk='1') THEN

\\时钟上升沿触发

freqw<=freqin;

acc<=acc+freqw; \\开始累加

END IF;

END PROCESS;

romaddr<=acc(adder width-1 downto adder width-10);? \\累加结果的高11位作为

查找表的地址位

i_rom:lpm_rom \\调用ROM查找表

......

2.3 DDS控制模块设计

DDS部分的系统控制是根据所需要的功能(如相位调制、幅度调制等)要求而设计的,这一点也是利用了FPGA的灵活性。其部分程序如下:

COMPONENT ddsc IS \调用DDS主模块

......

END COMPONENT ;

SIGNAL clkcnt :integer RANGE 4 DOWNTO 0;

\\内部信号定义

SIGNAL clk:std_logic;

SIGNAL freqind:std_logic_vector(15 DOWNTO 0);?

BEGIN

i_ddsc:ddsc \\调用DDS主模块

PORT MAP(clk=>clk,ddsout =>ddsout,freqin=>freqind);

clk<=sclk; \\连接内部端口

PROCESS (sclk)

BEGIN

IF sclk'event AND sclk='1'  THEN

\\系统时钟的上升沿触发

freqind<=fpin;

END IF;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top