量程自动转换数字频率计的设计Word下载.docx
《量程自动转换数字频率计的设计Word下载.docx》由会员分享,可在线阅读,更多相关《量程自动转换数字频率计的设计Word下载.docx(23页珍藏版)》请在冰点文库上搜索。
![量程自动转换数字频率计的设计Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/12/ce71c9d2-0e32-43c5-b6b6-b5fac4a757e4/ce71c9d2-0e32-43c5-b6b6-b5fac4a757e41.gif)
variablex:
std_logic;
ifclk'
eventandclk='
1'
then
ifcount<
1999then
count:
=count+1;
else
=0;
x:
=notx;
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源程序如下:
entitycount10is
port(CLK,RST,EN:
CQ:
outstd」ogic_vector(3downto0);
COUNT:
outstd_logic);
endcount10;
architecturebehavofcount10is
process(CLK,RST,EN)
variableCQ1:
std」ogic_vector(3downto0);
ifRST='
thenCQ1:
=(others=>
'
0'
);
elsifCLK'
eventandCLK='
then
ifEN='
ifCQ1<
9thenCQ1:
=CQ1+1;
elseCQ1:
ifCQ1=9thenCOUNT<
='
;
elseCOUNT<
CQ<
=CQ1;
endbehav;
以上源程序编译成功后,生成计数器模块如下:
:
countIO
1
k
i'
I-
CLK
CQ[3..O]
i-'
1-
RST
COUNT
i,
i-
EN
!
inst6
3位十进制计数模块为:
3•闸门控制模块:
以基准信号的周期为一秒为例,频率测量的基本原理是计算一秒内待测信号的脉冲个数,这就要求能产生一个周期为2秒,占空比为50%的周期信号TSTEN。
用这个信号作为计数器的
EN输入端,使其计数时间正好为1秒。
当TSTEN为高电平时,计数开始,低电平时,计数停
止。
在计数器停止期间,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器REG12将之
前的计数结果存入锁存器中,并由显示模块将其显示出来。
设置锁存器是为了让显示稳定,不会因为周期性的清零信号使得数值不断闪烁。
锁存之后需有一清零信号CLR_CNT将计数器清
零,为下一秒的计数操作做准备。
闸门控制模块的VHDL源程序如下:
useieee.std」ogic_1164.all;
entitytestctlis
port(clk:
clr_cnt:
outstd_logic;
tsten:
load:
endtestctl;
architecturebehavoftestctlis
signala:
std_logic;
a<
=nota;
process(clk,a)
ifa='
andclk='
clr_cnt<
='
elseclr_cnt<
load<
=nota;
tsten<
=a;
时序仿真结果如下:
-1ps
320.0ns
640.0ns
i
960.0ns
1.28us
1.6us
Name
15.08ns
15,075nsJ
1^0
elk
A0
._TLrLrLrLjm_nJTWJWTW_rLrLnjn3
U1
…id
A1
1irriiIn
1I111
inin
11—11
load
-—1
111
1■丄””
1111-]——1——■11—1——
iiiiii
-1—1—:
11-1—1—:
<
^3
tsten
丨11
11111Illi
11111111Illi
1i111Illi
iiiiiiii
iiiiip<
■iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
ii
11111111
11111'
■'
I1111111
I111111I
i■iiiiii
iiiL
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源程序如下:
entitymux31is
port(a:
instd_logic_vector(3downto0);
y:
o:
inputO:
instd」ogic;
input1:
input2:
endmux31;
architecturebehavofmux31is
process(inputO,input1,input2,a)
caseais
when"
0000"
=>
y<
=inputO;
o<
O'
0001"
=inputl;
0'
0010"
=input2;
whenothers=>
y<
o<
endcase;
生成的模块为:
仿真波形为:
当输入为0000时:
当输入为0001时:
L..
0]
-i
11
1I
1■■
1■
■i
■■■
1■1
■1
■■i
_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
—n
押
"
L_r
u
J
-n
W
JPzISO.Dns:
320.0hg480.0n匸640.0ns800.0n匸
|Iiii
15.0T5ns
A
Nam*
15.0E
^0
Aa
*【j
|>
-1L3]
Ali
-aF2]
Ai
叫
711
1^4
-aLo]
T
inpntO
*
in|iiutl
□□
X13
input2
±
>
S
C
ki
疔9
y
当输入为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
ILS
nnnn
480-0ns
S40.
0TL3.
nr
@00.(
inn
)ns1
花0.D
48D0ns
I
L
1h1
■■
_n_ru
-ruin
lULTLH
n_n_r
-TLTLrLn
in
rr
JTTL
IT
JTT
11
LTU
_TL
UTT
cltl—
LTLTLT
mrLTLT
i_rjunru■ltultl
_^L_n_r
111■口rLTLTLTLn
III1■1
LR
G1
i_n
r.「mr
11w
1fi1
■RrLrLn_rLrLrLrLrLn_rLrLrLrLrLn_rLrLrLrLrLrLrLrLrLrLrLrLruuLTLrL
』11
ns
Jps
15-075ns
15.UT5ns
-J-LTTTTTTTTTTTTTTTT-rLTTTTTT-rLrLrLrT-TT-rT-rL
iTTTrLTTjnrTj-LiTJTJ-LrTrLrTjnrTjTJLm-LrTrLTTrLrTrT
■LrLrLrLrLrLrLrLrLrLrLrLrLTLrLrLrLrLrLrLFUiJLrLrLrLrLrLrLrLrLrLru
可以看到,设计完全符合要求,o端可以作为量程溢出标志。
综上,量程自动转换模块为:
4.译码显示模块:
译码显示模块的设计分为显示锁存器的设计,七段数码显示译码器的设计和小数点显示模块的设计3部分。
显示锁存器是在计数结束后,利用load信号的上升沿把最新计数结
果保存起来。
其源程序如下:
entityreg12is
dinO,din1,din2:
dout0,dout1,dout2:
outstd」ogic_vector(3downto0));
endreg12;
architecturebehavofreg12is
process(load)
ifload'
eventandload='
then
dout0<
=din0;
dout1<
=din1;
dout2<
=din2;
endif;
endprocess;
endarchitecturebehav;
reg12
dcutOI3..O]
din0(3..0I
dout1(3.0)
dlnl[3..O]
dout2[30]
din2I3..O]
仿真结果为:
when"
tmp<
="
1001111"
Q
510
N«
ne
汕$Ld
nln2
didi
sa
touututdodo
□E
矽2S回doul2
Value
15.BE
1X
丄札
an
A[1
1U.Uns
L>
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]厂
Fl
f[0]
[15]
」
七段数码显示译码器的vhdl源程序如下:
entityseg7is
port(dat:
tmp:
outstd_logic_vector(6downto0));
endseg7;
architecturearcofseg7is
beginprocess(dat)begin
casedatis
when"
0000001"
0010010"
0011"
0000110"
0100"
1001100"
0101"
0100100"
0110"
0100000"
0111"
0001111"
1000"
0000000"
1001"
0000100"
1010"
0001000"
1011"
1100000"
1100"
0110001"
1101"
1000010"
1110"
0110000"
1111"
0111000"
endcase;
endarc;
Jseg7u
_L-
h
1dat[3.0]tmp(60]1
instIO
小数点显示模块的源程序如下:
useieee.std_logic_1164.all;
entitydotis
port(dang_in:
dang:
outstd_logic_vector(2downto0));
enddot;
architectureoneofdotis
process(dang_in)
begincasedang_iniswhen"
OOOO"
dang<
100"
when"
010"
001"
whenothers=>
111"
endone;
经编译后生成的模块为:
dang_in[30]dang[20]
instZ
四、结论