基于的数字波形发生器.docx
- 文档编号:17048976
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:22
- 大小:62.97KB
基于的数字波形发生器.docx
《基于的数字波形发生器.docx》由会员分享,可在线阅读,更多相关《基于的数字波形发生器.docx(22页珍藏版)》请在冰点文库上搜索。
基于的数字波形发生器
摘要:
系统基于FPGA设计,VHDL编程实现。
系统集成于一片Xilinx公司的SpartanⅡ系列XC2S100-PQ208芯片上,核心技术是直接数字频率合成技术,其中包括固定分频器,正弦波合成器,三角波、矩形波、锯齿波发生器,波形选择模块,键盘控制模块,它们输出的8位数据通过D/A转换并经功率放大后即得所需波形,通过改变相位步进可调频率,通过改变D/A电阻网络的基准电压可调幅度。
系统的频率范围宽,可从10Hz到10kHz之间等步进调节,最小步进10Hz,幅度和频率精度高。
关键字:
现场可编程逻辑门阵列直接数字频率合成数模转换
Abstract:
ThesystemisimplementedbyprogrammedwithVHDLbaseonFPGA.thesystemwhosebasictechniqueisDDFS(DirectDigitalFrequencySynthesis)isintegratedintoaXilinx’sSpartanⅡXC2S100-PQ208FPGAchipthatconsistedofafrequencydivider,asinewavesynthesizer,atriangularwave,rectangularwaveandsawtoothwavegenerator,awaveselectingmoduleandakeyboardmodule.The8-bitoutputdataoftheFPGAareconvertedbyaD/ACandthenamplified.Byalteringthephaseincrement,thefrequencyoftheoutputwavecanbechanged.ByalteringthereferencevoltageoftheD/ACresistances,theamplitudeoftheoutputwavecanbeadjusted.Thesystemhasawidefrequencyrangeandisabletostepevenlywiththeminimumof10Hz.Thefrequencyandtheamplitudeareinhighaccuracy.
Keywords:
FPGADDFSD/AC
初稿:
August13,2003
最后修改:
September23,2003
目录
第一章方案比较与论证……………………………………….3
1.1总体方案设计………………………………………………….3
1.2波形数据的产生………………………………………………..3
1.3频率调节………………………………………………………..3
1.4幅度调节………………………………………………………..3
1.5总体设计………………………………………………………..3
第二章单元电路设计………………………………………….4
2.1波形合成器的设计……………………………………………...4
2.2频率与幅度调节的原理及实现………………………………...4
2.3波形选择模块与键盘控制模块设计…………………………...5
2.4FPGA接口与数模转换电路设计………………………………..5
第三章软件设计……………………………………………….5
3.1正弦波合成器设计..…………………………………………….5
3.2三角波、矩形波、锯齿波发生器…………………………………..6
3.3波形选择模块………………………………………………..….6
3.4键盘控制模块………………………………………………...…6
第四章系统测试…………………………………………....…..6
第五章结论……………………………………………….….....7
参考文献…………………………………………….……………7
附录…………………………………………………………….…8
一、方案比较与论证
1.1总体方案设计
方案一:
采用锁相环锁定频率,稳定度和精确度高,但是频率调节不便且调节范围小,只能得到方波和正弦波,对其它波形需外加整型电路,使得系统复杂。
方案二:
采用直接数字频率合成,用单片机作为核心控制部件,能达到较高的要求,实现各种波形输出,但受限于运算位数及运算速度,产生的波形往往需通过滤波器才能达到满意效果,并且频率可调范围小,很难得到较高频率。
方案三:
采用直接数字频率合成,用FPGA器件作为核心控制部件,精度高稳定性好,得到波形平滑,特别是由于FPGA的高速度,能实现较高频率的波形。
控制上更方便,可得到较宽频率范围的波形输出,步进小。
因此采用方案三。
1.2波形数据的产生:
方案一:
使用VisualC++计算正弦波及指定函数波的N点采样值,然后写入到ROM中待用。
方案二:
使用Matlab计算上述数据。
两种方案都是利用软件计算波形参数的较佳方案。
VC++对计算值的舍入是直接取整,因此方案一得到的数据有较大误差,而且该方案编程复杂。
Matlab能对数据进行四舍五入,因此方案二得到的数据误差较小,且编程简单,修改容易,调用方便。
因此采用方案二。
1.3频率调节:
方案一:
通过预置FPGA的分频系数调节频率。
方案二:
通过预置FPGA的分频系数以及改变相位步进调节频率。
方案一的调节步进只能以指数形式递增,对于较高的频率范围有较多空白,无法等步进调频;方案二采用粗调与细调相结合,可以实现等步进调频,因此选用方案二。
1.4幅度调节:
方案一:
采用双D/AC实现幅度调节。
方案二:
模拟方式调幅。
方案一实现数字调幅,精度较高,但其输出幅度无法连续,由于幅度本身是以模拟量输出的,采用高精度的立式电位器调节已能满足要求,故采用方案二。
1.5总体设计:
综上方案论证,得到系统框图如图1.1所示。
图1.1波形发生器系统框图
二、单元电路设计
2.1波形合成器的设计:
2.1.1正弦波合成:
对一个幅度为1的正弦波的一个周期进行1024点采样,用Matlab计算得到每一点对应的幅度值,然后量化成8位二进制数据存放在ROM中,理论上,采样的点数及量化的位数越多,合成的波形精确度越高,但是,D/AC0832的位数只有8位,量化等级最高为256,其量化误差已能达到要求,对于查正弦表的舍入误差也可忽略,故不再细分。
这里采用1024个采样点,是为了调频时能得到较好的波形。
依次取出ROM中的数据,即可得到幅度上是阶梯型的正弦波。
再经过D/A转换,便可得到连续的正弦波。
2.1.2三角波、锯齿波、矩形波的合成:
由于三角波、锯齿波、矩形波波形变化是线性,因此不需要进行波形存储。
三角波的产生是使幅度逐次增加一个相位进,一直到最大值后变为步逐次减少一个相位步进,如此便产生一个周期的波形,锯齿波与三角波类似,只是到达最大值后又从0开始。
矩形波的产生更为简单,只需根据占空比,调节一个周期内输出高、低电平的时间即可。
2.2频率与幅度调节的原理及实现:
2.2.1频率等步进调节的实现:
由于采用DDFS,在ROM中存有波形一个周期的n个等间隔归一化采样数据,改变相位累加器的步进,从而改变对ROM中数据的读取速度,即可合成不同频率的波形,存储器中存入过量的采样值,使得采样点数较少时,依然能够得到较好的波形输出,从而得到较高的频率输出。
否则,采样点数太少会使产生的波形严重失真。
输出波形的频率可由式(2-1)计算:
式(2-1)
其中,fosc为晶振频率,k为分频系数,N为相位累加器位数,S为相位累加器步长。
若取fosc=32.768MHz,k=50,N=16,带入上式得到f0=10S(Hz)。
因此,只要控制S的值就可以准确地实现频率步进为10Hz的等步进调频。
但是,现有的晶振为32MHz,通过实验测试、比较,可用下式计算频率:
式(2-2)
也能得到10Hz精确的等步进调节,但牺牲了波形的质量,因为65306不是一个2N的数,这样波形会漏掉少量采样点。
不过,即使这样,得到的波形依然很平滑,可以满足设计要求。
若要使频率调节步进减小到1Hz,对晶振有特殊要求,它的振荡频率必须是2的N次幂。
由式(2-1)举例说明累加器位数不同产生的差异:
式(2-3)
式(2-4)
式(2-4)产生的波形将远远优于式(2-3),更优于我们现在所得到的波形,最高频率可提高几倍。
另外,由于DAC0832的电流建立时间是1μs,因此输出波形的最高频率由下式决定:
因此,要得到更高频率的波形需使用更高速的D/A转换器。
2.2.1幅度调节:
直接对数模转换芯片的电阻网络的基准电压进行调节,DAC0832的基准电压为±10V,因此理论上输出波形的幅度范围±10V。
通过在ADC0832的8脚(基准电压输入脚)接一个立式电位器便可实现,调节精度高。
2.3波形选择模块与键盘控制模块设计:
波形选择用于按键选择输出的波形类型,采用一个按键,每按一次变换一种波形,选到最后一个之后又重头开始。
键盘控制模块连接相位步进累加器和波形选择模块,是完成波形选择与调频的人机界面。
使用有限状态机设计,可以减少大量的按键,操作简单。
2.4FPGA接口及数模转换电路设计:
电路如图2.1所示
图2.1FPGA接口与模数转换电路
三、软件设计
3.1正弦波合成器设计:
3.1.1正弦波波形数据产生:
利用Matlab6.5计算波形数据,程序及结果如下:
>>step=2*pi/1023;
>>x=0:
step:
2*pi;
>>y=127.5*sin(x)+127.5;
>>z=round(y)
z=
Columns1through10
128128129130131131132133134135
Columns11through20
135136137138138139140141142142
……
Columns1021through1024
125126127127
3.1.2波形存储器的设计:
使用开发软件为XilinxISE4.2,编程语言为VHDL,仿真工具为ModelSimXilinxEdition5.3dXE,程序见附录第9页。
3.2三角波、矩形波、锯齿波发生器及相位累加器:
三角波、矩形波、锯齿波发生器及相位累加器集成于同一个模块中,程序流程图如图3.1所示。
程序见附录第9页。
图3.1三角波、矩形波、锯齿波发生器及相位累加器程序流程
3.3键盘控制模块:
程序见附录第11页。
3.4波形选择模块:
程序见附录第12页。
四、系统测试
使用仪器:
示波器:
绿扬YB4365,100MHz,江苏扬中电子仪器厂;
FPGA实验仪:
DP-FPGA,广州致远电子有限公司;
频率计:
SP-1500A等精度频率计,南京盛普电子实业有限公司。
理论值(HZ)
实测值(HZ)
误差(%)
理论值(HZ)
实测值(HZ)
误差(%)
10
10.00
0
800
799.34
0.00825
20
20.00
0
1k
998.57
0.00143
30
30.00
0
2k
1997.14
0.00143
40
40.00
0
5k
4985.24
0.002952
50
50.00
0
8k
7975.03
0.003121
100
99.99
0.0001
9k
8970.69
0.003257
200
199.96
0.0002
10k
9970.47
0.002953
500
499.67
0.0066
表4.1正弦波理论值与实测值比较
图4.1理论值与实测值曲线
图4.2误差分析图
频率范围:
10Hz~10kHz,最小可调步进:
10Hz。
幅度范围:
2.89V~5.1V
五、结论
将DDFS技术与FPGA的相结合,实现了各种波形的产生,且波形平滑,无毛刺,质量较高,采用Matlab计算波形数据,更符合工程要求。
输出波形的频率可调范围宽,可等步进调节且步进小。
人机界面经过精简,按键少且操作方便。
参考文献:
1.黄正谨,徐坚,章小丽等.CPLD系统设计技术入门与应用【M】.北京:
电子工业出版社.2002。
2.潘松,黄继业.EDA技术实用教程【M】.北京:
科学出版社.2002。
3.赵俊超等.集成电路设计VHDL教程.【M】.北京.北京希望电子出版社.2002。
4.周俊峰陈涛.基于FPGA的直接数字频率合成器的设计和实现..2003年
附录:
--顶层程序--
--文件名:
top.vhd--
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitytopis
Port(sysclk,reset,key1,add,sub,key_route:
instd_logic;
led1,led10,led100,led1000:
outstd_logic;
data:
outstd_logic_vector(8downto0));
endtop;
architectureBehavioraloftopis
componentkey
Port(sysclk,key1,reset,add,sub:
instd_logic;
led1,led10,led100,led1000,clock3200:
outstd_logic;
N:
outintegerrange1023downto0);
endcomponent;
componentpir_add
Port(sysclk,reset:
instd_logic;
N:
inintegerrange1023downto0;
addr:
outintegerrange1023downto0;
aslant,triangle,rectangular:
outstd_logic_vector(8downto0));
endcomponent;
componentsinx
PORT(Qt:
inINTEGERRANGE1023DOWNTO0;
DD:
outstd_logic_vector(8downto0));
endcomponent;
componentchoice_function
Port(clk3200,reset,key_route:
instd_logic;
sin_data,tri_data,asl_data,rec_data:
instd_logic_vector(8downto0);
function_data:
outstd_logic_vector(8downto0));
endcomponent;
signalN_p,addr_p:
integerrange1023downto0;
signalclock3200_p:
std_logic;
signalsin_data_p,tri_data_p,asl_data_p,rec_data_p:
std_logic_vector(8downto0);
begin
key_u:
keyportmap
(sysclk=>sysclk,reset=>reset,add=>add,sub=>sub,key1=>key1,clock3200=>clock3200_p,led1=>led1,led10=>led10,led100=>led100,led1000=>led1000,N=>N_p);
pir_add_u:
pir_addportmap
(sysclk=>sysclk,reset=>reset,N=>N_p,addr=>addr_p,aslant=>asl_data_p,triangle=>tri_data_p,rectangular=>rec_data_p);
sinx_u:
sinxportmap(Qt=>addr_p,DD=>sin_data_p);
choice_function_u:
choice_functionportmap
clk3200=>sysclk,reset=>reset,key_route=>key_route,sin_data=>sin_data_p,tri_data=>tri_data_p,asl_data=>asl_data_p,rec_data=>rec_data_p,function_data=>data);
endBehavioral;
--正弦波波形存储--
--文件名:
sinx.vh--
--说明:
限于篇幅,只给出部分程序代码--
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitysinxis
PORT(Qt:
inINTEGERRANGE1023DOWNTO0;
DD:
outstd_logic_vector(8downto0));endsinx;
architectureBehavioralofsinxis
SIGNALD:
INTEGERRANGE255DOWNTO0;
BEGIN
PROCESS(Qt)
BEGIN
CASEQtIS
when0001=>D<=128;when0002=>D<=128;when0003=>D<=129;when0004=>D<=130;when0005=>D<=131;when0006=>D<=131;when0007=>D<=132;when0008=>D<=133;when0009=>D<=134;when0010=>D<=135;
--(部分省略)
when1011=>D<=117;when1012=>D<=118;when1013=>D<=119;when1014=>D<=120;when1015=>D<=120;when1016=>D<=121;when1017=>D<=122;when1018=>D<=123;when1019=>D<=124;when1020=>D<=124;
when1021=>D<=125;when1022=>D<=126;when1023=>D<=127;when0000=>D<=127;
WHENOTHERS=>NULL;
endcase;
ENDPROCESS;
DD<=conv_std_logic_vector(D,9);
endBehavioral;=>D<=104;when0995=>D<=105;when0996=>D<=106;when0997=>D<=106;when0998=>D<=107;when0999=>D<=108;
--相位累加器及三角波、矩形波、三角波发生器--
--程序名:
pir_add.vhd--
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityPIR_ADDis
Port(sysclk,reset:
instd_logic;
N:
inintegerrange1023downto0;
addr:
outintegerrange1023downto0;
aslant,triangle,rectangular:
outstd_logic_vector(8downto0));
endPIR_ADD;
architectureBehavioralofPIR_ADDis
signaldd,ddd:
std_logic_vector(16downto0);
signalclk49:
std_logic;
signalad:
std_logic_vector(9downto0);
typestateis(st1,st2);
signalcurrent:
state;
begin
process(sysclk,reset)
variablecount2:
integer;
variableclk0:
std_logic;
begin
ifreset='0'then
count2:
=0;
clk0:
='0';
elsifsysclk'eventandsysclk='1'then
count2:
=count2+1;
ifcount2=25then
clk0:
='1';
elsifcount2=49then
count2:
=0;
clk0:
='0';
--endif;
endif;
endif;
clk49<=clk0;
endprocess;
process(clk49,reset)
variablecnt:
integerrange65535downto0;
begin
ifreset='0'then
cnt:
=0;
elsifrising_edge(clk49)then
cnt:
=cnt+N;
ifcnt>32768then
rectangular<="111111111";
elserectangular<="000000000";
endif;
ifcnt>65306then
cnt:
=0;
endif;
endif;
dd<=conv_std_logic_vector(cnt,16);
endprocess;
tri:
process(clk49,reset)
variablecnt:
integerrange65535downto0;
begin
ifreset='0'then
cnt:
=0;
current<=st1;
elsifrising_edge(clk49)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 数字 波形 发生器