量程自动转换数字频率计的设计.docx

上传人:b****5 文档编号:11843915 上传时间:2023-04-05 格式:DOCX 页数:23 大小:141.06KB
下载 相关 举报
量程自动转换数字频率计的设计.docx_第1页
第1页 / 共23页
量程自动转换数字频率计的设计.docx_第2页
第2页 / 共23页
量程自动转换数字频率计的设计.docx_第3页
第3页 / 共23页
量程自动转换数字频率计的设计.docx_第4页
第4页 / 共23页
量程自动转换数字频率计的设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

量程自动转换数字频率计的设计.docx

《量程自动转换数字频率计的设计.docx》由会员分享,可在线阅读,更多相关《量程自动转换数字频率计的设计.docx(23页珍藏版)》请在冰豆网上搜索。

量程自动转换数字频率计的设计.docx

量程自动转换数字频率计的设计

西北师范大学知行学院

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

四、结论

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1