FPGA波形发生器实训报告.docx
《FPGA波形发生器实训报告.docx》由会员分享,可在线阅读,更多相关《FPGA波形发生器实训报告.docx(31页珍藏版)》请在冰豆网上搜索。
FPGA波形发生器实训报告
JIANGSUUNIVERSITYOFTECHNOLOGY
FPGA综合训练报告
题目:
基于FPGA的波形生成器
专业:
电子信息工程__
班级:
11电子2
姓名:
小龙人
学号:
12311222_
指导教师:
___陈海忠_____
时间:
2015年9月__
1基于DDS技术的信号发生器设计--------------------------------------------------------2
1.1功能要求------------------------------------------------------------------------------------2
1.2整体设计------------------------------------------------------------------------------------2
1.3DDS技术的基本原理---------------------------------------------------------------------3
2FPGA硬件系统设计------------------------------------------------------------------------4
2.1功能要求----------------------------------------------------------------------------------4
2.2FPGA硬件系统组成--------------------------------------------------------------------5
2.3FPGA最小系统简介--------------------------------------------------------------------6
2.4FPGA外围电路设计--------------------------------------------------------------------7
2.5程序设计------------------------------------------------------------------------------------8
2.5.1锯齿波产生程序设计及仿真----------------------------------------------------------9
2.5.2三角波产生程序设计及仿真---------------------------------------------------------10
2.5.3正弦波产生程序设计及仿真---------------------------------------------------------11
2.5.4顶层程序设计及仿真-----------------------------------------------------------------12
2.5.5分频程序及作用------------------------------------------------------------------------13
2.6硬件测试及结果分析-------------------------------------------------------------------14
3设计分析与总结----------------------------------------------------------------------------15
3.1故障分析----------------------------------------------------------------------------------15
3.3设计总结及感想-------------------------------------------------------------------------15
4参考文献------------------------------------------------------------------------------------16
5附录------------------------------------------------------------------------------------------17
1基于DDS技术的信号发生器设计
1.1功能要求
具有产生正弦波、三角波、锯齿波3种周期性波形的功能。
1.2整体设计
如图1.1所示:
图1.1
相位累加器的作用:
在时钟的作用下,进行相位累加。
波形存储器的作用:
进行波形的相位—幅值转换。
频率预置与调节电路的作用:
实现频率控制量的输入。
D/A转换器的作用:
把已经合成的正弦波的数字量转换成模拟量。
滤除生成的阶梯形正弦波中的高频成分,将其变成光滑的正弦波。
如图1.2所示:
图1.2
1.3DDS技术的基本原理
DDS这种结构主要由相位累加器、相位调制器、波形ROM查找表、D/A构成。
其中相位累加器、相位调制器、波形ROM查找表是DDS结构中的数字部分,由于具有数控频率合成的功能,又合称为NCO[2]。
它的工作原理是:
将要产生的波形数据存入波形存储器,然后在参考时钟的作用下,对输入的频率数据进行累加,并且将累加器的输出一部分作为读取波形存储器的地址,将读出的波形数据经D/A转换为相应的模拟电压信号。
本研究的重点就是用VHDL来实现DDS的功能,能够达到高精度的输出,同时标准波形数据生成存放在ROM中,可以简化运算过程,提高运算速度,加快反应时间。
2FPGA硬件系统设计
2.1功能要求
在本设计中,利用FPGA,采用EDA(ElectronicDesignAutomation)中自顶向下(top-to-down)的设计方法,选用基于相位累加器的直接数字合成/DDS技术来完成数字信号发生器各功能模块的设计。
本设计主要通过VHDL语言实现频率控制、波形控制、波形数据的提取、波形的产生工作。
其中,波形数据运用VHDL语言编写。
控制部分主要采用产生高低电平的拨码开关控制。
程序下载到FPGA上实现,经过D/A输出波形。
并通过Altera公司QuartusII9.0软件进行波形的仿真,从而完成整个设计。
本设计的任务是设计一个基于FPGA的数字信号发生器,根据任务书要求必须达到以下要求:
1.利用EDA开发系统、QuartusII9.0软件实现数字信号发生器的设计;
2.根据整体电路的工作原理,完成各个子模块的设计及实现;
3.对数字信号发生器完成VHDL语言描述;
4.该数字信号发生器能够产生正弦波、方波、三角波、锯齿波信号;
5.产生的波形信号频率和幅度可通过按键进行调节;
6.用按键调节实现各种波形的转换。
2.2FPGA最小系统简介
本设计使用是FPGA芯片,其典型逻辑门数(包括逻辑门和RAM)为50000门,最大可用系统门数为116000门,逻辑单元(Logicelements)为2880个,逻辑阵列模块(Logicarrayblocks)为360个,嵌入式阵列模块(Embeddedarrayblocks)为10个,RAM总容量为20480字节,用户可用的I/O引脚最多为310个。
芯片的工作电压为+5V。
其内部结构如图2.1所示。
图2.1芯片结构图
通常情况下在硬件调试的过程中一般使用下载电缆进行下载,而当调试完成以后要用配置芯片对FPGA进行配置。
配置芯片在每次系统上电以后自动将配置文件加载到FPGA中形成电路。
2.3FPGA硬件系统组成
该数字信号发生器系统主要由输入部分、FPGA部分、D/A转换部分、频率、幅值调节和波形转换部分组成。
原理图如图2.2所示。
图2.2数字信号发生器系统原理图
2.4FPGA外围电路设计
D/A转换器电路的设计:
从波形RAM中读出的幅度量化数据还只是一个数字信号,要得到最后的输出信号必须经过数模转换器。
因此在波形RAM之后要设计一个D/A转换电路。
数模(D/A)转换电路的作用是把已经合成的波形幅值的数字量转换成模拟量,其速度和特性直接影响整个系统的性能。
D/A转换器件的首要特性要求是高速,其次是转换位数,本设计中选用8位的D/A芯片DAC0832。
波形幅度量化序列经D/A转换后成为阶梯波。
频率合成器对D/A转换器的分辨率有一定的要求,D/A转换器的分辨率越高,合成的波形台阶数就越多输出的波形的精度也就越高。
D/A的输出用电压形式表示一般应为:
式中D为D/A的输入数据值,N为D/AC的位数,即通常所指的D/AC的分辨率,
为输入D/A的参考电压。
D/A转换电路的设计首先是要选择一款合适的D/A转换芯片。
D/A转换芯片种类繁多。
选择D/A转换芯片要根据很多因素来确定,最主要的就是要考虑字长和转换速度。
本设计采用DAC0832作为D/A转换器件,其具有数字量的输入锁存功能,DAC0832芯片的输出通过放大器OP07,即可用示波器观察。
100KΩ的电位器在+5V和0V电压间为DAC0832提供参考电压。
D/A转换电路的原理图如图2.3所示:
图2.3D/A转换电路的原理图
2.5程序设计
mif文件生成
使用C程序:
#include
#include"math.h"
main()
{inti;floats;
for(i=0;i<1024;i++)
{s=sin(atan
(1)*8*i/1024);
printf("%d:
%d;\n",i,(int)((s+1)*1023/2));
}
}
生成该mif文件后需要创建该rom对应的eda程序,即创建对应的.vhd文件,创建完成后要注意程序内访问rom文件的地址是否正确。
同时对这vhd文件另存为一个新的工程,再编译,生成对应的bsf。
2.5.1锯齿波产生程序设计及仿真
锯齿波模块
锯齿波生成程序如下:
Q<=SUB_WIRE0(9DOWNTO0);
ALTSYNCRAM_COMPONENT:
ALTSYNCRAM
GENERICMAP(
PORTMAP(
CLOCK0=>CLOCK,
ADDRESS_A=>ADDRESS,
Q_A=>SUB_WIRE0
);
ENDSYN;
程序详见附录
仿真图形如图2.4.1:
图2.4.1
2.5.2三角波产生程序设计及仿真
三角波模块
三角波产生程序如下:
PORTMAP(
CLOCK0=>CLOCK,
ADDRESS_A=>ADDRESS,
Q_A=>SUB_WIRE0
);
ENDSYN;
程序详见附录
仿真图形如图2.4.2:
图2.4.2
2.5.3正弦波产生程序设计及仿真
正弦波模块
正弦波程序如下:
BEGIN
Q<=SUB_WIRE0(9DOWNTO0);
ALTSYNCRAM_COMPONENT:
ALTSYNCRAM
GENERICMAP(
CLOCK_ENABLE_INPUT_A=>"BYPASS",
CLOCK_ENABLE_OUTPUT_A=>"BYPASS"
程序详见附录
仿真图形如图2.4.3:
图2.4.3
2.5.4顶层程序设计及仿真
(1)程序的功能
整合所有的子程序,产生所需要的波形
(2)结构图或实体图
(3)顶层程序(输出方案)
U1:
ADDER32BPORTMAP(A=>F32B,B=>D32B,S=>DIN32B);
U2:
REG32BPORTMAP(DOUT=>D32B,DIN=>DIN32B,LOAD=>CLK1);
U3:
ADDER10BPORTMAP(A=>P10B,B=>D32B(31DOWNTO22),S=>LIN10B);
U4:
REG10BPORTMAP(DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK1);
U5:
SIN_ROMPORTMAP(ADDRESS=>SIN10B,Q=>V1,CLOCK=>CLK1);
U6:
SJBROMPORTMAP(ADDRESS=>SIN10B,Q=>V2,CLOCK=>CLK1);
U7:
JCBROMPORTMAP(ADDRESS=>SIN10B,Q=>V3,CLOCK=>CLK1);
U8:
XZQPORTMAP(SEL1=>SEL,D1=>V1,D2=>V2,D3=>V3,Q=>FOUT);
U9:
FPQPORTMAP(INCLK=>CLK,OUTCLK=>CLK1);
END;
程序详见附录
(4)仿真波形及分析
2.5.5分频程序及作用
(1)程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYONEMHZIS
PORT(CLKIN:
INSTD_LOGIC;--时钟信号输入
CLKOUT:
OUTSTD_LOGIC);--时钟信号输出
ENDONEMHZ;
ARCHITECTUREONEMHZOFONEMHZIS
SIGNALDATA:
INTEGERRANGE0TO149;
SIGNALQ:
STD_LOGIC;
BEGIN
PROCESS(CLKIN)
BEGIN
IFRISING_EDGE(CLKIN)THEN
IF(DATA=50)THEN--此句为你想要的分频比,DATA=0,1,2,3,4.......9的分频比为1,2,3,,,10
DATA<=0;
Q<=NOTQ;
ELSE
DATA<=DATA+1;
ENDIF;
ENDIF;
CLKOUT<=Q;
ENDPROCESS;
ENDONEMHZ;
程序详见附录
(2)作用
由于FPGA提供的频率为50MHz,在不加处理的情况下,DAC无法分辨,且调频无法实现。
(3)频率区间
先对其500分频,故而
为50MHz/500
由于有公式:
DAC内N=10;
故
;在
所能产生的各个频率包括
97.65*(000001B~111111B)Hz
2.5硬件测试及结果分析
通过杜邦线接高低电平于FPGA,频率控制与相位控制接0上电,进行调试。
可以产生正弦、锯齿、三角波,但是在放大后,图形不光滑,有许多尖刺出现。
接上滤波后,大为缓解。
3设计分析与总结
3.1故障分析
设计过程中出现的故障分析
故障一:
(1)现象:
只能产生一种波形
原因分析:
FPGA芯片烧录错误、引脚使用错误。
(2)现象:
波形不光滑。
原因分析:
没有接滤波,波形为直接合成,接上滤波后大为缓解。
3.2功能分析
采用杜邦线来选择波形,01是正弦波,10是三角波,11锯齿波。
(1为高电平,0接地)
3.3设计总结及感想
在这里感谢指导老师给我耐心的指导,在这次设计期间,碰到许多专业方面的难题,李老师都一一予以解答,特别在教学繁忙的情况下,还为我们提供了许多宝贵的资料和意见,对我们进行了详细的分析,使我们更加顺利地完成此次课程设计。
通过这一个多月的时间,使我学到许多知识,明白了许多以前上课时无法理解的知识,还积累了一些较简单的问题解决方案。
与此同时也感谢同组做课题设计的同学,在设计过程中,有许多东西我不懂,他们都耐心地给我讲解,给予我技术支援,帮助我解决了不少难题。
4参考文献
[1]朱小斌.电子测量仪器.北京:
电子工业出版社,1996
[2]MichaelLauterbachArtpin.任意波形发生器在通讯测试中的应用.电子产品世界,1997
[3]史海明.个人仪器多功能任意波形发生器的研制.仪表技术,1988
[4]林青.DDS在数字调制中的应用.无线电工程,2001
[5]张开增,张迎新,王尚忠.高分辨率高稳度宽带函数发生器的研制.华北工学院学报
[6]华清远见嵌入式培训中心.FPGA应用开发入门与典型实例.北京:
人民邮电出版社,2008
[7]薛刚.基于DDS技术的任意信号发生器.自动化与仪器仪表,1995
[8]陈冠百.锁相与频率合成.北京:
电子工业出版社,1995
[9]赵新民.智能化仪器设计基础.哈尔滨:
哈尔滨工业大学出版社,1999
[10]M.S.高西,K.R.赖克.现代滤波器设计.北京:
科学出版社,1989
5附录
硬件原理图
实验波形图。
最低值
理论值
三个频率分别为
97.65Hz97.60Hz97.63Hz,相对误差为:
-0.027%
理论输出
三个频率分别为
488.30Hz488.23Hz488.36Hz,相对误差为:
+0.0102%
理论输出
三个频率分别为
683.51Hz、683.51Hz、683.58Hz,相对误差为:
-0.0072%
均在范围,十分精确。
详细程序
主程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDDSIS
PORT(CLK:
INSTD_LOGIC;
SEL:
INSTD_LOGIC_VECTOR(1DOWNTO0);
FWORD:
INSTD_LOGIC_VECTOR(7DOWNTO0);
PWORD:
INSTD_LOGIC_VECTOR(7DOWNTO0);
FOUT:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDENTITY;
ARCHITECTUREONEOFDDSIS
COMPONENTREG32B
PORT(LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
COMPONENTREG10B
PORT(LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(9DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTADDER32B
PORT(A:
INSTD_LOGIC_VECTOR(31DOWNTO0);
B:
INSTD_LOGIC_VECTOR(31DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
COMPONENTADDER10B
PORT(A:
INSTD_LOGIC_VECTOR(9DOWNTO0);
B:
INSTD_LOGIC_VECTOR(9DOWNTO0);
S:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTSIN_ROM
PORT(ADDRESS:
INSTD_LOGIC_VECTOR(9DOWNTO0);
CLOCK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTSJBROM
PORT(ADDRESS:
INSTD_LOGIC_VECTOR(9DOWNTO0);
CLOCK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTJCBROM
PORT(ADDRESS:
INSTD_LOGIC_VECTOR(9DOWNTO0);
CLOCK:
INSTD_LOGIC;
Q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTXZQ
PORT(SEL1:
INSTD_LOGIC_VECTOR(1DOWNTO0);
D1,D2,D3:
INSTD_LOGIC_VECTOR(9DOWNTO0);
Q:
OUTSTD_LOGIC_VECTOR(9DOWNTO0));
ENDCOMPONENT;
COMPONENTFPQ
PORT(INCLK:
INSTD_LOGIC;
OUTCLK:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALF32B,D32B,DIN32B:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALP10B,LIN10B,SIN10B:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALV1,V2,V3:
STD_LOGIC_VECTOR(9DOWNTO0);
SIGNALCLK1:
STD_LOGIC;
BEGIN
F32B(27DOWNTO20)<=FWORD;F32B(31DOWNTO28)<="0000";
F32B(19DOWNTO0)<="00000000000000000000";
P10B(9DOWNTO2)<=PWORD;
P10B(1DOWNTO0)<="00";
U1:
ADDER32BPORTMAP(A=>F32B,B=>D32B,S=>DIN32B);
U2:
REG32BPORTMAP(DOUT=>D32B,DIN=>DIN32B,LOAD=>CLK1);
U3:
ADDER10BPORTMAP(A=>P10B,B=>D32B(31DOWNTO22),S=>LIN10B);
U4:
REG10BPORTMAP(DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK1);
U5:
SIN_ROMPORTMAP(ADDRESS=>SIN10B,Q=>V1,CLOCK=>CLK1);
U6:
SJBROMPORTMAP(ADDRESS=>SIN10B,Q=>V2,CLOCK=>CLK1);
U7:
JCBROMPORTMAP(ADDRESS=>SIN10B,Q=>V3,CLOCK=>CLK1);
U8:
XZQPORTMAP(SEL1=>SEL,D1=>V1,D2=>V2,D3=>V3,Q=>FOUT);
U9:
FPQPORTMAP(INCLK=>CLK,OUTCLK=>CLK1);
END;
三角波
LIBRARYIEEE;