数字频率计设计Word格式文档下载.docx
《数字频率计设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数字频率计设计Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
第三章数字频率计各模块的设计和实现6
3.1计数器的设计和实现6
3.27段译码器的设计8
3.3数字频率计综合设计9
第四章数字频率计波形仿真15
4.1省略分频进程15
4.210kHz、100kHz和1MHz三挡仿真15
4.3测周期挡仿真17
第五章调试常见错误及解决办法19
5.1常见错误与解决办法19
总结20
致谢21
附录22
附录AMAX+PLUSⅡ简介22
附录B软件的安装23
附录C软件组成23
附录D设计流程24
参考文献25
随着电子技术的发展,当前数字系统的设计正朝着速度快、容量大、体积小、重量轻的方向发展。
推动该潮流迅猛发展的引擎就是日趋进步和完善的设计技术。
目前数字频率计的设计可以直接面向用户需求,根据系统的行为和功能要求,自上至下的逐层完成相应的描述、综合、优化、仿真与验证,直到生成器件。
上述设计过程除了系统行为和功能描述以外,其余所有的设计过程几乎都可以用计算机来自动地完成,也就是说做到了电子设计自动化(EDA)。
这样做可以大大地缩短系统的设计周期,以适应当今品种多、批量小的电子市场的需求,提高产品的竞争能力。
电子设计自动化(EDA)的关键技术之一是要求用形式化方法来描述数字系统的硬件电路,即要用所谓硬件描述语言来描述硬件电路。
所以硬件描述语言及相关的仿真、综合等技术的研究是当今电子设计自动化领域的一个重要课题。
硬件描述语言的发展至今已有几十年的历史,并已成功地应用到系统的仿真、验证和设计综合等方面。
到本世纪80年代后期,已出现了上百种的硬件描述语言,它们对设计自动化起到了促进和推动作用。
但是,它们大多各自针对特定设计领域,没有统一的标准,从而使一般用户难以使用。
广大用户所期盼的是一种面向设计的多层次、多领域且得到一致认同的标准的硬件描述语言。
80年代后期由美国国防部开发的VHDL语言(VHSICHardware DescriptionLanguage)恰好满足了上述这样的要求,并在1987年12月由IEEE标准化(定为IEEEstd1076--1987标准,1993年进一步修订,被定为ANSI/IEEEstd1076--1993标准)。
它的出现为电子设计自动化(EDA)的普及和推广奠定了坚实的基础。
据1991年有关统计表明,VHDL语言业已被广大设计者所接受。
另外,众多的CAD厂商也纷纷使自己新开发的电子设计软件与VHDL语言兼容。
由此可见,使用VHDL语言来设计数字系统是电子设计技术的大势所趋。
第一章概述
1.1设计概述
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
本数字频率计的设计思路是:
1.根据频率计的测频原理,可以选择合适的时基信号即闸门时间,对输入被测信号脉冲进行计数,实现测频的目的。
2.根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、控制模块、计数模块、译码模块和量程自动切换模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
3.在进行设计之前,首先搞清楚在什么情况下是测频率,在什么情况下是测周期,其实就是一个选择合适的时基信号的问题。
在这个设计中,要在频率计提供的时基信号和输入信号之间做出选择,充当时基信号即闸门时间。
当测频率的时候,要以输入信号作为时钟信号,因为输入信号的频率大于频率计提供的基准频率,在频率计提供的基准信号周期内,计算输入信号的周期数目,再乘以频率计基准频率,就是输入信号的频率值了。
此时的时基信号为频率计的基准信号。
当测周期的时候,要以频率计提供的基准信号作为时钟信号,因为频率计提供的时基频率大于输入信号的频率,在输入信号周期内,计算频率计提供的基准信号的周期数目,再乘以基准信号频率,就是输入信号的周期值了。
此时的时基信号为输入信号。
1.2设计目的
1.学会利用MAX+PLUSⅡ进行层次化设计;
2.练习混合设计设计输入的方法;
3.巩固用试验箱验证设计的方法。
1.3设计内容
分析数字频率计的功能,完成功能模块的划分,分别用VHDL语言完成底层模块的设计和以原理图的方法完成顶层模块的设计,分别对各个模块以及顶层模块进行仿真分析,最后在硬件开发平台上进行测试。
1.4设计原理
众所周知,频率信号易于传输,抗干扰性强,可以获得较好的测量精度。
因此,频率检测是电子测量领域最基本的测量之一。
频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1s。
闸门时间可以根据需要取值,大于或小于1s都可以。
闸门时间越长,得到的频率值就越准确,但闸门时间越长,则每测一次频率的间隔就越长。
闸门时间越短,测得的频率值刷新就越快,但测得的频率精度就受影响。
一般取1s作为闸门时间。
数字频率计的关键组成部分包括测频控制信号发生器、计数器、锁存器、译码驱动电路和显示电路,其原理框图如图1所示。
1.5设计功能
3位数字频率计是用3个十进制数字显示的数字式频率计,其频率测量范围为1MHz。
为了提高测量精度,量程分别为10kHz、100kHz和1MHz三挡,即最大读数分别为9.99kHz,99.9kHz和999kHz。
要求量程自动换挡。
具体功能如下:
1.当读数大于999时,频率计处于超量程状态,下一次测量时,量程自动增大一挡。
2.当读数小雨099时,频率计处于欠量程状态,下一次测量时,量程自动减少一挡。
3.当超出频率测量范围时,显示器显示溢出。
4.采用记忆显示方法,即测量过程中不显示数据,待测量过程结束以后,显示测频结果,并将此结果保持到下次测量结束。
显示时间不少于1秒。
5.小数点位置随量程变化自动移位。
6.增加测周期功能,就是当时钟频率低于0.99kHz的时候,显示的数值变成周期,以毫秒为单位。
第二章数字频率计的设计思路
2.1时基的设计
输入信号是随意的,没法预知其频率是多少,如何选取频率计提供的基准信号是关键。
设计要求量程分别为10kHz,100kHz和1MHz三挡。
测频率时,在某个挡进行测量的时候,就需要提供该挡的时基。
在10kHz挡,该挡最大读数为9.99kHz,同时也说明最小的读数是0.01kHz,所以提供的时基应该是频率为0.01kHz的脉冲。
同样的道理100kHz挡提供的时基应该是0.1kHz的脉冲,1MHz挡提供的时基应该是频率为1kHz的脉冲。
要产生这3种脉冲,就得从输入的时钟中提取(这里假设输入的是20MHz的脉冲),分别采用分频的方法来产生这3种时基信号显然不可取,太浪费资源,因为分别产生得用到3个分频器,一个为20kHz分频器,用于产生频率为1kHz的脉冲;
一个200kHz分频器,用于产生频率为0.1kHz的脉冲;
一个2M分频器,用于产生频率为0.01kHz的脉冲。
可以考虑先用一个20kHz分频器,产生频率为1kHz的脉冲,再利用一个10倍分频器对1kHz脉冲进行分频,产生0.1kHz的脉冲,一个100倍分频器对1kHz脉冲进行分频,产生0.01kHz的脉冲。
同样用到了3个分频器,但是节约了资源。
再考虑具体的实现,在测频率的时候,由于采用输入信号作为时基,以输入信号为时钟,用一个计数器测量在一个时基周期里,输入信号的周期数目,如此就可以得到输入信号的频率。
但是一个时基信号,例如频率为0.01kHz(周期为100ms)的脉冲信号,在整个100ms的周期里,根据占空比,有高电平也有低电平,这就给计数器计数的判断带来了麻烦。
最好是能够产生一个高电平为100ms的脉冲信号作为时基,那么就能够在程序中以“如果时基信号为1”作为判断条件,如果满足条件则计数器计数,方便了程序的书写。
同理,在这个设计中还要产生高电平为10ms和1ms的脉冲信号作为时基。
可以考虑使用状态机来实现这3种时基,因为采用状态机来控制时序很清楚,不容易出错。
状态机用1kHz(周期为1ms)的脉冲信号触发,因为所要生产的时基中,频率最大(周期最小)的就是1kHz的脉冲,要产生高电平为10ms和1ms的脉冲信号,可以采用100个状态的状态机,从状态1,状态2......到状态100.要产生高电平为1ms的脉冲信号,只要在状态99的时候产生高电平,状态100的时候回到低电平即可;
要产生高电平为10ms的脉冲信号,则要在状态90的时候产生高电平,在状态100的时候回到低电平。
需要产生哪个时基得根据此时频率计所在的挡作为判断条件进行控制。
在100个状态中,有很多状态的功能相同的,可以将它们合并。
2.2计数器的设计
各个挡之间的转换应遵循设计要求,要根据在时基有效时间内的计数值进行判断。
计数器可以直接定义成一个整型信号,这样计数器计数(即加1)就十分方便,只要使用语句“计数器<
=计数器+1;
”就可以。
但是这个计数值要作为显示输出,就要将这个计数器用个位、十位、百位分开表示,而且要遵循加法“逢十进一”的规则。
这样可以直接通过7段译码器进行显示。
因为在不同的挡位,小数点的位置是不同的,所以小数点的显示以所在挡为判断条件。
2.3模块的划分
计数器在各个挡被反复应用的,如果在各个挡分别设计计数器,就造成资源的浪费,而且在测周期和测频率的时候,计数器的时候信号和输入信号要进行调换,但是计数功能是一样的,所以将计数器设计成单独的模块。
7段译码器在个位、十位、百位中也都被利用到,因此也将其设计成单独的模块,重复引用就不需要在3个位显示的时候重复书写译码电路了。
另外,计数器的输入信号和时钟信号要通过一个进程来提供。
在测频率时,进程向计数器提供的时钟信号是输入频率计的测量信号,计数器的输入信号是频率计提供的时基;
在测周期时,进程向计数器提供的时钟信号是频率计提供的时基,计数器的输入信号是输入频率计的测量信号。
第三章数字频率计各模块的设计和实现
3.1计数器的设计和实现
--计数器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityfrequencyis
port(treset:
instd_logic;
--异步复位端口
tclk:
--时钟输入
tsig:
--信号输入
tkeep1:
outstd_logic_vector(3downto0);
--计数值个位
tkeep2:
--计数值十位
tkeep3:
outstd_logic_vector(3downto0));
--计数值百位
endentityfrequency;
architectureoneoffrequencyis
signaltcou1:
std_logic_vector(3downto0);
--内部计数值个位
signaltcou2:
--内部计数值十位
signaltcou3:
--内部计数值百位
begin
ctrcou:
process(treset,tclk)--控制计数功能的进程
iftreset='
1'
then
tcou1<
="
0000"
;
tcou2<
tcou3<
else
iftclk'
eventandtclk='
then
iftsig='
then--时基信号高电平为判断条件有效的时候遇到时
--钟上升沿触发
iftcou3="
1010"
tcou3<
--如果百位为10,百位数值不变
iftcou1="
1001"
andtcou2="
andtcou3="
--如果计数值为999
tcou1<
--则计数值百位变成10,十位、个位变成0
elsiftcou1="
--如果百位小于9,十位为9且个位为9的时候
=tcou3+1;
--百位数值加1,十位、个位清零
--如果百位和十位都小于9且个位为9的时候
=tcou2+1;
--个位清零,十位数值加1
elsetcou1<
=tcou1+1;
--其他情况就是个位数值加1
endif;
else–如果时基信号为0,那么判断条件无效
endprocessctrcou;
oputctr:
process(treset,tsig)--控制数值输出的进程
tkeep1<
tkeep2<
tkeep3<
iftsig'
eventandtsig='
0'
--时钟下降沿触发输出各位数值
=tcou1;
tkeep2<
=tcou2;
tkeep3<
=tcou3;
endprocessoputctr;
endone;
3.27段译码器的设计
7段译码器将输入的4位BCD码以7段译码的方式输入。
可以使用一个7位向量来分别表示7段译码器中的7段。
--译码器模块
entitydisplayis
port(data_in:
instd_logic_vector(3downto0);
--输入为4位二进制,范围从0到9
data_out:
outstd_logic_vector(0to3));
--7段译码输出
endentitydisplay;
architectureoneofdisplayis
signalindata:
--内部数值信号
process(data_in)--输入信号作为进程的敏感量触发进程
indata<
=data_in;
caseindatais
when"
=>
data_out<
0001"
0010"
0011"
0100"
0101"
0110"
0111"
1000"
whenothers=>
1111"
endcase;
endprocess;
endone;
3.3数字频率计综合设计
要设计的数字频率计需要3个输入端口,一个脉冲输入端口clk(频率为4.19MHz);
一个异步复位端口rest,用于使系统回到初始状态;
还有一个就是测试信号的输入端口testsignal,用于输入待测试的信号。
该频率计需要7个输出端口,要有一个表示是显示频率还是周期的输出端口unit;
还有3个显示频率值的7段译码输出端口display1,display2和display3,以及3个小数点输出端口dot向量。
--频率计源文件
entitydfreis
port(reset:
clk:
--时钟信号
testsignal:
--测试信号输入端
display1:
outstd_logic_vector(0to3);
display2:
display3:
--3个7段译码器输出
unit:
outstd_logic;
--表示是周期还是频率的信号灯
dot:
outstd_logic_vector(2downto0));
--小数点
endentitydfre;
architectureoneofdfreis
typestateis
(start,judge,count1,count2to89,count90,count91to98,count99,count100);
signalmyfre:
state;
signalfrecou:
integerrange0to99;
--用于状态机中的计数器,计数值从0~99
signalclk1k:
std_logic;
--产生频率为1kHz的脉冲信号
signalcou1k:
integerrange0to2094;
--用于分频的计数器
signalenfre:
--代表时基的脉冲信号
signalflag:
std_logic_vector(2downto0);
--标志信号,1表示10kHz测频挡,2表示100kHz测频挡,3表示1MHz测频挡,0表示测周期挡,4表示溢出
signalkeepcou1:
signalkeepcou2:
signalkeepcou3:
signalttclk:
--输入计数器的时钟信号即时基
signalttsig:
--输入计数器的测试信号
忽略ponentdisplayis--引用7段译码器
data_out:
outstd_logic_vector(0to6)
);
end忽略ponent;
忽略ponentfrequencyis–引用计数器
tclk,tsig:
tkeep1:
tkeep2:
tkeep3:
constrclk1k:
process(reset,clk)--用4.19MHz的脉冲产生频率为1kHz脉冲进程
ifreset='
cou1k<
=0;
clk1k<
='