基于某FPGA地正弦波信号发生器地设计Word下载.docx
《基于某FPGA地正弦波信号发生器地设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于某FPGA地正弦波信号发生器地设计Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
用该方法设计产生的信号频率范围广,频率稳定度高,精度高,频率转换速度快。
分析以上四种方案,显然第四种方案具有更大的优越性、灵活性。
所以采用方案四进行设计。
2、直接数字频率合成技术(DDS)
2.1直接数字频率合成的基本结构
图2.1直接数字频率合成的基本结构
如图2.1DDS的基本结构图,从图中可以看出DDS主要由四个基本部分组:
(1)相位累加器;
(2)波形ROM;
(3)D/A转换器;
(4)低通滤波器。
相位累加器的结构如图2.2所示
图2.2相位累加器原理框图
相位累加器是DDS的核心部分,它由一个N位的加法器和N位的寄存器构成,通过把上一个时钟的累加结果反馈回加法器的输入端实现累加功能。
这里的N是相位累加器的字长,K叫做频率控制字。
每经过一个时钟周期,相位累加器的值递增K。
波形ROM示意图如图2.3所示
图2.3波形ROM示意图
当ROM地址线上的地址(相位)改变时,数据线上输出相应的量化值(幅度量化序列)。
因为波形ROM的存储容量有限,相位累加器的字长一般不等于ROM地址线的位数,因此在这个过程当中也又会引入相位截断误差。
D/A转换器将波形ROM输出的幅度量化序列转化成对应的电平输出,将数字信号转换成模拟信号。
但输出波形是一个阶梯波形,必须经过抗镜像滤波,滤除输出波形中的镜像才能得到一个平滑的波形。
抗镜像滤波器是一个低通滤波器,要求在输出信号的带宽内有较平坦的幅频特性,在输出镜像频率处有足够的抑止。
根据DDS的基本结构,可以推出以下一些结论:
频率控制字K唯一地确定一个单频模拟余弦信号
的频率
,
(2.1)
当K=1的时候DDS输出最低频率为
=
(2.2)
这就是DDS的频率分辨率,所以,当N不断增加的时候DDS的频率分辨率可以不断的提高。
D/A转换器的输出波形相当于是一个连续平滑波形的采样,根据奈奎斯特采样定律,采样率必需要大于信号频率的两倍。
也就是说D/A转化器的输出如果要完全恢复的话,输出波形的频率必须小于
一般来说,由于低通滤波器的设计不可能达到理想情况,即低通滤波器总是有一定的过渡带的,所以输出频率还要有一定的余量,一般来说在实际应用当中DDS的输出频率不能超过0.4
3、基于FPGA的正弦信号发生器
3.1总体设计框图
图3.1信号发生器结构框图
图3.1为本次设计总体结构框图,其中相位累加器和波形存储器构成信号发生器核心部分。
该部分又与频率字控制模块共同构成信号发生器主模块。
而显示模块,D/A转换器和滤波电路则作为信号发生器外围硬件设计。
下面就分主模块软件设计和外围硬件设计两大部分来说明信号发生器的设计。
3.2主模块软件设计
3.2.1相位累加器的设计
图3.2相位累加器
图3.2为相位累加器内部结构图,它有一个N位的全加器和一个寄存器构成。
当系统时钟上升沿到来的时候,上一个时钟周期的相位值与频率字的相加值被送入累加寄存器,并输出高W位至波形存储器的地址线,同时相位值又被送回全加器进行相位累加。
相位累加器流程图如图3.3所示
开始
时钟上升沿到?
NO
YES
相位累加
累加值寄存
高W位输出
结束
图3.3相位累加器流程图
设计要求输出频率范围为50HZ—200HZ,频率步进为50HZ。
根据前面介绍最高输出一般是系统时钟的40%。
经过计算,设计选用系统时钟为40MHZ时能实现设计要求。
确定相位累加字长时,考虑到频率分辨率要等于或小于频率步进值,而且累加器字长一般为8的整数倍。
由第二章公式2.2计算后得出符合设计要求的累加器字长为N=24。
3.2.2波形ROM的设计
这个模块是一个相对简单的模块。
首先要确定波形ROM的地址线位数和数据的字长,根据噪声功率的角度看波形ROM的地址线位数应该等于或略大于字长。
由于设计选择的DAC位数为8,这样ROM的字长很明显该和DAC的字长相一致。
而地址线的位数同样确定为8位。
波形存储器利用相位累加器输出的高8位作为地址线来对其进行寻址,最后输出该相位对应的二进制正弦幅值。
将得出的结果转化为8位的二进制数据,起幅值对应在00000000-11111111区间内。
最后利用得到的二进制数据用VHDL编写程序实现正弦ROM的设计。
图3.4为正弦波形ROM模块。
图3.4正弦波形ROM
3.2.3频率控制模块的设计
设计要求频率步进为50HZ,在频率控制模块中,增加了4个附加的频率步进按钮。
分别为最小步进(50HZ)的1倍、2倍、3倍和4倍即50HZ、100HZ、150HZ和200HZ。
这样从大到小地利用频率步进值便可很快地调到所需要的频点。
由于设计要求频率输出范围为50HZ-200HZ,则K值的最小值为21,最大值为84。
设系统其始和复位时K的初值为21,即初始化频率为50HZ。
然后再根据所要输出的频率调整相应的步进量。
图3.5为VHDL设计的频率控制模块。
图3.5为VHDL设计的频率控制模块
3.3外围硬件设计
3.3.1D/A转换器
实现数字量转化为模拟信号的转换电路称为D/A转换器(DAC)。
D/A转换器是把数字量转换成模拟量的线性电路器件,已做成集成芯片。
由于实现这种转换的原理和电路结构及工艺技术有所不同,因而出现各种各样的D/A转换器。
目前,国外市场已有上百种产品出售,他们在转换速度、转换精度、分辨率以及使用价值上都各具特色。
衡量一个D/A转换器的性能的主要参数有:
(1)分辨率:
是指D/A转换器能够转换的二进制数的位数,位数多分辨率也就越高。
(2)转换时间:
指数字量输入到完成转换,输出达到最终值并稳定为止所需的时间。
电流型D/A转换较快,一般在几ns到几百ns之间。
电压型D/A转换较慢,取决于运算放大器的响应时间。
(3)精度:
指D/A转换器实际输出电压与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位。
(4)线性度:
当数字量变化时,D/A转换器输出的模拟量按比例关系变化的程度。
理想的D/A转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。
目前,D/A转换器芯片种类较多,对于一般的使用者而言,只需掌握DAC芯片性能及其与计算机之间接口的基本要求,就可根据应用系统的要求合理选用DAC芯片,并配置适当的接口电路。
3.3.2滤波及放大电路
在由数字信号至模拟信号这一过程转换好以后,得出的信号仍然是在时间上离散的点,需要将其用低通滤波器进行平滑处理,滤除高次频率的杂波,得到平滑标准的正弦波。
结束语
随着信息技术高速发展,集成电路的大规模使用,电子系统已经进入了一个高速发展的全新时段。
特别是EDA技术的日趋成熟的今天,通过计算机辅助设计,可以很好地完成电子设计的自动化。
在设计过程中,可根据需要随时改变器件的内部逻辑功能和管脚的信号方式,EDA技术借助于大规模集成的FPGA/CPLD和高效的设计软件,用户不仅可通过直接对芯片结构的设计实行多种数字逻辑系统功能,而且由于管脚定义的灵活性,大大减轻了电路图设计和电路板设计的工作量及难度,同时,这种基于可编程芯片的设计大大减少了系统芯片的数量,缩小了系统的体积,提高了系统的可靠性。
基于DDS的信号发生器是最为理想的信号产生模型,DDS系统有着其他信号发生器所无法比拟的优势。
今天DDS广泛用于接受机本振、信号发生器、仪器、通信系统、雷达系统等,尤其适合跳频无线电通信系统。
基于FPGA的正弦信号发生器结合了的EDA技术和DDS理论,在EDA技术高速、高效、高可靠性的前提下得到了更优的设计效果。
但是系统的功能还没有得到完全利用,由于DDS技术是利用查表法来产生波形的,则在基于FPGA设计时只要把ROM改成RAM变可实现任意波形的产生。
参考文献
[1]张玉兴.DDS高稳高纯频谱频率源技术[J].系统工程与电子技术.1997
(2)24-28
[2]冯程.用直接数字频率合成器产生正弦波[J].华中科技大学本科生论文.2003.7-27
[3]周国富.利用FPGA实现DDS专用集成电路[J].电子技术应用.No.2.1998.18-20
波形截图:
50Hz
100Hz
150Hz
200Hz
程序vhdl代码:
--顶层模块
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitysin256is
port(clk:
instd_logic;
rst:
set:
instd_logic_vector(1downto0);
--设置频率
q:
outstd_logic_vector(7downto0));
endsin256;
architectureBehavioralofsin256is
componentadder
port(a,b:
instd_logic_vector(23downto0);
c:
outstd_logic_vector(23downto0));
endcomponent;
componentD
port(clk:
d:
componentsin_rom8_8
PORT(ADDER:
INSTD_LOGIC_VECTOR(7DOWNTO0);
DAOUT:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
componentsetkp
port(set:
k:
outstd_logic_vector(23downto0);
p:
signalk,p:
std_logic_vector(23downto0);
signaltmp1,tmp2,tmp3:
begin
setk:
setkpportmap(set,k,p);
add1:
adderportmap(k,tmp2,tmp1);
d1:
Dportmap(clk,rst,tmp1,tmp2);
add2:
adderportmap(tmp2,p,tmp3);
sin_rom:
sin_rom8_8portmap(tmp3(23downto16),q);
endBehavioral;
--频率控制模块
entitysetkpis
port(set:
endsetkp;
architectureBehavioralofsetkpis
process(set)
begin
casesetis
when"
00"
=>
k<
="
000000000000000000010101"
;
--50Hz时k的值
01"
000000000000000000101010"
--1000Hz时k的值
when"
10"
000000000000000000111111"
--150Hz时k的值
11"
000000000000000001010100"
--2000Hz时k的值
whenothers=>
endcase;
endprocess;
p<
000000000000000000000000"
--相位累加模块,由加法器和D触发器组成
--加法器
entityadderis
port(a,b:
endadder;
architectureBehavioralofadderis
c<
=a+b;
--D触发器
entityDis
q:
outstd_logic_vector(23downto0)
);
endD;
architectureBehavioralofDis
process(clk,rst)
ifrst='
1'
then
q<
=(others=>
'
0'
);
elsifclk'
eventandclk='
=d;
endif;
--sin量化rom
entitysin_rom8_8is
PORT(ADDER:
endsin_rom8_8;
architectureBehavioralofsin_rom8_8is
PROCESS(ADDER)IS
BEGIN
CASEADDERIS
when"
00000000"
DAOUT<
10000000"
00000001"
10000011"
00000010"
10000110"
00000011"
10001001"
00000100"
10001101"
00000101"
10010000"
00000110"
10010011"
00000111"
10010110"
00001000"
10011001"
00001001"
10011100"
00001010"
10011111"
00001011"
10100010"
00001100"
10100101"
00001101"
10101000"
00001110"
10101011"
00001111"
10101110"
00010000"
10110001"
00010001"
10110100"
00010010"
10110111"
00010011"
10111010"
00010100"
10111100"
00010101"
10111111"
00010110"
11000010"
00010111"
11000100"
00011000"
11000111"
00011001"
11001010"
00011010"
11001100"
00011011"
11001111"
00011100"
11010001"
00011101"
11010100"
00011110"
11010110"
00011111"
11011000"
00100000"
11011011"
00100001"
11011101"
00100010"
11011111"
00100011"
11100001"
00100100"
11100011"
00100101"
11100101"
00100110"
11100111"
00100111"
11101001"
00101000"
11101010"
00101001"
11101100"
00101010"
11101110"
00101011"
11101111"
00101100"
11110001"
00101101"
11110010"
00101110"
11110100"
00101111"
11110101"
00110000"
11110110"
00110001"
11110111"
00110010"
11111001"
00110011"
11111010"
00110100"
00110101"
11111011"
00110110"
11111100"
00110111"
11111101"
00111000"
11111110"
00111001"
00111010"
11111111"
00111011"
00111100"