采用等精度测频原理的数字频率计设计Word文档下载推荐.docx
《采用等精度测频原理的数字频率计设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《采用等精度测频原理的数字频率计设计Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
上图中预置门信号通常为1s。
其内部包括一个同步门电路,用来实现被测频标与被测频率的同步,提高测量精度,减少基本误差。
该部分与清零脉冲协调工作用来控制两个计数器的启动脉冲。
计数器1和计数器2分别用来给频标和被测数字脉冲计数,设在同步门控制结束时计数器1计数N1,计数器2计数N2,假设频标频率为F1,被测频率位Fx,则可写出公式:
Fx/N2=F1/N1;
…………………
(1)
Fx=(F1/N1)*N2……………
(2)
由上两式可以得出如下结论:
1.相对测量误差与频率无关;
2.提高频标频率,可以增大N1,减少测量误差,提高测量精度;
3.选用高稳定度的晶振,可提高测量精度;
4.等精度测频方法测量精度与预置门宽度无关,与被测信号无关。
在该电路中,为了确保频标计数与被测频率完全同步(即被测频率的上升沿开始计数,1s以后,被测频率的下跳沿停止计数),同步门必须由被测信号来控制。
测频时,闸门时间固定为1s,闸门信号是一个0.5Hz的方波,在闸门有效(高电平)期间,对输入的脉冲进行计数,在闸门信号的下降沿时刻,锁存当前的计数值,并且清零所有的频率计数器。
由于闸门时间是1s(0.5Hz方波),所以显示的频率是1s钟更新一次,且显示的内容是闸门下降沿时锁存的值。
由于闸门时间设定为1s,因此这种频率计仅能测出频率大于或者等于1Hz的情况,且频率越高,精度也越高。
实际应用中,频率计的闸门时间是个可变量,当待测频率小于1Hz时,闸门时间就要适当放大。
在设计频率计的时候,八个七段码管最多可以显示99,999,999Hz,因此在设计时用八个4位二进制码(BCD码)来表示,另外还必须有同样的八个4位二进制码来对输入的频率进行计数,在闸门下降沿的时候,将后者的值锁存到寄存器中。
其信号的时序关系如下图2所示:
图2控制信号时序关系
五、实验内容
本实验要完成的任务就是设计一个等精度频率计,需采用直接测频法对待测信号和频标分别进行频率测量,然后依照公式
(2)进行计算处理。
采用直接测频法进行频率测量时,闸门时间为1s(通过对系统时钟进行分频得到),在闸门为高电平期间,对输入的频率进行计数,当闸门变低的时候,记录当前的频率值,并将频率计数器清零,频率的显示每过2秒刷新一次。
被测频率通过一个拨动开关来选择是使用系统中的数字时钟源模块的时钟信号还是从外部输入数字信号进行频率测量。
当拨动开关为高电平时,测量从外部输入的数字信号,否则测量系统数字时钟信号模块的数字信号。
直接测频的实现框图如下:
图3直接测频实现框图
其中,系统时钟为24MHZ。
一、调试后程序代码
1、二选一开关
libraryieee;
useieee.std_logic_1164.all;
entitysel2is
port(a,b,s:
instd_logic;
c:
outstd_logic);
Sel2
endentity;
a
architecturebehaveofsel2isbc
begins
c<
=(aands)or(band(nots));
endbehave;
2、系统时钟的24分频(产生1MHZ的时钟信号)
useieee.std_logic_unsigned.all;
entitypin1mhz_1is
port(clkin:
clkout:
architecturebehaveofpin1mhz_1is
begin
process(clkin)
Pin1mhz_1
variablecnttemp:
integerrange0to23;
clkinclkout
begin
ifclkin='
1'
andclkin'
eventthen
ifcnttemp=23thencnttemp:
=0;
elsifcnttemp<
12thenclkout<
='
;
elseclkout<
0'
endif;
cnttemp:
=cnttemp+1;
endif;
endprocess;
3、千分频(由1MHZ分频产生1KHZ时钟和1HZ时钟)
entitypin1hz_1is
Pin1hz_1
architecturebehaveofpin1hz_1is
integerrange0to999;
ifcnttemp=999thencnttemp:
500thenclkout<
4、产生各种控制信号(计数允许、计数清零、锁存控制)
entitytestctlis
port(clk:
testen:
outstd_logic;
clr_cnt:
load:
testen
endtestctl;
clkclr_cnt
architecturebehaveoftestctlis
signaldiv2clk:
std_logic;
load
signalclr:
signalloadcnt:
process(clk)istestctl
ifclk'
eventandclk='
then
div2clk<
=notdiv2clk;
process(clk,div2clk)
ifclk='
anddiv2clk='
clr<
elseclr<
load<
testen<
=div2clk;
clr_cnt<
=clr;
5、十进制计数
entitycnt10is
clr:
ena:
cq:
outintegerrange0to15;
clkcq
carry_out:
architecturebehaveofcnt10isclrcarry_out
signalcqi:
integerrange0to15;
beginena
process(clk,clr,ena)
begincnt_10
ifclr='
cqi<
elsifclk'
then
ifena='
ifcqi=9then
=1;
elsecqi<
=cqi+1;
process(cqi)
begin
carry_out<
elsecarry_out<
cq<
=cqi;
6、数据锁存(32位)
din[31..0]
entityreg32bisdout[31..0]
port(load:
din:
instd_logic_vector(31downto0);
dout:
outstd_logic_vector(31downto0));
reg32b
architecturebehaveofreg32bis
process(load,din)
ifload='
andload'
dout<
=din;
7数码显示
entitydiaplayis
port(int0,int1,int2,int3,int4,int5,int6,int7:
instd_logic_vector(3downto0);
lout7:
outstd_logic_vector(6downto0);
sel:
outstd_logic_vector(2downto0);
clk:
instd_logic);
architecturebehaveofdiaplayisint0[3..0]lout7[6..0]
signals:
std_logic_vector(2downto0);
…
signallout4:
std_logic_vector(3downto0);
int7[3..0]sel[2..0]
process(clk)clk
ifclk'
thendisplay
if(s="
111"
)then
s<
="
000"
elses<
=s+1;
sel<
=s;
process(s)
casesis
when"
=>
lout4<
=int7;
001"
=int6;
010"
=int5;
011"
=int4;
100"
=int3;
101"
=int2;
110"
=int1;
=int0;
whenothers=>
null;
endcase;
caselout4is
0000"
lout7<
1111110"
0001"
0110000"
0010"
1101101"
0011"
1111001"
0100"
0110011"
0101"
1011011"
0110"
1011111"
0111"
1110000"
1000"
1111111"
1001"
1110011"
whenothers=>
二、直接测频原理图设计
1、原理图设计原理来源于预习部分图3;
2、将VHDL设计的功能模块转换成可供原理图调用的图元文件
在各模块设计界面迪纳吉File\create/update\createsymbolfileforcurrentfile,生成后缀为.bsf的图元文件后,将各工程中所有的除名为db的文件夹外的文件全部复制到原理图所在的工程文件夹下,然后就可以在元件查找的地方的project根目录下找到创建的元件,从而调用之;
3、连好线,做好相关其他处理后可得到如下的直接测频原理图。
三、等精度测频计的设计
原理图
待测FXlout4[6..0]
频标F1b
s
VCCsel[2..0]
clk
alout7[6..0]
b
sel[2..0]
GNDs