基于FPGA的任意波形发生器%26数字频率计设计_图文_第1页
基于FPGA的任意波形发生器%26数字频率计设计_图文_第2页
基于FPGA的任意波形发生器%26数字频率计设计_图文_第3页
基于FPGA的任意波形发生器%26数字频率计设计_图文_第4页
基于FPGA的任意波形发生器%26数字频率计设计_图文_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1摘要:本文主要探索了应用FPGA 灵活可重复编程和方便在系统重构的特性,以Verilog HDL 为设计语言,将硬件功能以软件设计来描述,提高了产品的集成度,缩短开发周期。所设计的波形发生器可产生正弦波(sina_wave)、锯齿波(swat_wave)、矩形波(squr_wave)、三角波(trig_wave)四种信号,能够实现信号的转换并且频率可调;设计的频率计以1Hz 为基准信号,测量的范围是1Hz 9999Hz ,测量的结果以四位十进制的形式输出。并且给出了实现D/A转换和动态显示的硬件外围电路,而FPGA 作为控制中心。最后还针对设计中可以提高、改进的地方进行了探讨,如:频率计的

2、结果可用字符LCD 显示,频率计的测量范围可通过选择不同的基准频率(比如10Hz 、100Hz 、1KHz )来扩展,利用频率计电路来显示波形发生器的输出波形的频率及形状标识,这样就实现了实验室中函数发生器的雏形:能实现任意波形的输出并且能够测量外来信号的频率,这也是本文的设计思路。关键字:任意波形发生器 频率计 FPGA Verilog HDL QuartusII基于FPGA 的任意波形发生器&数字频率计设计设计的思路主要是以实验室中常用的函数发生器为雏形,及既能输出任意波形,并且频率可调,还可以测量外部信号的频率。实现这两种功能设计的方式有很多种,这里采用FPGA 设计来实现,验证

3、设计的芯片采用Cyclone 系列,具体芯片可根据实验室的配置来确定。语言采用Verilog HDL ,软件以QuartusII 为主 。其中任意波形发生器的实现采用模块设计,这样很好的利用了QuartusII 软件中的LPM_ROM模块,能够达到最优设计;频率计的功能完全采用HDL 语言描述,最后的顶层文件采用模块设计来完成。最终的顶层文件如下图所示:2 一、任意波形发生器的实现要实现的功能:可产生正弦波(sina_wave)、锯齿波(swat_wave)、矩形波(squr_wave)、三角波(trig_wave)四种信号,能够实现信号的转换(select )并且频率可调。主要由三部分组成:

4、地址指针控制模块,四种波形数据存储模块,D/A转换模块。前面2个模块在FPGA 中实现,D/A转换通过外围电路实现。该部分的实现框图如下:数据ROM 中存储正弦波、锯齿波、矩形波、三角波4种信号各一个周期的波形数据(一个周期选择128个数据采样值),地址指针读取ROM 中不同区域的数据,即可产生不同的波形。通过控制读取时间间隔的不同,可实现频率的调整。 1、波形数据存储ROM 模块的设计首先应建立ROM 初始化数据文件Wave_gen.mif。由于每一种波形一个周期取128 3个数据,故共有512个数据。在QuartusII LPM_ROM中配置如下: 四种波形在ROM 中的存储地址分别为:正

5、弦波(sina_wave):0127;锯齿波(swat_wave):128255; 矩形波(squr_wave):256383; 三角波(trig_wave):384511; 每个波形各占16Byte 区域。通过对各个波形128点采样(用C 语言计算),得到各个波形一周期的数据,填写到对应的ROM 存储区域后,即完成了ROM 数据初始化文件。Wave_gen.mif文件内容如下:正弦波(sina_wave)波形数据: 锯齿波(swat_wave)波形数据 矩形波(squr_wave)波形数据: 三角波(trig_wave)波形数据:建立好了Wave_gen.mif文件以后,在原理图输入界面下插

6、入LPM_ROM模块,然后利用MegaWizard Plug-In Manager, 对其进行编辑,主要是完成初始化工作。主要界面如下: 通过以上两步操作,及完成了波形数据存储模块的设计。2、指针控制模块的设计该模块的功能采用Verilog HDL 来描述,程序Wave_gen.v请见附件1。程序实现的主要功能是:根据不同的波形选择(select1:0), 来改变送入ROM中的地址指针address 。四种波形一个周期的数据各占不同的16B ,每次波形改变使address 指向各段数据首地址。编译正确后将其创建为Wave_gen.bsf模块(见顶层文件中所示),然后采用图形编辑方式,完成波形发

7、生器这部分电路的设计。该部分设计完成框图见顶层文件框图(如第2页上图所示)。该部分功能验证的波形仿真结果如下:产生正弦波(sina_wave)时送到DAC0832的数据: 产生锯齿波(swat_wave)时送到DAC0832的数据: 产生矩形波(squr_wave)时送到DAC0832的数据: 产生三角波(trig_wave)时送到DAC0832的数据: 由仿真结果可知,改变select1:0的值,能够正确的将对应的波形数据送到DAC0832,从而完成了整体设计的第一部分。二、数字频率计的实现要实现的功能:设计一个四位数字显示的频率计,标准基准时钟采用1Hz (即1s ),可以测量1Hz 99

8、99Hz 的信号频率。完全采用文本设计,模拟的硬件功能有三部分组成:控制部分、计数测量部分、输出显示数据锁存部分。频率计的程序总体框图及内部部分,内部的握手信号等信息的框图表示如下: 1、信号的定义与说明如下:输入部分input_fre: 输入的待测信号;inclk : 系统的时钟信号。在计数测量部分,其被分频为1Hz 信号;在动态扫描部分,其被分频为动态扫描脉冲。在这里,inclk 假设为实验室的4MHz ; rst :系统的复位时钟,高电平有效。:输出部分Qout15:0: 若打算通过数码管静态显示,则Qout15:12为千位,Qout11:8为百位,Qout7:4为十位,Qout3:0为

9、个位,都是十进制形式;warning: 超过量程时输出的警示信号;decodeout6:0: 动态扫描显示时的译码输出,在扫描脉冲的作用下,循环的输出四位数据;ctr_seg3:0: 四个数码管的未选信号,在扫描脉冲的作用下,与相应位的译码信号对应输出。:中间握手信号count_en: 计数允许信号;count_clr: 在新的一次测量开始时,清除上一次的测量数据,是数码管上的显示数据随时得到更新;load : 计数数据锁存信号。2、控制部分各信号的时序关系输入的系统脉冲经过分频后得到1Hz 的计数基准信号,在基准信号每两个时钟周期经行一次频率测量。该部分产生3个控制信号:count_en,c

10、ount_clr,load。count_clr对计数模块进行复位,持续半个时钟周期;count_en上升沿时刻计数部分开始对输入信号频率进行测量,测量时间恰为一个基准时钟(1Hz ),这段时间对输入信号的脉冲进行计数,结果即为信号色频率。load 即为产生锁存信号。各控制信号的时序关系如下图所示: 3、计数部分的设计通过控制部分送来的控制时序,计数部分可以在一个基准时钟周期内对输入的信号进行频率测量,在计数的同时通过程序控制,使输出都为BCD 码。4、锁存部分设计在load 信号的时序作用下,完成输出数据锁存。5、动态扫描部分的设计在扫描时序的作用下,送出每一位的译码数据(decodeout6

11、:0)及对应的字位选通控制信号(ctr_seg3:0 。设计实现:该模块的功能采用Verilog HDL 来描述,程序fre_measure.v请见附件2。 编译正确后将其创建为fre_measure.bsf模块(见第2页上图顶层文件中所示),然后采用图形编辑方式,完成频率计这部分电路的设计。该部分设计完成后框图见顶层文件框图(如第1页上图所示)。该部分功能验证的波形仿真结果如下:当input_fre设置为40Hz 时,仿真的波形如下: 如上图所示,Qout 显示数据为:0040,即40Hz 。同时将input_fre与clk_1Hz对照比较,亦可数出clk_1Hz一个周期内input_fre

12、为40(图中clk_1Hz半个周期内input_fre为20)。同时译码输出为3F 、66,分别代表0、4的字型码。 :当input_fre设置为200Hz 时,仿真的波形如下: 如上图所示,Qout 显示数据为:0200,即40Hz 。同时将input_fre与clk_1Hz对照比较,亦可数出clk_1Hz一个周期内input_fre为200(图中clk_1Hz半个周期内input_fre为100)。同时译码输出为3F 、5B ,分别代表0、2的字型码。【说明】:为了仿真时减轻CPU 的运算量,程序中的1Hz 分频数据改为199(原数据是1999999),动态扫描时钟分频改为9(原数据是49

13、99),不影响研究问题的实质。由上面的仿真结果可知,频率计能够正确的测量出输入信号的频率,从而完成了整体设计的第二部分。三、顶层电路设计及外围电路设计完成了任意波形发生器的设计与4位数字频率计的设计后,可以利用Quartus II软件的原理图编辑方式完成最后的设计。由于前面的工作已经创建了Wave_gen.bsf模块,fre_measure.bsf模块,调用LPM_ROM模块,并用Wave_gen.mif对其经行初始化(前面已经叙述过),完成最后的顶层文件设计。顶层文件模块连接图如第2页上图所示。外围电路设计:FPGA 作为控制中心,配合外围D/A转换电路、数码管显示电路,则上述设计就能进行硬

14、件测试。下图是利用Proteus 软件方便的作图功能画出的外围电路: 【注明】:这样的电路Proteus 是不能仿真的,这里仅借助Proteus 直观形象的图形表示。四、系统设计有待提高和改进的地方频率计的结果可用字符LCD 显示,让FPGA 送出相应的LCD 控制信号;频率计的测量范围可通过选择不同的基准频率(比如10Hz 、100Hz 、1KHz )来扩展,即可以实现“可选量程”的数字频率计;利用频率计电路来显示波形发生器的输出波形的频率及波形标识,这样就实现了实验室中函数发生器的雏形:能实现任意波形的输出及频率显示并且能够测量外来信号的频率,这也是本文最初的设计思路,那样设计就更加完美。

15、参考文献:【1】 王金明.Verilog HDL程序设计教程. 北京. 人民邮电出版社,2004【2】 Altera 公司.Quartus II 7.2简易用户使用入门指南【3】 王金明. 数字系统设计与Verilog HDL教程. 第二版,2005【4】 曾繁泰.EDA 工程理论与实践-SOC 系统芯片设计. 电子工业出版社,2004,6附件【1】:Wave_gen.v程序如下:module Wave_gen(address,inclk,select,freq;output8:0 address; /输出控制ROM 的地址input inclk; /系统始终,时间应该保证D/A能转换完毕 i

16、nput1:0 select; /波形选择,具体值代表的波形见下面定义 input3:0 freq; /控制输出波形的频率reg7:0 Qout;reg8:0 address;reg7:0 k,m;parameter sina_wave=2'b00,swat_wave=2'b01,squr_wave=2'b10,trig_wave=2'b11;always (posedge inclkbegincase(selectsina_wave:beginif(select=1 address<=128;if(select=2 address<=256;if(

17、select=3 address<=384;if(freq=0|freq=1beginif(address>=127 address<=0;else address<=address+1; endelsebegink<=127/freq;m<=freq*k;if(address>=maddress<=0;elseaddress<=address+freq; endendswat_wave:beginif(select=0 address<=0;if(select=2 address<=256;if(select=3 addres

18、s<=384;if(address<128 address<=128;elsebeginif(freq=0|freq=1beginif(address>=255 address<=128;else address<=address+1;endelsebegink<=127/freq;m<=freq*k;if(address>=(m+128address<=128;elseaddress<=address+freq;endendendsqur_wave:beginif(select=0 address<=0;if(selec

19、t=1 address<=128;if(select=3 address<=384;if(address<256 address<=256;elsebeginif(freq=0|freq=1beginif(address>=383 address<=256;else address<=address+1;endelsebegink<=127/freq;m<=freq*k;if(address>=(m+256address<=256;elseaddress<=address+freq;endendendtrig_wave:b

20、eginif(select=1 address<=128;if(select=2 address<=256;if(select=3 address<=384;if(address<384 address<=384;elsebeginif(freq=0|freq=1beginif(address>=511 address<=384;else address<=address+1; endelsebegink<=127/freq;m<=freq*k;if(address>=(m+384address<=384;elseaddr

21、ess<=address+freq;endendendendcaseendendmodule附件【2】fre_measure.v程序如下:module fre_measure(Qout,warning,ctr_seg,decodeout,inclk,rst,input_fre; input inclk,rst,input_fre;output15:0 Qout;output warning;output3:0 ctr_seg;output6:0 decodeout;reg3:0 ctr_seg,out_seg;reg6:0 decodeout;reg15:0 Qout,temp;reg

22、clk_1Hz,count_en,load,warning,temp1,clk_scan;reg1:0 state_scan;reg21:0 count;reg16:0 count2;always ( posedge inclk beginif(count=1999999 /假设inclk 为4M ,分频得到1Hz 信号 begincount=0;clk_1Hz=!clk_1Hz;endelsebegincount=count+1;clk_1Hz=clk_1Hz;endendalways (posedge clk_1Hz /控制部分设计beginif(rstbegin count_en=0;

23、load=1; endelsebegincount_en=count_en;load=count_en;endendassign count_clr=clk_1Hz&load;always (posedge input_fre or posedge count_clr /计数部分设计 beginif(count_clr=1begin temp<=0;temp1<=0; endelsebeginif(count_en=1beginif(temp=16'h9999begin temp<=0;temp1<=1; endelsebeginif(temp3:0=9

24、begintemp3:0<=0;if(temp7:4=9begintemp7:4<=0;if(temp11:8=9begintemp11:8<=0;if(temp15:12=9temp15:12<=0;elsetemp15:12<=temp15:12+1; endelsetemp11:8<=temp11:8+1; endelsetemp7:4<=temp7:4+1;endelsetemp3:0<=temp3:0+1;endendelsebegin temp<=temp;temp1<=temp1; endendendalways (posedge load /输出锁存部分设计beginQout<=temp;warning<=temp1;endalways ( posedge inclk /分频得到扫描脉冲beginif(count2=4999begincount2=0;clk_scan=!clk_scan;endelsebegincount2=count2+1; clk_scan=clk_scan; end end always (posedge clk_scan / 动态扫描部分设计 begin case(sta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论