数字频率计的设计Word下载.docx
《数字频率计的设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字频率计的设计Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
闸门时间为1S时,最大读数为999.999KHz
第二档:
闸门时间为0.1S时,最大读数为9999.99KHz
第三档:
闸门时间为0.01S时,最大读数为99999.9KHz。
4、显示工作方式:
a、用六位BCD七段数码管显示读数。
b、采用记忆显示方法
c、实现对高位无意义零的消隐。
第三章设计思路
1.频率测量:
所谓“频率”,就是周期性信号在单位时间(秒)内变化的次数。
若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:
f=N/T。
计数式数字频率正是依照公式f=N/T所表达的频率的定义,进行频率测量的,其工作原理如下图所示。
由上图可知,要测量频率首先应该产生一个时基信号,既f=N/T中的T,除此之外还需要计数电路来测量,一个时基信号内被测信号变化的次数N,
除了以上两个基础电路外,还需要门控电路和闸门信号来实现计数控制。
2.结果显示
设计要求测量结果要被测结果用数码管显示,同时还要有闸门使能显示和溢出显示。
要用数码管显示数据,首先应该对数据进行译码,同时要进行显示还需要显示控制电路既扫描显示电路:
扫描控制和显示译码电路
实验板数码管显示点路
3总体设计
由以上分析给出系统总体设计框图
第四章模块设计及仿真
由上节分析,采用模块化设计,系统可分为:
分频器,闸门选择电路,门控电路,计数器,锁存器和显示译码电路。
1分频器
该电路将产生四个不同频率的信号输出。
采用实验板上的8MHZ晶振作为基准源,对基准信号计数,根据计数值不同产生四路不同频率的信号输出分别为1HZ,10HZ和100HZ,1KHZ。
原程序如下见附录。
分频器结构图
仿真结果如下:
通过对仿真结果的分析,该模块能够正常产生四个信号,且频率大小正确。
该模块可以正常工作。
2.闸门选择电路
在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。
原程序见附录:
结构图如图
仿真结果如下图:
通过对仿真结果的分析,该模块能够正常产生四个信号,且频率大小正
确。
3门控电路
在此模块中有一个输入端和两个输出端,输入端为上面的闸门选择器输出的频率,两个输出端分别为计数器是能控制信号(锁存器控制信号),和计数器清零信号。
源程序见附录:
结构图如右
仿真图如下
4.计数器
该模块实现的功能是对输入信号脉冲的计数,并正确的输出结果和溢出。
使用上面的门控信号产生的gat信号控制计数器的使能端,以实现计数器的定时计数。
该模块是使用六个十进制计数器同步并联而成的,首先我们设计用于并联的十进制计数器。
仿真结果及结构图如下
5.锁存器
由于前面的计数器的输出为六组四位二进制数和一个溢出信号,所以我们使用的锁存器也使用六个四位锁存器和一个一位锁存器。
锁存器使用下降沿锁存,即当计数器的使能信号变为无效的一瞬间我们令锁存器将数据锁存。
四位锁存器级联后的结构图
四位锁存器结构图
四位锁存器的原代码见附录:
6.显示译码电路
该模块实现的是对锁存器锁存的数据进行处理并显示输出,以及小数点的不同闸门的输出显示,以及电路板上七段显示译码管的扫描信号输出。
其中对锁存数据的处理包括溢出有效时的数据消除,和对高位无意义零的自动消隐。
首先我们编写小数点控制的源文件代码:
仿真图如下:
第五章:
硬件实现与调试
下载过程:
光标移至【GenerateProgramingFile】后单击鼠标右键,然后单击【Properties】在打开的对话框的左侧栏选中【ConfigurationOptions】将右侧的UnusedIOBPins这一项改为PullUp,单击OK。
在界面的左下角双击【GenerateProgramingFile】,软件将自动对整个系统进行编译并生成可执行文件。
将弹出的对话框关掉,双击【GenerateProm,ACE,orJTAGFile】在弹出的对话框中点击Finish,在随后出现的对话框中选择生成的可执行文件,然后点击打开,在随后的对话框中点击Bypass。
右键单击左边图标选择Program,在随后的对话框中单击OK,文件将自动下载到开发板上,成功后,接入函数发生器进行测试。
连接好函数发生器后,设定好了函数发生器的输出信号电平(3.3Vpp),方波,1.6V偏移,就可以进行使用了。
最后结果显示程序工作正常,读数清晰稳定,完全符合开始时的要求。
第六章:
总结
通过这次实验,实现了要求的10—100MHz的频率测量范围,也熟悉了VHDL语言的各种编程结构,以及ISE软件的使用规则。
但是过程中也遇到了诸多的难题,比如程序的书写格式错误,以及程序功能结构不能满足要求等,在这里要感谢老师的教导,在老师的指导下基本都克服了这些问题。
总体说来,这次实验还是收获颇丰。
第七章:
附录
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfrequency_meteris
Port(clk_48MHz,clear:
inSTD_LOGIC;
sw:
inSTD_LOGIC_VECTOR(2downto0);
frequency_in:
nCS,overout,led_gate:
outSTD_LOGIC;
Dig:
outSTD_LOGIC_VECTOR(2downto0);
Seg:
outSTD_LOGIC_VECTOR(6downto0);
dp:
outSTD_LOGIC);
endfrequency_meter;
architectureBehavioraloffdivis
signalcnt:
integerrange0to(ratio-1):
=0;
begin
process(clkin)
begin
iffalling_edge(clkin)then
cnt<
=cnt+1;
clkout<
='
0'
;
ifcnt=(ratio-1)then
cnt<
clkout<
1'
endif;
endif;
endprocess;
endBehavioral;
architectureBehavioralofcounteris
signalcount:
std_logic_vector(3downto0):
="
0000"
begin
process(rst,clk)
begin
ifrst='
then
count<
="
elsifclk'
eventandclk='
ifcarry_in='
ifcount<
"
1001"
count<
=count+1;
else
endif;
else
null;
endprocess;
count_out<
=count;
carry_out<
whencarry_in='
andcount="
else'
architectureBehavioraloffrequency_meteris
COMPONENTfdiv
GENERIC(
ratio:
integer:
=0
);
PORT(
clkin:
INstd_logic;
clkout:
OUTstd_logic
ENDCOMPONENT;
componentcounteris
port(rst,clk:
instd_logic;
carry_in:
carry_out:
outstd_logic;
count_out:
outstd_logic_vector(3downto0));
endcomponentcounter;
signalgate,latch,reset:
std_logic;
signalcarry_1,carry_2,carry_3,carry_4,carry_5,carry_6:
std_logic;
signalover1,led_gate1:
signalclk_1kHz,clk_100Hz,clk_10Hz,clk_1Hz,Bsignal:
STD_LOGIC;
signalG1,G2:
std_logic:
='
signalsel:
STD_LOGIC_VECTOR(2downto0):
000"
signalfval1,fval2,fval3,fval4,fval5,fval6,data:
STD_LOGIC_VECTOR(3downto0);
signalresult1,result2,result3,result4,result5,result6:
nCS<
U1:
fdiv
GENERICMAP(ratio=>
48000)
PORTMAP(
clkin=>
clk_48MHz,
clkout=>
clk_1kHz
);
U2:
10)
clk_1kHz,
clk_100Hz--open
U3:
clk_100Hz,
clk_10Hz
U4:
clk_10Hz,
clk_1Hz
U5:
counter
Portmap(
rst=>
reset,
clk=>
frequency_in,
carry_in=>
gate,
carry_out=>
carry_1,
count_out=>
result1
);
U6:
carry_2,
result2
U7:
carry_3,
result3
U8:
carry_4,
result4
U9:
carry_5,
result5
U10:
carry_6,
result6
process(sw,clk_100Hz,clk_10Hz,clk_1Hz)
caseswis
when"
011"
=>
Bsignal<
=clk_1Hz;
101"
=clk_10Hz;
110"
=clk_100Hz;
whenothers=>
endcase;
process(Bsignal)
ifrising_edge(Bsignal)then
G1<
=notG1;
iffalling_edge(Bsignal)then
G2<
gate<
=G1;
latch<
=G2;
reset<
=(notBsignal)and(notG1)and(G2);
process(clk_1kHz)
iffalling_edge(clk_1kHz)then
sel<
=sel+1;
ifsel="
sel<
process(sel,fval1,fval2,fval3,fval4,fval5,fval6)
caseselis
data<
=fval1;
001"
=fval2;
010"
=fval3;
=fval4;
100"
=fval5;
=fval6;
Dig<
=sel;
process(data)
Seg<
-------"
casedatais
Seg<
0000001"
0001"
1001111"
0010"
0010010"
0011"
0000110"
0100"
1001100"
0101"
0100100"
0110"
0100000"
0111"
0001111"
1000"
0000000"
0000100"
null;
process(sel,sw)
if(sw="
andsel="
)
or(sw="
then
dp<
else
process(sw)
if(sw="
)or(sw="
led_gate1<
elsif(sw="
111"
)
led_gate1<
endif;
process(reset,frequency_in)
ifreset='
over1<
elsifrising_edge(frequency_in)then
over1<
=carry_6orover1;
process(latch)
ifrising_edge(latch)then
overout<
=notover1;
led_gate<
=led_gate1;
fval1<
=result1;
fval2<
=result2;
fval3<
=result3;
fval4<
=result4;
fval5<
=result5;
fval6<
=result6;