《基于FPGA的波形发生器的设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA的波形发生器的设计.doc(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、基于FPGA的波形发生器的设计(南华大学 湖南 衡阳 421001)指导老师:摘 要:利用FPGA完成波形发生器的设计,可以产生频率和幅值都可调的正弦波和三角波。首先对标准波形进行采样,然后经过DA转换和滤波输出平滑的波形。采用VHDL硬件描述语言完成波形发生和存储程序编写,并下载到Xilinx公司的Spartan系列目标芯片XC2S2005PQ-208上调试通过,得到的波形好,可达到技术指标。关键词:FPGA,VHDL,采样,正弦波,三角波 Design of Wave-Generator Based on FPGACao Xueke Tian Dandan Tan Xianfeng (Na
2、nhua University HengYang Hunan 421001) Teacher:Wang Yan Abstact:Design the Wave-Generator based on FPGA. It can generate sine wave and triangle wave. First, it samples the standard wave, then generates a smooth wave after DA converter and filter. Using hardware design language VHDL to finish the wav
3、e generation and storage and downloading it into the object chip of XC2S2005PQ-208 Spartan,Series, Xilinx, Co. The waves are well done and can reach the technique index. Keywords:FPGA, VHDL, sampleing, sine wave, triangle wave目 录第一章 系统设计11.1 设计要求 .1 1.1.1 基本部分.1 1.1.2 发挥部分.11.2 总体设计方案.1 1.2.1 方案比较.1
4、 1.2.2 系统组成及工作原理.2第二章 单元电路设计.42.1 时钟的设计42.2 状态机的设计.5 2.2.1 状态机设计的优越性5 2.2.2 实现方法.5第三章 软件设计3第四章 系统测试44.1 测试使用的仪器44.4431 频率和幅度测试.5431测试结果.5第五章 结束语5第六章 参考文献5附录.5程序清单.5第一章 系统设计1.1 设计要求1.1.1 基本部分 设计一波形发生器,可以产生频率和幅值都可调的正弦波。1.1.2 发挥部分在产生正弦波的基础上,可产生三角波或其它任意波形。1.2 总体设计方案方案一:采用模拟分立元件或单片机压控函数发生器来完成设计。可产生方波,正弦波
5、,三角波,通过调整外部元件可以改变输出频率,但是采用模拟器件分散性大,产生的频率稳定性较差、精度低、抗干扰能力差、成本也比较高。方案二:由单片机来完成设计。目前,单片机的功能已比较强大,集成度日益增高且其设计和控制比较容易。但是由于在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,因此整个系统显得十分复杂,随着正弦波或三角波采用数据的增加,需要占用系统很多存储资源,造成其抗干扰性差,在运行过程中容易死机或进入死循环,可靠性降低,而功耗费用增高。方案三:利用FPGA来完成设计。FPGA编程灵活,可以实现三角波和正弦波的数字化处理,将一个周期内的采样点存储起来,生成频率和幅值都可调
6、的正弦波或者三角波,再通过D/A转换和滤波电路便可得到模拟波形。利用该方法,编程简单,实现灵活。综上,选择方案三来完成设计。完整的系统由4个部分组成:波形发生控制电路,波形数据ROM,D/A转换和滤波电路。波形发生控制电路由FPGA来完成,正弦波在一个周期内的波形可以通过数字采样,即用N个幅值离散的等间隔采样点表示。如图1-2-3-1为正弦波和三角波采样的原理,设其周期为T,采样点数为N,采样间隔为t,T=N*t。那么就可以得到图示的数字信号。要改变其频率只需要改变其采样的时间间隔t,由于采样点数N不变,N=t*T,因此,t越小,T就越大,对应的频率就越大。再通过数模转换,便可以得到光滑的正弦
7、波和三角波。 图1-2-3-1 正弦波和三角波采样原理图FPGA波形发生控制电路通过外来控制信号和高速时钟信号,向波形数据ROM发出地址信号,ROM的大小由采样点的个数决定。波形ROM中存有发生器的波形数据,如正弦波或三角波数据。当接受来自FPGA的地址信号后,将从数据线输出相应的波形数据。取出采样点的幅值,这样就可以产生数字化的波形。采样点越多,那么得到的波形就越光滑,但是相应的存储器的容量就需要得越大,因此,需要正确的选择采样点数。 图1-2-3-2 系统工作原理图图1-2-3-2为其系统工作原理框图。D/A转换器负责将ROM输出的数据转换为模拟信号,经滤波电路后输出。输出波形的上限频率和
8、D/A器件的转换速度有重要关系,采用的是DAC0832作为A/D转换器件。第二章 单元电路设计2.1 输入模块设计 输入模块采用普通的按键输入,即通过按键选择输出波形是正弦波还是三角波,同时也通过键盘输入来改变波形的幅值和频率。 波形发生模块的设计 由于波形发生控制器和波形数据ROM都是利用硬件描述语言VHDL编程实现的,所以统称为波形发生模块。波形发生控制器的作用是利用FPGA选择产生正弦波或者三角波,然后再发出地址信号,取ROM中存好的正弦波或三角波的采样数据。波形发生模块包括幅度设置、正弦波/三角波切换和频率设置三个进程。幅度设置模块可以对输出波形的幅度进行设置。可以得到基波幅度的110
9、倍幅度值。正弦波/三角波切换进程的作用是完成通过按键来选择输出三角波或者三角波。频率设置进程主要是对输出的频率进行设置,在前面已经介绍过正弦波发生的原理,基于此原理,在程序设计的时候,只要合适的改变采样点的时间间隔就可完成频率设置。ROM数据存储模块主要是用来存储正弦波或者三角波的数据。当接收来自FPGA的地址信号后,将从数据线输出相应的波形数据,这样便得到数字化的波形。由于所选的D/A转换器一次只能转化8位二进制码,而且模拟波的电压幅度由幅度比例系数决定Vo=(Vr/)*K,所以限定了波形的幅值比例系数为0-255。如果相邻之间的采样点所对应的幅值比例系数是线性变化的,则波形是一个三角波,而
10、如果是非线性变化的,那得到的就是正弦波。对波形采样点数目越多,波形的精准度越高,但随着采样点数的增加,需要的ROM数量也会增加,会消耗系统更多资源,实验证明,只要在一个周期内的取样点数超过32个就可实现较准确的正弦波形。在本系统中,取采样点数为64个。每个采样点都对应了该点的幅值比例系数。每个ROM单元对应一个地址值,FPGA只要向ROM存储器输入相应的地址值就可以确定其幅值。 D/A转换模块的设计 D/A转换器负责将ROM输出的数据转换成模拟信号,经滤波电路后输出。输出波形分频率上限与D/A器件的转换速度由重要关系。采用的是DAC0832作为A/D转换器件。DAC0832是8位D/A转换器,
11、转换周期为1s,其引脚信号可以直接与FPGA目标芯片相接。图2-3-1为其芯片的引脚图。各引脚的说明如下:ILE:数据锁存允许控制信号输入口线,高电平有效;WR1、WR2:写信号1、2,低电平有效;XFER:数据传输控制信号,低电平有效;VREF:基准电压,可正可负,-10V+10V;RFB:反馈电阻端;IOUT1/IOUT2:电流输出端;AGND/DGND:模拟地与数字地。在高速情况下,此二GND地的连接线必须尽可能短,且系统的单点接地点 图2-3-1 DAC0832引脚图须接在此连续的某一点上。程序中的正弦波或者三角波的波形数据由64个点构成,此数据经DAC0832,并经过滤波器后,得到光
12、滑的正弦波。D/A转换量是以电流形式输出的,所以必须将其变为电压信号才能送入滤波电路。 滤波电路模块的设计 滤波电路可考虑采用二阶巴特沃兹低通滤波器或者RC低通滤波器。巴特沃兹滤波器的幅度函数是单调下降的,由于n阶低通巴特沃斯滤波器的前(2n-1)阶导数在=0处为零,所以巴特沃斯滤波器也称为最大平坦幅度滤波器,该方案滤波性能较好,但构造和参数设置比较复杂。价格也比较昂贵。而RC低通滤波器可以消除在信号产生 图2-3-2 RC滤波电路图 过程中有干扰性的高频信号,由于不须运算发大器,参数 计算容易,对系统要求不高。因此在本设计中,利用RC低通滤波器就可以达到要求。第三章 软件设计相关软件采用VH
13、DL硬件描述语言编写。VHDL是用于逻辑设计的硬件描述语言,为IEEE标准。利用它,硬件的功能描述可完全在软件上实现。它支持自顶向下(Top Down)和基于库(Library_Based)的设计方法,支持同步电路、异步电路、FPGA以及等随机电路的设计,范围很广,语言的语法比较严格,给阅读和使用都带来极大好处。软件设计分为三个进程。正弦波/三角波切换进程,频率幅值设置进程,以及波形数据ROM,ROM中存储的是产生波形的采样点数据。如正弦波,分为64个采样点,最高采样点值为255,对应的八位二进制数为11111111,第二个采样点为254,对应的八位二进制数为11111110。如果预置的八位二
14、进制数为11111110,那么时钟跳变一次就产生一个脉冲来让FPGA取出波形数据ROM中的采样点数据,变化比较快,相应的t就比较小,得到的波形频率就高;如果预置的数是11110101,即245,那么就要过10个脉冲才会采样一次,因此t就比较大,得到的波形频率就小。第四章 系统测试示波器:绿扬YB4365,100MHz,江苏扬中电子仪器厂;直流电压源:DF1731SC2A;FPGA实验仪:DP-FPGA,广州致远电子;频率计:SP-1500A等精度频率计,南京盛普电子实业。系统测试在清华TPG_FPGA实验箱上进行,引脚锁定后将程序下载到Xilinx公司的目标芯片Spartan系列的XC2S20
15、0-5PQ208上调试通过。可以在示波器上看到平滑的正弦波和三角波波形,切换和频率幅度的设置都可以达到预期的效果。431 频率和幅度测试表1 频率和幅度测试结果频率设置/KHz所测频率/KHz幅度设置/V所测幅度有效值峰峰值3.00432 测试结果 由表中数据可看出,该方法可实现两种正弦波和三角波两种波形的切换,并且得到平滑的频率和幅值都可调的波形。但是在频率高的地方会有一定的误差。第五章 结束语由以上的分析和实验结果可以看出,利用FPGA来完成波形发生器的设计,使其产生频率和幅值可调的正弦波和三角波的方法行之有效。利用VHDL硬件描述语言完成程序的设计,并且下载到Xilinx公司Sparta
16、n芯片上调试通过,在示波器上得到的波形和期望值一致。如果修改一下程序还可以得到其他的任意波形,简单易行,利于控制。第六章 参考文献1李冬梅.PLD器件与EDA技术M. 北京:北京光播学院出版社,2000年第一版2赵俊超.集成电路设计VHDL教程M.北京:北京希望电子出版社,2002年第一版4甘历.VHDL应用与开发实践M.北京:科技出版社.2003年 第一版第七章 附录程序清单功能:产生正弦波或三角波信号说明:基于VHDL硬件描述语言在在Xilinx公司的Spartan系列的XC2S2005PQ-208芯片上实现最后修改时间:2003年7月28日library IEEE;use IEEE.ST
17、D_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity sin_rec is Port ( clk ,reset: in std_logic; sinm: in std_logic_vector(3 downto 0); -正弦波或三角波的幅度设置 dataf : in std_logic_vector(7 downto 0);-频率预置 conver: in std_logic_vector(1 downto 0);-正弦波与三角波的设置的切换 dd : out std_logi
18、c_vector(8 downto 0); -正弦波输出 ss:out std_logic_vector(8 downto 0); -三角波输出 dd :out integer range 765 downto 0 );end sin_rec;architecture Behavioral of sin_rec is signal q :integer range 63 downto 0 ; -正弦波数据点signal q2: integer range 64 downto 0; -三角波数据点signal n0,n,n2:integer range 1 to 12; -正弦波或三角波的幅度档
19、位 signal dataf0,count8,dataf22,count9,d,s: integer range 255 downto 0 ;-频率设定系数signal fss,fss2 :std_logic;beginprocess(reset,clk) variable count: integer range 0 to 1600;-16000-10KHZ; variable bclk0: std_logic; begin if reset=1 then bclk0:=0;count:=0; elsif clkevent and clk=1 then if count=1 then -16
20、000 bclk0:=not bclk0; count:=0; else count:=count+1; end if;end if; bclk=bclk0;end process;ctrsinm_recm:process(bclk) -正弦波与三角波切换控制进程begin if bclkevent and bclk=1 then if conver=10 then -调正弦波的频率和幅度 dataf0=conv_integer(dataf);n=n0; elsif conver=01 then -调三角波的频率和幅度 dataf22=conv_integer(dataf);n2 n0 n0
21、n0 n0n0n0n0n0n0n0n0=1;end case;end if;end process sinm_pro; pulse:process(bclk,reset,conver) -调频率进程 begin if reset=1 then fss=0; elsif rising_edge(clk) then if count8=255 then count8=dataf0; fss=1; else count8=count8+1;fss=0;end if;end if; end process pulse; process(fss) beginif rising_edge(fss) the
22、n -产生64个点 if q=63 then q=0; else q d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d null; end case; end process; -以上是正弦波发生,以下是三角波发生 pulse2:process(bclk,reset,conver) -三角波调频进程 begin if reset=1 then fss2=0; elsif rising_edg
23、e(bclk) then if count9=255 then count9=dataf22; fss2=1; else count9=count9+1;fss2=0; end if;end if; end process pulse2; process(fss2) begin if rising_edge(fss2) then if q2=64 then q2=0; -产生65个点else q2 s s s s s s s s s s s s s s s s s s s s s s s s s s s s ss s s s ss s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s null; end case;end process;ss=conv_std_logic_vector(s*n2,9); -将十进制的三角波波形量转换成12位二进制输出 dd=conv_std_logic_vector(d*n,9); -将十进制的正弦波形量转换成12位二进制输出end Behavioral; 附图1 三角波仿真波形附图2 正弦波仿真波形
限制150内