频率计设计.docx
《频率计设计.docx》由会员分享,可在线阅读,更多相关《频率计设计.docx(25页珍藏版)》请在冰豆网上搜索。
频率计设计
摘要
VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言。
相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下和基于库的设计的特点,因此设计者可以不必了解硬件结构。
从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD器件中去,从而实现可编程的专用集成电路(ASIC)的设计。
频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。
随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。
将使整个系统大大简化。
提高整体的性能和可靠性。
为适应实际工作的需要,本文在简述频率测量的基本原理和方法的基础上,提供一种基于FPGA的频率计的设计和实现过程,用VHDL在CPLD器件上实现一种8b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。
具有体积小、可靠性高、功耗低的特点。
关键词:
VHDL;可编程逻辑器件;数字频率计;正弦波;CPLD;
目录
设计要求1
1、方案论证与对比1
1.1方案一1
1.2方案二1
2、设计原理及其实现过程2
2.1设计总原理2
2.2块设计和相应模块程序3
2.2.1外围电路模块3
2.2.2分频模块5
2.2.3位选模块5
2.2.4时钟模块7
2.2.5计数模块7
2.2.6BCD码转换模块9
2.3电路调试10
2.4引脚锁定11
3、课程设计结论及心得体会12
4、仪器仪表清单13
5、参考文献13
6、致谢13
附录:
完整程序程序14
频率计设计
设计要求
1.输入频率信号FSIN;
2.范围1Hz~1MHz,波形可以是正弦波、三角波、方波和其他任何有固定频率的信号,信号的幅值0.5V~5V;
1、方案论证与对比
1.1方案一
图1系统原理框图
采用数字逻辑电路制作,用IC芯片拼凑焊接实现,其特点是直接用IC组合而成,简单方便,但由于使用的器件较多,连接复杂,体积大,功耗大。
焊点和线路较多使得测量的精度和稳定性不足
1.2方案二
采用复杂可编程逻辑器件(CPLD)制作,利用EDA软件编程,下载烧制实现功能,将所有的器件集成在一块芯片上,体积大大的缩小的同时稳定性和精度也大大的得到了提升,并且可以用EDA软件仿真,调试,每个人都可以设计自己的代码,提高了开发的效率,缩短了开发周期,降低了开发成本,易于进行功能扩展。
实现方法灵活,调试方波,修改容易。
经比较本设计采用了方案二。
图2系统原理框图
2、设计原理及其实现过程
2.1设计总原理
该程序通过元件例化实现,共分成五个部分程序,分别为分频(fp)程序、位选(wx)程序、时钟(sz)程序、计数(js)程序、BCD转换(bcd)程序。
通过五个模块相互配合实现简易数字频率计的功能。
图3系统原理图
系统原理图如图3示,其实现过程为:
欲测试的方波信号首先通过分频模块,产生10倍,100倍,1000倍及本来方波信号共四路方波信号,四路信号送入位选功能模块,通过四个输入按键控制经过分频处理后的四路方波的选择,此两个模块即实现四个测试档位的功能。
该模块所选择的方波信号送入计数模块,从而得到输入方波的信号频率,然后送入最后的BCD转换模块,将四位十进制数据转化成四组4位BCD码。
计数模块为一分频程序,是为产生一个0.5Hz的时钟脉冲送入计数模块,用以对方波频率测试。
本次简易数字频率计设计系统共分为五个功能模块,如上图所示,分别为分频模块,位选模块,时钟模块,计数模块和BCD码转换模块。
五部分功能模块中,分频模块完成对于预测试的方波进行分频,输出四路分别为原方波频率的1倍,1/10倍,1/100倍,1/1000倍频率的方波,分频后的四路方波信号送入第二功能模块,即位选模块,此模块完成四个档位的设计功能,选择一路输出,送入到计数模块当中,技术模块的计数时钟频率必须为0.5Hz,系统的时钟频率需要经过时钟模块进行分频得到,计数结果即为相应档位下的数值,然后经过BCD码转换模块转换为四位BCD码输出,到此,整个系统功能设计完成。
系统封装图如图所示,其中fb为待测试的方波输入端,clk为系统时钟频率输入端,rst为复位端,k1为频率计乘1档端,k2为频率计乘100档,k3为频率计乘1000档。
g1,g2,g3,g4分别为四路档位对应的标志位,通过四个LED灯点亮实现,g5为超量程警告位,通过一个LED灯闪烁实现。
d1,d2,d3,d4分别输出四位BCD码,并通过数码管显示,分别表示千位,百位,十位,个位。
当系统工作时,四个数码管所显示数据乘以档位即使所测量的方波的频率。
2.2块设计和相应模块程序
2.2.1外围电路模块
对信号的放大功能由三极管构成放大电路来实现,对信号整形的功能由施密特触发器来实现。
施密特触发器电路是一种特殊的数字器件,一般的数字电路器件当输入起过一定的阈值,其输出一种状态,当输入小于这个阈值时,转变为另一个状态,而施密特触发器不是单一的阈值,而是两个阈值,一个是高电平的阈值,输入从低电平向高电平变化时,仅当大于这个阈值时才为高电平,而从高电平向低电平变化时即使小于这个阈值,其仍看成为高电平,输出状态不这;低电平阈值具有相同的特点。
方案一
放大整形电路由三极管与与非门组成。
三极管构成的放大器将输入频率为fx的周期信号如正弦波、三角波进行放大。
将电源电压设为5V,当输入信号幅值比较大时,会出现线性失真,将放大后的波形幅度控制在5V以内。
与非门构成施密特触发器对放大器的输出信号进行整形,使之成为矩形脉冲。
电路图如图4所示。
图4放大整形电路
放大部分同方案一,整形部分是由555构成的施密特整形电路。
电路图如图4所示。
方案对比
图5555构成的施密特触发器
用与非门构成的施密特触发器因为阈值电压易受受温度、电源电压及干扰的影响,稳定性较差。
而555定时器的比较器灵敏度高,输出驱动电路大,并且且555定时器构成的施密特触发器结构简单,而且抗干扰能力比用与非门构成的施密特触发器要强,因此选用方案二。
2.2.2分频模块
该部分程序中使用process,其中敏感信号列表中为fb1,即预测试的方波信号。
通过定义一个变量,以方波为时钟进行计数,该系统需要乘1档,乘10档,乘100档,乘1000档,即进行10倍,100倍,1000倍的分频,则需要程序中计数器计分别计数到5,50,500时对四路输出信号进行逻辑非运算。
该程序封装图如下图6所示:
图6分频程序封装图
其中fb1为预测方波输入信号,ao,bo,co,do分别为分频后的四路信号。
该部分用以实现对预测试的方波进行10倍,100倍,1000倍的分频,以及本来方波信号共计四路方波信号的输出。
该部分程序仿真波形如下图7所示:
图7分频程序仿真图
分频程序仿真参数设定fb1为输入的预测方波信号,ao,bo,co,do为四个输出信号,分别为对输入fb1进行分频后以及本来方波信号,由图中可以看出ao频率与fb1频率相同,bo频率为fb1频率的1/10,co频率为fb1频率的1/100,do频率为fb1频率的1/1000。
2.2.3位选模块
该部分程序包含复位端(rst),其中四个输入信号ai,bi,ci,di分别接分频程序的四路分频后的方波信号,通过四个开关控制端k1,k2,k3,k4分别选择输出信号的选择,例如若k1为高电平,则fb0等于ai的输入信号。
位选程序与分频程序公共构成频率计四个档位测量功能。
位选程序封装图如图8图所示:
图8位选程序封装图
封装图中输入信号ai,bi,ci,di为四路分频后的方波信号,k1、k2、k3、k4分别对应g1,g2,g3,g4四个信号输出,该程序中复位端rst为高电平时,将k1、k2、k3、k4四个开关控制端对应的输出信号g1、g2、g3、g4分别置零,在硬件电路中用四个LED灯的亮灭表示,测量时必须有且仅有一个灯点亮,否则为违规操作,测量数据错误。
该部分程序仿真波形如下图9所示:
图9位选程序仿真图
由仿真图中可以看出,输入信号其中k3为高电平,k1、k2、k3皆为低电平,则相对应的输出信号g3为高电平,fb0波形与第三路输入信号ci相同。
复位信号在前端有一正脉冲,即当为高电平时,所有的输出信号皆为低电平。
2.2.4时钟模块
该部分程序是为实现得到0.5Hz时钟频率,用以对于方波频率的计数测量。
由于硬件中系统时钟频率并不能锁定0.5Hz,则需要对输入的时钟频率进行分频,本系统中选择硬件中clk2引脚的8Hz时钟,则需要对其进行16倍的分频,时钟程序封装如图10所示:
图10时钟程序封装图
图中输入信号clki为系统时钟频率,clko为输出信号,作为计数程序的基准时钟。
该时钟程序仍为一个分频程序,系统时钟频率作为进程中敏感信号列表的值,当定义的计数变量计数到8时对输出clko进行逻辑非运算,并将变量置零,从而得到0.5Hz的时钟信号。
此部分为计数部分输入时钟信号,作为频率测量的基准信号。
程序仿真波形如下图11所示:
图11时钟程序仿真图
其中输入信号clki为系统的时钟信号,输出信号clko为分频后得到的时钟信号,由上图中可以看出,clko的频率为clki的1/16。
因为系统输入时钟频率选为8Hz,则clko时钟频率则为0.5Hz。
2.2.5计数模块
该部分为本次课程简易频率计系统设计的核心部分,此处程序实现对于方波频率的测量。
需要说明的是,此处所得到的测量结果为频率计选择档位后的值,即输出的频率需要乘以档位,最终所得到数据才为所测量方波的频率值。
程序中以0.5Hz频率的时钟信号为基准脉冲,设置在一变量n,当时钟脉冲为高电平时对输入的方波上升沿进行计数,当时钟脉冲为地电平时,计数结束,并输出。
由于要求不能数码显示不能有变化的过程。
这里另设一变量m,当时钟脉冲为高电平时将计数值即n的值赋给m,当时钟脉冲为低电平时,将m值送入输出信号q,由于下一个m送入时需要时钟脉冲进入下一个地电平,借此达到输出q值一直不变的要求,程序封装如下图11所示:
图12计数程序封装图
封装图中fb为经过选档后的方波信号,clk为0.5Hz的计数基准时钟信号。
输出信号g5为超量程警告,q为计数得到频率数值。
计数程序中包含了系统对于测量数据超量程的处理,当计数值超过9999时,g5就会出现高低电平脉冲的持续变换,硬件中锁一LED灯,将显示不断闪烁。
此时为超量程,数码管显示值为错误量。
图13计数程序仿真图
计数程序仿真波形如上图13所示。
由于仿真所限,此处并未使用0.5Hz时钟信号作为输入时钟信号。
图中clk时钟频率为0.2MHz,fb为频率为100MHz,可以看出,fb为clk频率的500倍,由于只有当clk为高电平时计数,所以得到计数结果q值为250。
同理,若clk频率为0.5Hz,则其高电平持续时间即为1s,所得到的计数结果250极为fb信号相应频率值,即此时输入方波频率为250Hz。
2.2.6BCD码转换模块
由于计数程序输出结果为0到10000范围内的整型数据,若想通过模式5锁定引脚,并在四个数码管上显示,则需要首先对其进行BCD码的转换。
该部分程序中也包括系统复位功能的实现。
程序中分别设置三个常量a,b,c其值分别为1000,100,10。
首先将输入整形数据qi除以a,即1000,得到所得数据即为千位数值x1,令qi减去x1乘以1000,极为qi中除去千位后剩余的三位数值,同理继续进行算法,则能得到百位,十位,个位的数值,即将输入的整型数据qi转换成BCD码完成。
因为使用模式5,硬件中自带译码功能,直接可用于数码显示。
用四个数码管分别表示千位,百位,十位,个位,再乘以相应档位,即可得到频率计的测量数值如图14所示:
图14频率计程序封装图
图15BCD码程序仿真图
封装图中qi为经过分频后的方波计数得到的数据,为0~9999范围内的整型数据,d1、d2、d3、d4为四位BCD码,分别表示十进制数的千位、百位、十位、个位的数值。
程序中复位信号rst为高电平时,控制四个输出信号都为0,即四个数码管都显示0,达到复位功能,程序仿真图如上图15所示。
程序仿真前输入信号qi值分别设置了9999,8649,4561三个值,并设置两个rst的正脉冲。
由上图中可以看到,其中当qi为9999时,由于复位信号rst为高电平,所以所有四个输出信号值皆为0,当qi值为8649时,复位rst为0,所以d1、d2、d3、d4分别为8,6,4,9四个值。
同样,当qi值为4561时,四位BCD,码显示4,5,6,1,其中当rst出现一个正脉冲时,d1,d2,d3,d4再次置零,当rst恢复低电平时,继续显示4、5、6和1。
2.3电路调试
该程序分为五个部分,分别实现预定的功能,然后通过元件例化的方式,组合在一起,编写顶层文件,组合在一起,形成整个系统,各功能相互配合以实现简易频率计的设计,封装图如图16所示:
图16顶层文件封装图
顶层文件程序中设置一系列的信号,将五个部分的程序输入输出信号相对应的连接起来,并与整个系统的封装引脚相对应。
同时将五个程序分别编译后生成的.vhd文件加载进来,然后进行编译,仿真。
系统基本原理,其生成的原理框图和系统的封装图在第一部分已有介绍,这里不再赘述。
图2-12为顶层文件仿真图。
由于仿真所限,此处并未按实际需要进行参数设定。
顶层文件程序仿真前,系统时钟频率clk设定为0.5MHz,预测试方波频率值设定为100MHz,由图中可已看出,此时频率计使用k3档进行测试,所得到的数据为16,该数据再乘以100得到的最后值1600才为仿真欲要得到的数据。
以此比例,系统时钟和预测试方波频率都缩小62500倍,则此时系统时钟频率将为8Hz,预测试方波频率为1600Hz,由于按照相同比例变化,所得结果不变,即测试所得数据1600为方波的频率值。
仿真时设定了复位参数,由图中可看出当复位信号rst为高电平时,所有的输出都会置零或变为低电平,可实现总体复位功能。
该系统含有对于预测试频率超量程的标志,如下图17所示
图17顶层文件程序仿真图
由于频率计设计包括了四个档位,其中乘1档测试频率范围为1Hz~9999Hz,乘10档测试频率范围为10Hz~99990Hz,乘100档测试频率范围为100Hz~999900Hz,乘1000档测试频率范围为1000Hz~9999000Hz,所以相对应的档位,预测试的频率一旦超过量程就会出现错误显示。
这里已乘1档为例,仿真参数中k1为高电平,系统时钟信号clk频率设定为0.05MHz,预测方波频率设定为100MHz,则需程序中计数器计到16000,超过范围,所示输出信号g5会出现正脉冲信号,若硬件锁定在一个LED灯引脚,则会不断亮灭闪烁,以表示超量程,此时数码管数据错误。
2.4引脚锁定
顶层文件编译仿真完成后要对顶层文件程序中各个输入输出信号进行引脚锁定,值得说明的是,硬件试验箱选用模式5方式,其中数码管自带译码功能。
系统时钟引脚应锁定为左侧clk2引脚(54),预测方波fb锁定右侧clk1引脚(126)。
具体引脚锁定如下图18中所示。
图18引脚锁定图
锁定引脚完成后,对程序再次进行编译,然后下载到硬件中,通过硬件操作,测试简易频率计的各项功能,包括1Hz~10MHz频率测试,数据在四个数码管上的显示,频率计档位切换,复位功能,超量程标志等。
3、课程设计结论及心得体会
本次EDA课程设计题目为简易数字频率计设计,实现对于1Hz~10MHz频率范围的方波频率进行测量,并在四位数码管上显示。
该频率计包括四个档位,具有记忆功能,拥有一个整体的复位控制。
此次课设需要用硬件描述语言(VHDL)编写程序,并在QuartusII软件平台上进行程序的编译和仿真,锁定引脚并下载到可编程逻辑器件(试验箱)中,进行硬件的测试。
此次EDA课程设计历时两周时间,两人一组合作进行简易数字频率计系统的设计。
程序的编写我们采用元件例化的形式,经过思考和相互间的分析讨论,将整个系统划分五个功能模块,彼此配合进行五个功能模块设计和程序的编写。
其间,我们亦遇到许多问题,诸如整个系统核心模块计数过程的实现,时钟频率的设定,将整形数据转换成BCD码显示的算法等等。
经历两周时间的不懈努力和队友之间愈加默契的配合,我们终于完成预定的目的,完成整个简易数字频率计的设计。
虽然其中遇到很多困难,很多问题,但在我们两人相互支持和鼓励想下,都能够得以顺利的找到解决办法或者改进的方法,并在合作中相互提高,彼此进步,在困难在中体会到合作的乐趣。
EDA技术对于我们电子信息工程专业的学生来说是一本很重要的专业技术课程,EDA技术极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度,是一门实际应用很广泛的技术。
现在对EDA的概念或范畴用得很宽。
包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。
目前EDA技术已在各大公司、企事业单位和科研教学部门广泛使用。
例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。
所以,EDA课程的学习对于我们自身素质和能力的提高有十分重要的积极作用,应该很认真的学习。
4、仪器仪表清单
器件
型号/参数
数量
SOPC/EDA开发系统
GW48
1套
微型计算机
联想
1台
QuartusⅡ软件
6.0
1套
表一仪器仪表清单
5、参考文献
[1]潘松著.EDA技术实用教程(第二版).北京:
科学出版社,2005.
[2]康华光主编.电子技术基础模拟部分.北京:
高教出版社,2006.
[3]阎石主编.数字电子技术基础.北京:
高教出版社,2003.
[4]高吉祥主编.电子设计小制作.上海:
电子科技杂志出版社,2011.
6、致谢
这次课程设计感谢指导老师岳舟的悉心教导,也感谢其他老师对我们的帮助,同时感谢课程设计带队的老师们。
特别提出的是在本课题方案的选择上,岳老师给予了我们很多建议,且在解决课程设计遇到的困难上,岳老师田老师给了我们很大的帮助。
同样感谢同学们的通力合作,成功不是属于一个人的,而是属于大家的。
附录:
完整程序程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitypljis
port(fb,clk,rst:
instd_logic;
k1,k2,k3,k4:
instd_logic;
g1,g2,g3,g4,g5:
outstd_logic;
d1,d2,d3,d4:
outstd_logic_vector(3downto0));
endplj;
architecturebhvofpljis
signalh0,h1,h2,h3:
std_logic;
signals0,s1,s2:
std_logic;
signalp0:
integerrange0to10000;
componentfpis
port(fb1:
instd_logic;
ao,bo,co,do:
bufferstd_logic);
endcomponent;
componentwxis
port(ai,bi,ci,di,rst:
instd_logic;
k1,k2,k3,k4:
instd_logic;
g1,g2,g3,g4:
outstd_logic;
fb0:
outstd_logic);
endcomponent;
componentszis
port(clki:
instd_logic;
clko:
bufferstd_logic);
endcomponent;
componentjsis
port(fb,clk:
instd_logic;
g5:
outstd_logic;
q:
outintegerrange0to10000);
endcomponent;
componentbcdis
port(qi:
inintegerrange0to10000;
rst:
instd_logic;
d1,d2,d3,d4:
bufferstd_logic_vector(3downto0));
endcomponent;
begin
u1:
fpportmap(fb1=>fb,ao=>h0,bo=>h1,co=>h2,do=>h3);
u2:
wxportmap(k1=>k1,k2=>k2,k3=>k3,k4=>k4,ai=>h0,bi=>h1,ci=>h2,di=>h3,
rst=>rst,fb0=>s0,g1=>g1,g2=>g2,g3=>g3,g4=>g4);
u3:
szportmap(clki=>clk,clko=>s1);
u4:
jsportmap(fb=>s0,clk=>s1,g5=>g5,q=>p0);
u5:
bcdportmap(qi=>p0,rst=>rst,d1=>d1,d2=>d2,d3=>d3,d4=>d4);
endbhv;
分频程序
libraryieee;
useieee.std_logic_1164.all;
entityfpis
port(fb1:
instd_logic;
ao,bo,co,do:
bufferstd_logic);
endfp;
architecturebhvoffpis
begin
ao<=fb1;
process(fb1)
variablenu,nu1,nu2:
integerrange0to1000:
=0;
begin
if(fb1'eventandfb1='1')then
nu:
=nu+1;nu1:
=nu1+1;nu2:
=nu2+1;
if(nu=5)then
bo<=notbo;
nu:
=0;
endif;
if(nu1=50)then
co<=notco;
nu1:
=0;
endif;
if(nu2=500)then
do<=notdo;
nu2:
=0;
endif;
endif;
endprocess;
endbhv;
位选程序u2:
libraryieee;
useieee.std_logic_1164.all;
entitywxis
port(ai,bi,ci,di,rst:
instd