毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc

上传人:laozhun 文档编号:4149739 上传时间:2023-04-07 格式:DOC 页数:65 大小:356KB
返回 下载 相关 举报
毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc_第1页
第1页 / 共65页
毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc_第2页
第2页 / 共65页
毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc_第3页
第3页 / 共65页
毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc_第4页
第4页 / 共65页
毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于FPGA的波形发生器、频率计和数字电压表设计.doc(65页珍藏版)》请在三一办公上搜索。

1、 波形发生器、频率计和数字电压表设计电气091 王亚运摘要: 本系统以FPGA为核心,将波形发生器、频率计和数字电压表有机结合在一起。FPGA具有丰富的资源,使用方便灵活,且易于进行功能扩展,完全可以满足设计的要求。主要模块有波形生成模块、频率设置模块、数模转换模块、显示模块和滤波网络。其中FPGA用来实现波形表生成和频率控制;正弦波的数模转换由DAC8032实现;整形采用三极管S9018来实现;并通过低通滤波器提高输出波形的质量。本设计采用双DA来控制波形的幅度,实现了幅度连续可调。 关键词:FPGA 双D/A调幅 数模转换 目 录第一章 系统设计.31.1总体设计方案.31.1.1 设计要

2、求.3 1.1.2 设计思路.3 1.1.3 方案论证与比较.3 1.1.4 系统组成.4第二章 单元电路设计.42.1 波形合成器的设计4 2.1.1 正弦波合成.4 2.1.2 三角波、锯齿波、矩形波的合成.52.2 频率与幅度调节的原理及实现52.2.1 频率等步进调节的实现.52.2.2 幅度调节模块的设计.62.3 波形选择模块与键盘控制模块设计62.4 自动换档模块设计62.5 模数转换电路设计62.6 整形电路设计.7第三章 软件设计.73.1 正弦波合成器设计.73.1.1 正弦波波形数据产生.73.1.2 波形存储器的设计.83.2 三角波、矩形波、锯齿波发生器及相位累加器.

3、83.3 频率测量.83.4 键盘控制模块.93.5 波形选择模块.93.6 数字电压处理模块.9第四章 系统测试.104.1 波形的测试.104.2 各种波形的测试数据.104.2.1 波形发生器.104.2.2 频率计.10 4.2.3数字电压表.11第五章 结 论.11参考文献.11附录.11第一章 系统设计1.1 总体方案设计1.1.1设计要求 利用现成的FPGA,在一块电路板上实现波形发生器、数字频率计和数字电压表三种功能。而且要求其指标越高越好,所产生的波形越清晰越好。频率、幅度不限。1.1.2 设计思路 由于要在一个电路里面实现三种功能,因而我们打算分模块来设计。即分别考虑实现波

4、形发生器、数字电压表和数字频率计。然后再将它们有机的结合起来,在一个电路里面实现。这样设计起来比较容易,也比较好考虑。同时增加了液晶显示,显示是什么波形、波形的频率和电压幅度,从而实现很好的人机界面。 1.1.3 方案论证与比较 1. 波形发生器设计方案方案一:采用模拟直接合成法,转换速度快,频率分辨力高,但电路复杂,难以集成,发展受到一定限制.方案二:采用锁相环合成法,输出信号频率可达到超高频甚至微波段,且输出信号频谱纯度较高,但转换要几毫秒的时间,速度慢.方案三:采用直接数字合成器(DDS),可用硬件或软件实现。即用累加器按频率要求对相应的相位增量进行累加,再以累加相位值作为地址码,取存放

5、于ROM中的波形数据,经D/A转换、滤波即得所需波形。方法简单,频率稳定度高,易于程控。 分析以上三种方案的优缺点,显然第三种方案具有更大的优越性、灵活性,所以采用第三种方案进行设计。 2. 波形数据的产生方案一:使用Visual C+计算正弦波及指定函数波的N点采样值,然后写入到ROM中待用。方案二:使用Matlab计算上述数据。两种方案都是利用软件计算波形参数的较佳方案。VC+对计算值的舍入是直接取整,因此方案一得到的数据有较大误差,而且该方案编程复杂。Matlab能对数据进行四舍五入,因此方案二得到的数据误差较小,且编程简单,修改容易,调用方便。因此采用方案二。3. 频率调节方案一:通过

6、预置FPGA的分频系数调节频率。方案二:通过预置FPGA的分频系数以及改变相位步进调节频率。方案一的调节步进只能以指数形式递增,对于较高的频率范围有较多空白,无法等步进调频;方案二采用粗调与细调相结合,可以实现等步进调频,因此选用方案二。4. 幅度调节方案一:采用可调电阻对电压分流。该方案简单,由于其可调电阻不可能太低,因此导致电压精度不高,且电压变化范围较大,安全性比较低。方案二:幅度控制部分采用双D/A技术,由控制模块对DAC0832置数,第一级D/A的输出作为第二级D/A转换的参考电压,以此来控制信号发生器的输出电压。该方案结构简单,易于调整。基于上述理论分析,拟订方案二。 5. 整形电

7、路 方案一:采用专门的整形网络整形。该方案得出的波形比较好,频率也比较高。但电路连接比较麻烦,在此处不适宜。 方案二:采用三极管来实现。利用三极管的导通特性,将输入的波形变为方波,以便进行频率的测量。此方法比较简单,而且经过实践证明在一定的频率范围内确实可得到很好的波形。 综上,拟订方案二采用三极管实现整形。 6. 显示方式选择方案一:采用LED数码管显示。该方案只能显示有限的符号和数码字,而且功耗大。而本设计中要求显示的内容丰富,不适应利用该方法。方案二:采用字符型LCD显示。可以显示英文及数字,质量轻,耗电小,显示内容多。综上,拟定方案二采用LCD实时显示载频频率。 7. 换档方式选择 方

8、案一:采用手工换档。在需要测某个电压时,选择适宜的档位进行测量。此方案使用起来比较麻烦。 方案二:采用自动换档。利用电阻所分得的电压与输入电压进行比较,产生控制信号实现自动换档。该方案不需要手动,较为智能化。 基于上述理论分析,显然方案二更好。因此采用方案二。 1.1.4 综上方案论证,得到系统框图如图1.1所示。 图1.1 系统组成框图 第二章 单元电路设计2.1 波形合成器的设计2.1.1 正弦波合成对一个幅度为1的正弦波的一个周期进行1024点采样,用Matlab计算得到每一点对应的幅度值,然后量化成8位二进制数据存放在ROM中,理论上,采样的点数及量化的位数越多,合成的波形精确度越高,

9、但是,D/AC0832的位数只有8位,量化等级最高为256,其量化误差已能达到要求,对于查正弦表的舍入误差也可忽略,故不再细分。这里采用1024个采样点,是为了调频时能得到较好的波形。依次取出ROM中的数据,即可得到幅度上是阶梯型的正弦波。再经过D/A转换,便可得到连续的正弦波。2.1.2 三角波、锯齿波、矩形波的合成由于三角波、锯齿波、矩形波波形变化是线性,因此不需要进行波形存储。三角波的产生是使幅度逐次增加一个相位进,一直到最大值后变为步逐次减少一个相位步进,如此便产生一个周期的波形,锯齿波与三角波类似,只是到达最大值后又从0开始。矩形波的产生更为简单,只需根据占空比,调节一个周期内输出高

10、、低电平的时间即可。2.2 频率与幅度调节的原理及实现2.2.1 频率等步进调节的实现由于采用DDFS,在ROM中存有波形一个周期的n个等间隔归一化采样数据,改变相位累加器的步进,从而改变对ROM中数据的读取速度,即可合成不同频率的波形,存储器中存入过量的采样值,使得采样点数较少时,依然能够得到较好的波形输出,从而得到较高的频率输出。否则,采样点数太少会使产生的波形严重失真。输出波形的频率可由式(2-1)计算: 式(2-1)其中,fosc为晶振频率,k为分频系数,N为相位累加器位数,S为相位累加器步长。若取fosc32.768MHz,k=50,N16,带入上式得到f010S(Hz)。因此,只要

11、控制S的值就可以准确地实现频率步进为10Hz的等步进调频。但是,现有的晶振为32MHz,通过实验测试、比较,可用下式计算频率: 式(2-2)也能得到10Hz精确的等步进调节,但牺牲了波形的质量,因为65306不是一个2N的数,这样波形会漏掉少量采样点。不过,即使这样,得到的波形依然很平滑,可以满足设计要求。若要使频率调节步进减小到1Hz,对晶振有特殊要求,它的振荡频率必须是2的N次幂。由式(2-1)举例说明累加器位数不同产生的差异: 式(2-3) 式(2-4)式(2-4)产生的波形将远远优于式(2-3),更优于我们现在所得到的波形,最高频率可提高几倍。另外,由于DAC0832的电流建立时间是1

12、s,因此输出波形的最高频率由下式决定:因此,要得到更高频率的波形需使用更高速的D/A转换器。2.2.2 幅度调节模块的设计在幅度控制上,采用了双D/A转换来实现幅度调节,第一级的D/A的电压输出作为第图2.1 双DA调节二级D/A转换的参考电压,其中第一级的输出电压值可由键盘设置,以此来控制信号的输出电压。D/A转换器的电流建立时间将直接影响到输出的最高频率。本系统采用的是DAC0832,电流建立时间为1s,在最高频率点,一个周期输出64点,因此极限频率大约是10.32KHZ,本系统的设计为10.32KHZ。由于幅度控制用8位D/A控制,最高峰-峰值为10v,因此幅度分辨率为1v。实际电路图如

13、图所示。如图,幅度数据由I/O200-207脚输入第一级DAC0832并转换成电压信号,由它作为第二级DAC0832的参考电压,幅度比例系数由I/O176-188脚输入。2.3 波形选择模块与键盘控制模块设计波形选择用于按键选择输出的波形类型,采用一个按键,每按一次变换一种波形,选到最后一个之后又重头开始。键盘控制模块连接相位步进累加器和波形选择模块,是完成波形选择与调频的人机界面。使用有限状态机设计,可以减少大量的按键,操作简单。2.4 自动换档模块设计 用电阻所分得的电压与输入电压进行比较,产生控制信号实现其自动换档。此种方法比较智能化,不需要人为的去选择档位。但此种方法的设计还有待改进,

14、在实际的设计中还不能很好的实现。2.5 模数转换电路设计 为了能很好的测量波形的幅度,将各种波形送入AD0809进行模数转换,得到相应的数字代码,然后送入FPGA处理,并显示出来。方框图如下:波形输入AD转换FPGA处理LCD显示 图2.2 模数转换 2.6 整形电路 为了能很好的测出各种波形的频率,在进入FPGA以前必须经过整形电路整形。本电路采用三极管来完成。利用三极管导通前后的特性,即导通前集电极输出为高电平,而导通后集电极的输出只比发射极高一点,是低电平。以此使输入波形只有达到某个电压时才导通,导通后输出即为低电平。这样就将输入波形变成了方波。再将方波送入FPGA进行处理。但这种方法也

15、有一定的缺陷,那就是波形的频率受到三极管的频带限制,不能实现高频的整形。具体电路如下: 图2.3 整形电路第三章 软件设计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 = Columns 1 through 10 128 128 129 130 131 131 132 133 134 135 Columns 11 through 20 135 136 137 138 138 139 140 141 142

16、142 Columns 1021 through 1024 125 126 127 1273.1.2 波形存储器的设计使用开发软件为Xilinx ISE 4.2,编程语言为VHDL,仿真工具为ModelSim Xilinx Edition 5.3d XE,程序见附录。3.2 三角波、矩形波、锯齿波发生器及相位累加器三角波、矩形波、锯齿波发生器及相位累加器集成于同一个模块中,程序流程图如图3.1所示。程序见附录。图3.1 三角波、矩形波、锯齿波发生器及相位累加器程序流程3.3 频率测量一共采用八位计数,理论上可计50MHz以内的所有频率。根据某一位(最低位除外)与其前一位(即判断是否有溢出显示位

17、)的数值,来选择适当的档位,再对频率值进行测量。实际结果即为在显示器上显示被测结果乘以其适当档位。程序流图如图3.1.1。程序见附录。 图3.2 频率测量流程图3.4 键盘控制模块程序见附录。3.5 波形选择模块程序见附录。3.6 数字电压处理模块 数字电压处理的模块图如图3.3所示。利用了ADC0908的四个通道。一个处理0-5V,一个处理5-10V,一个处理10-25V,还有一个处理25-50V。具体程序见附录。 图3.3 数字电压处理方框图第四章 系统测试4.1 波形的测试 我们分别测试了三种波形,来观察他们的幅度、频率以及波形。在自己做的板子上检测时,波形出现了晃动,在一段频率范围内不

18、能稳定。为此一直以为是软件问题,后来改用学校的那块FPGA板子引出接口进行测量,发现软件没什么问题,波形比较稳定,频率测量也很准。但检查自己电路时并没发现什么错误,锁脚也没什么错,可能是板子的某个引脚出了问题。但系统总体来说还是达到设计的要求的,在学校的那块板子上实现的更好。4.2 各种波形的测试数据 由于测试数据太多,在此只列出其中一部分。 误差公式: 其中f0 为理论值,f1为实测值。4.2.1 波形发生器 表1理论值(HZ)实测值(HZ)误差()理论值(HZ)实测值(HZ)误差()1010.000.0000800798.860.001432020.010.00051000998.250.

19、001753030.010.000320001996.560.001724040.000.000050004984.120.003185050.010.000280007975.560.00305510099.980.000290008970.670.003259200199.890.00061023010189.580.003951500499.570.0086表4.1 正弦波理论值与实测值比较 4.2.2 频率计 表2理论值(HZ)实测值(HZ)误差()理论值(HZ)实测值(HZ)误差()11.120.1200800799.340.008252020.040.00201000998.570

20、.001433030.080.001220001997.140.001434040.060.001550004985.240.0029525050.020.000480007975.030.00312110099.980.00021MHz999904.690.000095200199.890.00063MHz299842.470.000052500499.570.00094.2.3 数字电压表 数字电压表可测正也可测负。在具体实现时将负电压转换为正电压进行测量。在此只列出了正电压的值。理论值可达到50V,但为了安全,只测到25V。由于测量时我们设置的位数比电源输入的位数高许多,在此只取了三位,

21、因而误差并不是很准确。 表3理论值(V)实测值(V)误差()理论值(V)实测值(V)误差()0.00.0000.00002.02.0040.00205.05.0120.00248.08.0210.002610.010.0140.001415.014.920.005320.019.890.005525.024.570.0172第五章 结论本系统以FPGA芯片为核心部件,将DDFS技术与FPGA相结合,实现了各种波形的产生,且波形平滑,无毛刺,质量较高,采用Matlab计算波形数据,更符合工程要求。且波形的幅度实现了在一定范围类连续可调。稳定度和精准度在一定范围内达到要求。而且频率测量和数字电压测

22、量都很准,误差很低。人机界面经过精简,按键少且操作方便。而且为了能有效的实现三种功能,我们自己设计了一些连接电路,但这些电路有些还不够完善,在测试中还达不到要求,有待进一步改进(如自动换档)。参考文献:1. 黄正谨,徐坚,章小丽等.CPLD系统设计技术入门与应用【M】. 北京:电子工业出版社.2002。2. 潘松,黄继业.EDA 技术实用教程【M】.北京:科学出版社.2002。3. 赵俊超等.集成电路设计VHDL教程.【M】.北京.北京希望电子出版社.2002。4. 周俊峰 陈 涛. 基于FPGA的直接数字频率合成器的设计和实现.2003年5. 高书莉、罗朝霞. 可编程逻辑设计技术及应用M.北

23、京:人民邮电出版社,2001年(第一版)。6. 阎石.数字电子技术基础M.北京:高等教育出版社,2002年(第四版)。7. 胡恩蔚、高信令、蔡明政.标准集成电路数据手册接口电路【M】北京:电子工业出版社。1994年第1版 8-90。附录:1. 数字电压表-顶层程序 -文件名:topp.vhd-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarat

24、ions that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity topp is Port (clk,reset,eoc:in std_logic; d:in std_logic_vector(7 downto 0); lock1,start,oe,ale:out std_logic; access1:out std_logic_vector(2 downto 0); lcdda : out std_logic; lcd

25、rw : out std_logic; lcden : out std_logic; data : inout std_logic_vector(7 downto 0) );end topp;architecture Behavioral of topp iscomponent lcd isgeneric(N:integer:=5000; delay:integer:=100); Port ( clk,reset: in std_logic; d1,d2,d3,d4,d5,d6: in std_logic_vector(3 downto 0); lcdda : out std_logic; l

26、cdrw : out std_logic; lcden : out std_logic; data : inout std_logic_vector(7 downto 0) );end component;component ad is Port (clk,eoc,reset:in std_logic; - clk50mhz是外部32MHZ时钟信号 d:in std_logic_vector(7 downto 0); -ADC0809的8位转换数据输出 lock1,start,oe,ale:out std_logic;access1:out std_logic_vector(2 downto

27、0); -输出到ADC0809的控制信号 dd1,dd2,dd3,dd4,dd5,dd6: out std_logic_vector(3 downto 0); -最终输出信号end component;signal data1,data2,data3,data4,data5,data6: std_logic_vector(3 downto 0);beginu1:ad port map(clk=clk,reset=reset,eoc=eoc,d=d,lock1=lock1,start=start,oe=oe,ale=ale,access1=access1, dd1=data1,dd2=data2

28、,dd3=data3,dd4=data4,dd5=data5,dd6=data6);u2:lcd port map(reset=reset,clk=clk,d1=data1,d2=data2,d3=data3,d4=data4,d5=data5,d6=data6,data=data,lcdda=lcdda,lcdrw=lcdrw,lcden=lcden);end Behavioral;-ADC0809驱动-library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGN

29、ED.ALL;entity ad is Port (clk,reset,eoc:in std_logic; - clk50mhz是外部32MHZ时钟信号 d:in std_logic_vector(7 downto 0); -ADC0809的8位转换数据输出 lock1,start,oe,ale:out std_logic;access1:out std_logic_vector(2 downto 0);-输出到ADC0809的控制信号 dd1,dd2,dd3,dd4,dd5,dd6: out std_logic_vector(3 downto 0);-最终输出信号end ad;archite

30、cture Behavioral of ad issignal lock: std_logic;signal qq:std_logic_vector(7 downto 0);type state is (st0,st1,st2,st3);signal current_state1:state;type states is (st0,st1,st2,st3,st4,st5,st6); -定义7个状态子类型signal state1,state2:states:=st0; -初始化statessignal reg:std_logic_vector(7 downto 0);signal clk10k

31、: std_logic;signal access2: std_logic_vector(2 downto 0);signal reg2,reg1,regg,reg3: integer range 255 downto 0;signal oe1:std_logic;type states1 is (st0,st1);signal states2:states1:=st0;begin process(clk,reset) -fen pin 5kvariable cnt: integer range 2500 downto 0;begin if reset=0 then cnt:=0;clk10k

32、=2500 then clk10k=1;cnt:=0; else clk10kstate2=st1; ale=0; start=0; oe=0; oe1state2=st2; ale=1; start=0; oestate2=st3; ale=0; start=1; oe ale=0; start=0; oe=0; if eoc=1 then state2=st3; -测试eoc的下降沿 else state2 ale=0; start=0; oe=0; -测试eoc的上升沿,=1表明转换结束 if eoc=0 then state2=st4; -继续等待 else state2state2=

33、st6; ale=0; start=0; oestate2=st0; ale=0; start=0; oe=1; reg=d;oe1state2=st0; ale=0; start=0; oe=0; end case;end process;process(clk,lock)begin if clkevent and clk=1 then qq=qq+1; if qq=01111111 then lock=1;state1=state2;- 01111111 elsif qq01111111 then lock=0; end if; end if; end process;-pro2:proc

34、ess(clk10k,reset,access2) -begin - if reset=0 then-access2 if regg=reg3 then- states2=st0;- else states2 access2states2 if regg=127 then access2=010;else reg2=regg;end if;- reg3if regg=102 then access2=001;else reg2=regg;end if;- reg3 if regg=127 then access2=000; else reg2=regg; end if;-reg3=regg;-

35、 reg2=regg;-reg3 -when others =null; -end case; - end if;- access1=access2;-end process; lock1=lock; reg2=conv_integer(reg); -十进制BCD码转换;process(clk10k) variable reg1 : integer range 0 to 800000;variable d1,d2,d3,d4,d5,d6 : std_logic_vector(3 downto 0);begin access2access1=access2 ; if oe1=1 then current_state1 -case access1 is - when 011 = - reg1:=reg2*1961;- 1960- when 010 =- reg1:=reg2*980;-980- -980-when 001 = -reg1:=reg2*392;- 392-392 reg1:=reg2*196;-;-196when 000 =-when others=null;- end case; d1:=0000;d2:=0000;d3:=0000;d4:=0000; d5:=0000;d6:=0000; current_state1 i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号