已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多功能波形发生器系统设计 设 计 人:潘 礼 阮赐朋 王怀涛指导老师:黄智伟 王 彦南华大学电子实验室 2003.8.23摘 要:本设计为一数字式多功能波形发生系统。系统应用VHDL语言,以FPGA为控制核心,实现了多种波形的可控输出,且支持任意波形的输入、存储和回放。系统采用了DDFS技术来产生波形,同时输出采用双DAC0832芯片完成D/A转换,实现了输出波形幅度的数字式控制,幅度精度最高达7.6894e-5 V。关 键 字: 直接数字频率合成技术 数字幅度控制 数模转换Abstract:This design is a digital multi_aplication function generator.System applying VHDL language, regarding FPGA as the core of control, can produce more than one function waves,morever it can store, represent random function waves. The system adopting DDFS technique to produce waves, at the fan-out double DAC0832 was used to convert the digital signals to the analog signals, at the same time the amplitude of output can be adjusted in a digital way, the precision of amplitude can reach 7.6894 e-5 V.Key word: DDFS digital adjust of amplitude the D/A convert引 言:现代工程中波形发生器的应用是很广泛,而且相当重要。由于传统的模拟波形发生器在低频段波形质量不高,且功耗比较大等原因,工程中很少用模拟波形发生器来产生低频波。而现代作为主流的数字波形发生器由于采用不同的技术、不同的器件及工艺,其产生波的质量也有很大差别。本系统以FPGA作为开发平台,采用DDFS技术产生波形,由于FPGA内部电气特性远远弱于逻辑特性,因而系统输出的波形具有毛刺少、频带宽、调节方便等优点。一、 方案比较1、模拟锁相环实现模拟锁相环技术是一项比较成熟的技术。应用模拟锁相环,可将基准频率倍频,或分频得到所需的频率,且调节精度可以做到相当高、稳定性也比较好。但模拟锁相环模拟电路复杂,不易调节,成本较高,且由于受模拟器件的影响,波形变换调节时间较长,输出波形的毛刺较多,因此模拟锁相环实现在低频(0500KHz)信号发生系统中不是很好的方案。2、 直接数字频率合成实现直接数字频率合成(DDFS)技术是经典的数字频率合成技术。由于数字量的可操作性远远高于模拟量,采用DDFS的优点在于频率精度高、波形调节方便、且输出波形毛刺少等。基于单片机的数字波形发生系统受单片机指令频率的限制,输出波形频率较低,而基于FPGA的波形发生系统就不存在这样的问题,其输出频带较单片机实现有很大的展宽。本系统设计选定以FPGA作为系统控制核心的直接数字频率合成实现方案。二、 总体设计该多功能数字波形发生器的主要功能有4种基本波形(正弦波、三角波、锯齿波及芳波)的可控输出,超低幅度(MV级)方波的产生,任意波的输入、存储、输出,以及各种波的线性叠加输出。由于FPGA的高度集成化设计,系统设计中将大部分的控制集成在FPGA中央处理模块内部,如存储器(RAM)、波形产生模块、波形选择模块等。外设主要有任意波形输入器件、A/D转换器件、输入频率跟踪采样器件以及键盘、数码管等。1、 整体设计 总体设计框图如下图 2-1. 系统整体框图系统以FPGA为控制核心,基于FPGA的中央处理模块集成了RAM,用以存储各种波形特性数据。32.0000MHz晶振输出的单个脉冲周期为系统最小时间单位,系统通过改变输出波形相邻采样点间的脉冲个数达到调节输出频率的效果。系统输出采用双DAC0832串联的调幅方案,系统可以方便而精确的改变输出波的幅度,而且可根据需要生成幅度调制波。2、 各模块设计键盘输入模块 键盘主要用于输入各种控制信号以及设定频率的输入。调频数据采用BCD码直接置数方式输入,输入量通过系统内部集成的除法器转化为相邻采样点间的脉冲个数,以达到调节输出波频率的目的。任意波形的输入同样采用BCD码置数方式,任意波的表征参数有采样点数、各采样点的归一化幅度、各点的相对位置等。系统键盘扫描键盘的时间为1/8 S。应用键盘输入的缺点是在输入波形的采样点值比较多,相应的输入操作比较烦琐,且容易出错。而较之其他输入方式(如触摸屏等)就相当方便。下面是BCD码输入电路图:图2-2.BCD码输入电路上图中CON9为排阻,所起作用为限流,这样可保证输入的电流不会损坏FPGA。其他模拟输入模块此模块作为预留接口,可支持各种模拟器件的波形输入方式:触摸屏、手写板等。因输入波的不确定性,模块设计中采用自适应跟频技术(LMS),系统自动跟踪输入波的频率以选择合适的采样频率对输入波进行采样。自适应跟频技术属DSP范畴,应用FPGA实现这一功能困难较大,系统采用凌阳产的“61板”SPCE061A EMU BOARD(十六位单片机)完成此项功能的设计。A/D转换器件选用ADC0809,模拟波经ADC0809转化为数字量输入到61单片机,61单片机具有16*16位的乘法运算和内积运算的DSP功能,通过对输入波的频谱进行分析、运算,就可确定系统对外部模拟波的采样频率ADC0809的工作频率。这样就保证了输入波的特性数据不会遗漏。待ADC0809的工作频率确定后,再将其转换的数据输入到FPGA进行存储。由于此类方式输入的模拟波频带较宽,系统对此类波进行特征提取后,存储需要较大的空间,因此系统必须加载专用的外部高速RAM。FPGA中央处理模块FPGA中央处理模块内部集成了较小的波形特性存储器RAM(应用于键盘输入的固定64点采样的任意波形)、调频输入BCD码到脉冲个数转换用的除法器、幅度调节显示模块和波形发生模块。A. RAM模块FPGA集成RAM中的部分地址对应固定正弦波的64点采样数据,这部分的作用相当于静态ROM,其余大部分空间用于存放输入任意波的特征数据。当输入波频率比较高时(对应非键盘方式输入波),系统需要相当大的空间来存储输入波的特征数据,这对系统资源的要求过高,因此,系统内部集成RAM只存储键盘输入的任意波的特征数据,而其他方式输入波的特征数据经系统的外部RAM接口,直接进入外部专用RAM器件存储。B.除法器模块应用除法器实现设定输出频率与对应输出相邻采样点间脉冲数的转换是相当方便的。在输出频率在超低频段时,系统应用除法器拥有相当高的精度。以晶振频率为32.0000MHz,正弦波采样点数为64为例,不同频段的可调阶数如下表: TABLE 2-1. 可调阶数频段分布表频段可调阶数01Hz无限1011Hz4545100101Hz5010001001Hz0上表为理论计算所得,在超低频段时,波形发生器输出的精确频率分布很密集。应用除法器的好处就是在超低频段可以得到相当精确调节的输出波。当然输出频率在较高频段(5KHz)时,通过键盘置入的输出设定频率与实际的输出频率存在相当大的误差,然而相比其他一些算法(等步进调节),应用除法器的效果在较高频段误差更小。应用FPGA设计的除法器对运算中最后取值可能有两种不同的作法: 一种是采取四舍五入方式;另一种是向零归整法。比较两种算法,在超低频段时精度都差不多;而在较高频段,四舍五入方式的误差是设定频率所对应量阶的1/2,向零归整法的误差却是对应的整个量阶,因而本设计中除法器采用了四舍五入的除法取值方案。在逻辑器件中,加、减、乘、除各类运算都是相通的,而其中最基本的运算是加法,应用加法来解决涉及数据乘、除的问题,准确率较高,因此该除法器设计中采用的方法是: 先将除法运算转化为减法,再将减法转换到加法,最后由加法完成。C.幅度调节显示模块由于系统输出采用双DAC0832串联的方式,系统输出波的幅度可通过按键来调节。系统对应不同的输出波有不同的幅度调节方式:输出为方波时,通过按键使用者即可调节输出波的归一化幅度,又可调节输出离散波形的DAC0832的基准电压(Vref: 参看2.2.4节);而其他波形的输出只能调节输出波形的DAC0832的基准电压。DAC0832的分辨率是8位,只调节DAC0832的基准电压误差是一个最小量阶5/2550.020V,而输出为方时,调节误差仅为5/(255*255)=7.6894e-5 V。系统调幅数据的处理方式是按键累加,系统以8Hz频率扫描调幅按键端口,当得到升幅按键输入为高电平时,将幅度寄存信号加一;反之,当降幅按键为高电平时,幅度寄存信号自减一。对应幅度的显示是本模块设计的重点: 输出方波时,波形幅度值为n*N/(255e2)n*N*1.53787e-5,应用FPGA直接进行如此高精度的运算所耗资源相当大,本设计采用近似算法实现了幅值的转换显示,此种算法带来的误差不超过1mV.具体算法如下: 通过简化,上式结果可表示为769*n*N*10e-7,以最高阶数255代入n,N可得Vmax=50004225*10e-7,Vmax=(50004225*10e-7)-5.000=0.4225*10e-3 (V).由于要求幅度只显示4位,即精确到毫伏(MV)级,因此此种近似带来的误差可忽略。系统输出其他波时,其幅度转化算法与方波一样,但对比于方波,这些波幅度只能通过调节DAC0832的基准电压实现,其可调阶数只有255档,D/A转换本身带来的误差就比较大,5/2550.01961(V),应用近似算法引入的误差比之要小得多:上式中N为DAC0832基准电压调节阶数。由上式可得近似算法引入的误差与DAC0832带来的误差之比为0.55*10e-3/0.019612.8%。D.波形发生模块波形发生模块的设计采用DDFS技术。所谓DDFS技术就是用数字量直接合成模拟量。图2-3.DDFS单周期合成原理示意图上图为用14个数字量合成的一个周期的正弦波波形。图中数字量以阶梯波的形式表征了模拟正弦波的周期、幅度等特性参数,用低通滤波将高频成分去掉,就可看到比较平滑的正弦波。应用DDFS实现波形合成没有复杂的乘除运算,且对波形特性的调节方便。本模块设计思路是将RAM中的波形数据以一定的时间为间隔输出,通过改变间隔的时间来调节输出波的频率。应用FPGA作控制核心是该设计优于用单片机作控制核心的波形发生器的关键所在。DAC0832的数模转换周期为1S,用单片机每向DAC0832传送一个数据最少要用两条指令: MOV DPTR,#ADDR_0832MOVX DPTR, A ;A中存放要输出的数据两条指令执行要5个机器周期5S,由此可见,用单片机不能完全发挥DAC0832的潜能。用FPGA作的DAC芯片驱动电路其数据输出频率可以做到很高,输出一个数据的最短时间是1/32.0000M0.03125S,可见用FPGA驱动DAC0832,使其最大限度工作绰绰有余。该系统设计过程中考虑了方波的特性占空比,因而系统综合了两种方波的输出: 占空比可调方波和占空比不可调方波。前者产生方式类似于正弦波,通过选择64个采样点中不同的点作为01切换点,就可达到调节占空比的目的。但其输出波的频率也因此受到限制;而后者的频率就比较高,但其占空比是固定的1/2。D/A转换模块该模块的主要工作是将FPGA输出的数字量转换为模拟量。模拟量的频率由FPGA的数据输出频率确定,而模拟量的幅度调节的实现是基于双DAC0832的设计。该模块主要由两片DAC0832组成,一片用于接收FPGA传来的波形数据,将其转化为模拟量输出;另一片接收来自FPGA的波形幅度数据,用以产生相应的幅度电压,将其作为基准电压输入到上一片DAC0832的基准电压(Vref)输入端口,实现输出波的幅度可调。双DAC0832的串接电路图如下: 图 2-4. 双DAC0832串接电路图DAC0832将数字量(波形的电压幅度值)转化为模拟量(形式为电流),上图中DAC0832处于直通工作方式,外部运放电路的作用是将模拟电流量转化为电压量输出。电压输出即可是单极性的,也可是双极性的。在J12的输出口中,输出口1为单极性输出端,输出口2为双极性输出端。三、 软件实现1、BCD码二进制数转换模块该模块应用计数的方法完成BCD码到二进制数的转换,仿真图如下: 图3-1. BCD码二进制数转换仿真图图3-1中,A、B、C分别为三位十进制数的BCD码输入:A为百位BCD码,B为十位BCD码,C为个位BCD码输入。从仿真图中可以看出:当变量COUNT累加脉冲数到123时,BCD码才完全转换为二进制数输出。2、波形发生模块图3-2.波形发生模块原理仿真图图中DATA为设定输出相邻采样点间隔的脉冲数。结合除法器,设定的输出频率转化为DATA来控制FPGA的输出频率。四、 系统测试1、系统测试仪器系统测试采用TeKtronix公司生产的TDS3032型数字式双通道荧光示波器,该示波器带宽300兆赫,最大次速率2.5GS/s,支持方波占空比的测量。应用该系统可较精确的反映系统的频率、幅度等各项指标。 2.、测试指标本系统测试主要针对正弦波、三角波、方波A(占空比可调方波)、锯齿波的频率的精确性,方波B(占空比不可调方波)的频率精度,方波(A 或 B)的幅度精度等。以下为各项指标的测量图表:A. 正弦波、三角波、锯齿波和方波A的频率测量表4-1. 正弦波、三角波、锯齿波和方波A的频率测量数据表格设定频率测得频率测量误差值1HZ1.000HZ0.0%20HZ20.00HZ0.0%50HZ50.00HZ0.0%100HZ100.0HZ0.0%200HZ199.9HZ0.05%500HZ499.5HZ0.1%1KHZ9.997KHZ0.3%2KHZ1.993KHZ0.35%5KHZ4.945KHZ1.1%10KHZ9.765KHZ2.35%B. 方波的幅度测量 方波属于幅度控制精度比较高的输出波形,主要应用于毫伏级信号的发生,因而选定的测量点大部分在毫伏级。 表4-2.方波幅度测量数据表格设定幅度测得幅度测量误差值5MV5.06MV1.2%10MV9.80MV2.0%20MV19.6MV2.0%50MV49.2MV1.6%100MV98.0MV2.0%200MV196MV2.0%500MV498MV0.4%1.000V0.990V1.0%2.000V1.98V1.0%5.000V4.95V1.0%C. 方波B的频率测量方波B是固定占空比(1/2)的方波,因而其输出频率较高,下表中频率测量点偏高。 表4-3.方波B频率幅度测量数据表格设定频率测得频率误差值10HZ10.00HZ0.0%100HZ100.0HZ0.0%200HZ200.2HZ0.1%500HZ500.5HZ0.1%1KHZ1.000KHZ0.0%2KHZ2.000KHZ0.0%5KHZ5.001KHZ0.02%10KHZ10.00KHZ0.0%50KHZ49.95KHZ0.1%500KHZ495.4KHZ0.9%以上是系统各主要指标的测量数据,对于其他一些系统指标,如方波占空比,任意波输入、存储等,由于此类指标测量数据比较笼统,因而未予列表。经测试以上几个指标均达到设计要求。五、 结束语本设计以FPGA为开发平台,充分体现了FPGA在直接数字频率合成方面的优越性。系统基本功能全部实现,支持幅度精确的毫伏级信号发生,且精度较高。系统支持除键盘外的其他波形输入方式,结合外部大容量的专用存储器可完成简单的数字存储示波功能。六、 参考文献1.高天光 主编. 模数转换器应用技术 第一版.北京:科学出版社. 2001 2.刘明业 等编. VHDL语言100例详解 第一版。北京:清华大学出版社. 1999七、 附录程序清单:程序名: prod_wave.vhd程序功能:本程序应用DDFS技术,实现了4种常见波形(正弦、三角、锯齿、方波)的可控输出、任意波形特征数据的采集、存储与波形的重现等功能,程序留有外部RAM的扩充接口,使复杂输入波的特征提取成为可能。编程日期: 2003.8.23-library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mine4 isport(clk : in std_logic; -时钟信号输入 set, clr, up, down, zu, zd : in std_logic; -各个波形特征的调节触发信号 posting : in std_logic; -任意波键盘置入信号 u0,d0,sw : in std_logic; ss : in std_logic_vector( 3 downto 0 ); -档位选择信号 sss : in std_logic_vector( 4 downto 0 ); -波形选择信号 data3, data2, data1,data0 : in std_logic_vector(3 downto 0); -BCD码输-入 p180 : out std_logic; -预留接口 lcd : out std_logic_vector(7 downto 0); -显示输出 shift : out std_logic_vector(3 downto 0); -位码输出 dd, a : out std_logic_vector( 7 downto 0);-波形、幅度数据输出end mine4;architecture behav of mine4 issubtype word is std_logic_vector( 7 downto 0 );type unit is array(63 downto 0) of word;signal ram : unit;signal qqq : integer range 0 to 250000000;signal qq : integer range 0 to 78125000;signal tmp : integer range 0 to 9999;signal coun : integer range 0 to 78125000;signal coun0 : integer range 0 to 250000000;signal b : integer range 0 to 78125000;signal c : integer range 0 to 250000000;signal z, con : integer range 0 to 63;signal f : std_logic_vector( 7 downto 0 );signal amp, amp0, d : std_logic_vector(7 downto 0);signal bcd0,bcd1,bcd2,bcd3 : integer range 0 to 9;signal bcd01,bcd11,bcd21,bcd31 : integer range 0 to 9;signal bcd00,bcd10,bcd20,bcd30 : integer range 0 to 9;signal y : integer range 0 to 9;signal addr, adrr : integer range 0 to 63;signal over : std_logic;beginqq=781250 when ss=1000 else 7812500 when ss=0100 else 78125000 when ss=0010 else 78125;qqq= 5000000 when ss=1000 else 50000000 when ss=0100 else 500000000 when ss=0010 else 500000;process(clk) variable count4 : integer range 0 to 6250000;variable count : integer range 0 to 78125000;variable count3 : integer range 0 to 250000000;variable count1 : integer range 0 to 12500000;variable count0 : integer range 0 to 3249999;variable ddd : std_logic_vector(9 downto 0);variable dd0,dd1,dd2,dd3,dd4 : integer range 0 to 255;variable adr : integer range 0 to 63;begin if rising_edge(clk) then if posting=1 then if count4=6249999 then count4:=0; adr:=conv_integer(data3)*10+conv_integer(data2); if adr64 then if set=1 then ram(adr)adrr then adrr=adr; end if; elsif clr=1 then adrr=0; for i in 0 to 63 loop ram(i)0);end loop; end if; end if; else count4:=count4+1; end if; else if set=1 then tmp=conv_integer(data3)*1000+conv_integer(data2)*100+conv_integer(data1)*10+conv_integer(data0); coun=0; b=0; coun0=0;c=0;z=31;amp0=01111111; amp=01111111; addr0 then if sw=0 then if counqq then coun=coun+tmp; b=b+1; else if count=b then count:=0; if f=63 then f=00000000; if sss=00010 then con=0; dd=00000000; elsif sss=10000 then dd=d;elsif sss=00100 then dd=f(5 downto 0)&00;elsif sss=01000 then dd=(111111-f(5 downto 0)&00; elsif sss=00001 then if addradrr then dd=ram(addr); addr=addr+1; elsif addr=adrr then dd=ram(adrr); addr=0; end if; else if sss(1)=1 then if con=z then dd0:=conv_integer(amp0); con=con+1; else con31 then dd3:=conv_integer(111111-f(5 downto 0)&00); else dd3:=conv_integer(f(5 downto 0)&00); end if; end if; if sss(0)=1 then if addradrr then dd4:=conv_integer(ram(addr); addr=addr+1; elsif addr=adrr then dd4:=conv_integer(ram(adrr); addr=0; end if; end if; ddd:=conv_std_logic_vector(dd0+dd1+dd2+dd3+dd4),10); dd=ddd(9 downto 2); end if; else f=f+1; if sss=00010 then if con=z then dd=amp0; con=con+1; elsif con=63 then con=0; dd=00000000; else con=con+1; dd=00000000; end if; elsif sss=10000 then dd=d;elsif sss=00100 then dd31 then dd=(111111-f(5 downto 0)&00; else dd=f(5 downto 0)&00; end if; -else dd=00000000; elsif sss=00001 then if addradrr then dd=ram(addr); addr=addr+1; elsif addr=adrr then dd=ram(adrr); addr=0; end if; else if sss(1)=1 then if con=z then dd0:=conv_integer(amp0); con=con+1; else con31 then dd3:=conv_integer(111111-f(5 downto 0)&00); else dd3:=conv_integer(f(5 downto 0)&00); end if; - else dd=00000000; end if; if sss(0)=1 then if addradrr then dd4:=conv_integer(ram(addr); addr=addr+1; elsif addr=adrr then dd4:=conv_integer(ram(adrr); addr=0; end if; end if; ddd:=conv_std_logic_vector(dd0+dd1+dd2+dd3+dd4),10); dd=ddd(9 downto 2); end if; end if; else count:=count+1; end if; end if;- else if coun0qqq then coun0=coun0+tmp; c=c+1; else if count3=c/2 then count3:=count3+1; dd=amp0; elsif count3=c then count3:=0;dd=00000000; else count3:=count3+1; dd=00000000; end if; end if; end if; end if; -if count1=12499999 then count1:=0; if zu=1 then if z63 then z=z+1; else z0 then z=z-1; else z=0; end if; end if;else count1:=count1+1;end if; if count0=3249999 then count0:=0; if u0=1 then if amp011111111 then amp0=amp0+1; else amp000000000 then amp0=amp0-1; else amp0=00000000; end if; elsif up=1 then if amp11111111 then amp=amp+1; else amp00000000 then amp=amp-1; else amp=00000000; end if; end if; else count0:=count0+1; end if;- end if;end if;end if;end process;-a=amp; -cov_a:process(clk,amp,amp0)variable count : integer range 0 to 50004225;variable counter : integer range 0 to 500055;variable count1,count0 : integer range 0 to 4999999;begin if rising_edge(clk) then if sss=00010 then count0:=0; if count1=4999999 then count1:=0; count:=(conv_integer(amp)*(conv_integer(amp0)*769; bcd0=0; bcd1=0; bcd2=0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论