量程自动转换数字频率计的设计.docx
《量程自动转换数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《量程自动转换数字频率计的设计.docx(23页珍藏版)》请在冰豆网上搜索。
![量程自动转换数字频率计的设计.docx](https://file1.bdocx.com/fileroot1/2023-3/30/079d0ec0-403a-4c93-9495-dd660fd384a8/079d0ec0-403a-4c93-9495-dd660fd384a81.gif)
量程自动转换数字频率计的设计
西北师范大学知行学院
EDA课程设计说明书
系别
专业班级
学生姓名
学号
指导教师
量程自动转换数字频率计的设计
一、设计目标:
A.设计一个3位十进制数字式频率计,其测量范围为1MHz,量程分10kHz,100kHz和1MHz三档(最大读数分别为9.99kHz,99.9kHz,999kHz)。
被测信号应是一符合CMOS电路要求的脉冲或正弦波。
B.要求量程可根据被测量的频率大小自动转换,即当计数器溢出时,产生一个换挡信号,让
整个计数时间减少为原来的1/10,从而实现换挡功能。
C.要求实现溢出报警功能,即当频率高于999kHz时,产生一个报警信号,点亮LED灯,从而
实现溢出报警功能。
D.小数点位置随量程变化自动移位。
E.采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数结果,并将
此显示结果保持到下一次计数结束。
显示时间应不小于1秒。
、设计思路及实现方案:
1.频率计的工作原理:
常用的测量频率的方法有两种,一种是测周期法,一种是测频率法。
测周期法需要有基准系统时钟频率Fs,在待测信号一个周期Tx内,记录基准系统时钟频
率的周期数Ns,则被测频率可表示为:
Fx=Fs/Ns
测频率法就是在一定时间间隔Tw(该时间定义为闸门时间)内,测得这个周期性信号的重
复变换次数为Nx,则其频率可表示为:
Fx=Nx/Tw
本设计采用的是直接测频率的方法。
2.频率计的原理框图:
频率计的系统设计可分为3位十进制计数模块,闸门控制模块,译码显示模块,可自动
换挡模块和分频模块。
其原理框图如下:
其中,可自动换挡模块为闸门控制模块提供3个挡,也就是三个测量范围的基准时钟信
号,通过计数器的最高位的溢出情况来判定工作在第几挡。
闸门控制模块根据基准时钟信号产生基准时钟信号周期2倍的周期使能信号,随后为锁
存器产生一周期性地锁存信号,再然后为计数模块产生一周期性的清零信号。
3位十进制计数模块在使能信号和清零信号的控制下对被测信号的波形变化进行计数,若产生溢出则为自动换挡模块输出一换挡信号。
译码显示模块显示被测信号的频率。
三、设计步骤
1.分频模块:
输入信号为4MHZ的高频脉冲,经过分频器后得到1KHZ的脉冲。
分频器的代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenping2is
port(
clk:
instd_logic;
clk_out:
outstd_logic);
endfenping2;
architecturebehavioroffenping2is
begin
process(clk)
variablecount:
integerrange0to1999;
variablex:
std_logic;
begin
ifclk'eventandclk='1'then
ifcount<1999then
count:
=count+1;
else
count:
=0;
x:
=notx;
endif;
endif;
clk_out<=x;
endprocess;
endarchitecturebehavior;
模块说明:
clk为4MHZ时钟脉冲输入端,clk_out为1KHZ脉冲输出端。
由于输入为高频信号,不易仿真且代码编译无误,这里没有给出时序波形图。
经软件编译后,得到模块为:
Jfenping2u
IL
elkclk_out
□
E
instB
n
□
r)
2.3位十进制计数模块:
3位十进制计数模块包含3个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号
产生的脉冲进行计数,十进制计数器具有计数使能、清零控制和进位输出功能。
用于计数的时间间隔(计数允许周期T)由闸门控制模块的控制信号发生器所产生的使能信号来控制,计数
使能信号也在闸门控制模块中产生。
自动换挡模块决定计数器读数的单位。
1位十进制计数器的VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycount10is
port(CLK,RST,EN:
instd_logic;
CQ:
outstd」ogic_vector(3downto0);
COUNT:
outstd_logic);
endcount10;
architecturebehavofcount10is
begin
process(CLK,RST,EN)
variableCQ1:
std」ogic_vector(3downto0);
begin
ifRST='1'thenCQ1:
=(others=>'0');
elsifCLK'eventandCLK='1'then
ifEN='1'then
ifCQ1<9thenCQ1:
=CQ1+1;
elseCQ1:
=(others=>'0');
endif;
endif;
endif;
ifCQ1=9thenCOUNT<='1';
elseCOUNT<='0';
endif;CQ<=CQ1;
endprocess;
endbehav;
以上源程序编译成功后,生成计数器模块如下:
:
countIO
1
k
i'
1
I-
CLK
CQ[3..O]
i-'
1-
RST
COUNT
i,
i-
1
EN
!
inst6
3位十进制计数模块为:
3•闸门控制模块:
以基准信号的周期为一秒为例,频率测量的基本原理是计算一秒内待测信号的脉冲个数,这就要求能产生一个周期为2秒,占空比为50%的周期信号TSTEN。
用这个信号作为计数器的
EN输入端,使其计数时间正好为1秒。
当TSTEN为高电平时,计数开始,低电平时,计数停
止。
在计数器停止期间,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器REG12将之
前的计数结果存入锁存器中,并由显示模块将其显示出来。
设置锁存器是为了让显示稳定,不会因为周期性的清零信号使得数值不断闪烁。
锁存之后需有一清零信号CLR_CNT将计数器清
零,为下一秒的计数操作做准备。
闸门控制模块的VHDL源程序如下:
libraryieee;
useieee.std」ogic_1164.all;
useieee.std_logic_unsigned.all;
entitytestctlis
port(clk:
instd_logic;
clr_cnt:
outstd_logic;
tsten:
outstd_logic;
load:
outstd_logic);
endtestctl;
architecturebehavoftestctlis
signala:
std_logic;
begin
process(clk)
begin
ifclk'eventandclk='1'then
a<=nota;
endif;
endprocess;
process(clk,a)
ifa='0'andclk='0'then
clr_cnt<='1';
elseclr_cnt<='0';
endif;
endprocess;
load<=nota;
tsten<=a;
endbehav;
时序仿真结果如下:
-1ps
320.0ns
1
640.0ns
i
960.0ns
i
1.28us
1
1.6us
i
Name
15.08ns
15,075nsJ
1^0
elk
A0
._TLrLrLrLjm_nJTWJWTW_rLrLnjn3
U1
…id
A1
1irriiIn
1I111
inin
1
inin
11—11
load
A1
-—1
111
1■丄””
1111-]——1——■11—1——
1
iiiiii
-1—1—:
11-1—1—:
<^3
tsten
A0
111
111
111
丨11
111
111
111
11111Illi
11111Illi
11111111Illi
11111Illi
11111Illi
11111Illi
1i111Illi
iiiiiiii
iiiiip<■iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiii
iiiiii
ii
iiiiii
iiiiii
iiiiii
iiiiii
iiiiii
11111111
11111'■'
11111111
I1111111
11111111
I111111I
iiiiiiii
i■iiiiii
iiiL
iiiiiiii
iiiiiiii
iiiiiiii
iii■iiii
111!
1111
编译后生成的模块为:
wr■・・■■anri■■man■・■■■■■■■atin■
!
testctl
■
i—elkclrent
祐ten
Iload
instil
其中,elk为基准信号输入端,clr_cnt为清零信号,tsten为计数使能信号,load为锁存允许信号。
3.可自动换挡模块:
本设计通过控制基准时钟信号来实现量程的自动转换。
在第一个计数器的CLK端接一周期为0.001s(1KHz)的时钟信号,其测量范围为
100-999000Hz,为2挡;在第一个计数器的COUNT端将会得到周期为0.01s的信号,即为1
挡,其测量范围为10-99900HZ;在第二个计数器的COUNT端将会得到0.1s的信号,即为0
挡,其测量范围为0-9990HZ。
这里还需要一个3选1选择器来选择第几个计数器的COUNT端作为基准时钟信号。
3
选1选择器可根据3位十进制计数模块的溢出情况来作为选择标准。
3选1选择器的VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitymux31is
port(a:
instd_logic_vector(3downto0);
y:
outstd_logic;
o:
outstd_logic;
inputO:
instd」ogic;
input1:
instd」ogic;
input2:
instd_logic;);
endmux31;
architecturebehavofmux31is
begin
process(inputO,input1,input2,a)
begin
caseais
when"0000"=>y<=inputO;o<='O'
when"0001"=>y<=inputl;o<='0'
when"0010"=>y<=input2;o<='0'
whenothers=>y<='0';o<='1';
endcase;
endprocess;
endbehav;
生成的模块为:
仿真波形为:
当输入为0000时:
当输入为0001时:
L..
0]
-i
11
1I
1■■
1■
■i
1■■
11
11
■■■
1
11
1■
1■1
11
ii
1■1
■1
11
■■i
1
_rL_r-L_rLTLT-irLTir
J-LTL
LTLTTmirvi
_n
_R
LIT.
LT
JInir
■LTL
J-LRurn
f-LTTJ
-FLTLnrLTLTLn
-L_nLTLTLTLTL
_r
ITm
■LTLTTJi_n_rLnunirunn
-FL
JU
n._RIT
-TL
-FU
UTLJ
r
■L
LT
—n
押
□
"L_r
u
n
11
1
J
1
11
111
1
1
11
-n
11
11
W
111
:
JPzISO.Dns:
320.0hg480.0n匸640.0ns800.0n匸
|Iiii
15.0T5ns
J
A
Nam*
15.0E
^0
Aa
*【j
|>1
-1L3]
Ali
-aF2]
Ai
叫
711
A1
1^4
-aLo]
k
T
inpntO
A1
*
in|iiutl
Ai
□□
X13
input2
A
±>S
C
ki
疔9
y
Ali
当输入为0010时:
640.Dns
■
8Q0.0n
3psI.6C.0ns
15ATThe
当输入为0011时:
厂
[1]
.ru-_fLTLTTLTL
rmrLjmrLrLrTrLrLjmrLruirLrLrLTLnrLrLrL
iiiiiai
i_nmnnnrLTLTLrL
jxrnnruu
—
1ll■■1
iI■ai
T_nU
TLTLT
irLTirL
1_-
i_rnr
rnnrr
160.03iz
■
nn
320.0
ii
nn
ILS
nnnn
480-0ns
i
n
S40.
nn
0TL3.
nr
@00.(
■
inn
)ns1
nr
花0.D
i
48D0ns
■
<
;I
L
1h1
■■
■1
■1
■1
1■1
111
111
_n_ru
-ruin
lULTLH
n_n_r
-ruin
-TLTLrLn
in
rr
JTTL
_n
IT
JTT
_n
11
LTU
_TL
JTT
UTT
cltl—
LTLTLT
mrLTLT
i_rjunru■ltultl
_^L_n_r
111■口rLTLTLTLn
III1■1
IT
LR
LTU
G1
i_n
r.「mr
_TL
11w
1fi1
■RrLrLn_rLrLrLrLrLn_rLrLrLrLrLn_rLrLrLrLrLrLrLrLrLrLrLrLruuLTLrL
』11
ns
Jps
15-075ns
J
15.UT5ns
-J-LTTTTTTTTTTTTTTTT-rLTTTTTT-rLrLrLrT-TT-rT-rL
iTTTrLTTjnrTj-LiTJTJ-LrTrLrTjnrTjTJLm-LrTrLTTrLrTrT
■LrLrLrLrLrLrLrLrLrLrLrLrLTLrLrLrLrLrLrLFUiJLrLrLrLrLrLrLrLrLrLru
可以看到,设计完全符合要求,o端可以作为量程溢出标志。
综上,量程自动转换模块为:
4.译码显示模块:
译码显示模块的设计分为显示锁存器的设计,七段数码显示译码器的设计和小数点显示模块的设计3部分。
显示锁存器是在计数结束后,利用load信号的上升沿把最新计数结
果保存起来。
其源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityreg12is
port(
load:
instd_logic;
dinO,din1,din2:
instd_logic_vector(3downto0);dout0,dout1,dout2:
outstd」ogic_vector(3downto0));
endreg12;
architecturebehavofreg12is
begin
process(load)
begin
ifload'eventandload='1'then
dout0<=din0;
dout1<=din1;dout2<=din2;endif;endprocess;endarchitecturebehav;
生成的模块为:
reg12
!
load
dcutOI3..O]
I
din0(3..0I
dout1(3.0)
—
dlnl[3..O]
dout2[30]
din2I3..O]
仿真结果为:
when"0001"=>tmp<="1001111";
Q
510
N«ne
汕$Ld
nln2
didi
sa
touututdodo
□E
矽2S回doul2
Value
15.BE
1X
丄札
an
A[1
1U.Uns
L>J
X
-
......
-
au.uns.
1UU.Ua
I[alX
[15]X[0]X[15]X[t>]X[15]x[OJ)
{~ns]~~
([o]「[i
in~~io^i'jcns]~\
c
厂X⑹玄〔15]厂
ns
Fl
f[0]
[15]
」
1
L
J
L
七段数码显示译码器的vhdl源程序如下:
libraryieee;
useieee.std」ogic_1164.all;
entityseg7is
port(dat:
instd_logic_vector(3downto0);tmp:
outstd_logic_vector(6downto0));endseg7;
architecturearcofseg7is
beginprocess(dat)begin
casedatis
when"0000"=>tmp<="0000001";
when"0010"=>tmp<="0010010";
when"0011"=>tmp<="0000110";
when"0100"=>tmp<="1001100";
when"0101"=>tmp<="0100100";
when"0110"=>tmp<="0100000";
when"0111"=>tmp<="0001111";
when"1000"=>tmp<="0000000";
when"1001"=>tmp<="0000100";
when"1010"=>tmp<="0001000";
when"1011"=>tmp<="1100000";
when"1100"=>tmp<="0110001";
when"1101"=>tmp<="1000010";
when"1110"=>tmp<="0110000";
when"1111"=>tmp<="0111000";endcase;
endprocess;
endarc;
生成的模块为:
Jseg7u
_L-
J
u
h
1dat[3.0]tmp(60]1
instIO
:
小数点显示模块的源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydotis
port(dang_in:
instd_logic_vector(3downto0);dang:
outstd_logic_vector(2downto0));enddot;
architectureoneofdotis
begin
process(dang_in)
begincasedang_iniswhen"OOOO"=>dang<="100";
when"0001"=>dang<="010";
when"0010"=>dang<="001";whenothers=>dang<="111";
endcase;
endprocess;
endone;
经编译后生成的模块为:
dang_in[30]dang[20]
instZ
四、结论