基于FPGA的数字频率计方案设计书报告.docx
- 文档编号:6698297
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:29
- 大小:121.57KB
基于FPGA的数字频率计方案设计书报告.docx
《基于FPGA的数字频率计方案设计书报告.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字频率计方案设计书报告.docx(29页珍藏版)》请在冰豆网上搜索。
基于FPGA的数字频率计方案设计书报告
班级:
测控一班
学号:
2907101002
姓名:
李大帅
指导老师:
李颖
基于FPGA的数字频率计设计报告
一、系统整体设计
设计要求:
1、被测输入信号:
方波
2、测试频率范围为:
10Hz~100MHz
3、量程分为三档:
第一档:
闸门时间为1S时,最大读数为999.999KHz
第二档:
闸门时间为0.1S时,最大读数为9999.99KHz
第三档:
闸门时间为0.01S时,最大读数为99999.9KHz。
4、显示工作方式:
a、用六位BCD七段数码管显示读数。
b、采用记忆显示方法
c、实现对高位无意义零的消隐。
系统设计原理:
所谓“频率”,就是周期性信号在单位时间(1秒)内变化的次数。
若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:
f=N/T.
基于这一原理我们可以使用单位时间内对被测信号进行计数的方法求得对该信号的频率测量,具体实现过程简述如下:
首先,将被测信号①(方波)加到闸门的输入端。
由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。
门控信号控制闸门的开与闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。
闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。
比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。
在这一段时间内,若计数器计得N=100000个数,根据公式f=N/T,那么被测频率就是100000Hz。
如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。
不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。
在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。
系统单元模块划分:
1)分频器,将产生用于计数控制的时钟分别为1HZ,10HZ,100HZ脉冲和1KHZ的用于七段显示数码管扫描显示的扫描信号。
2)闸门选择器,用于选择不同的闸门时间以及产生后续的小数点的显示位置。
3)门控电路,产生用于计数的使能控制信号,清零信号以及锁存器锁存信号。
4)计数器,用于对输入的待测信号进行脉冲计数,计数输出。
5)锁存器,用于对计数器输出数据的锁存,便于后续译码显示电路的对数据进行记忆显示,同时避免计数器清零信号对数据产生影响。
6)译码显示,用于产生使七段显示数码管的扫描数字显示,小数点显示的输出信号,同时对高位的无意义零进行消隐。
二、单元电路设计
1、分频器:
该电路将产生四个不同频率的信号输出,因为电路板上给出了一个48MHZ的晶振,所以我们只需要对48MHZ的信号进行适当分频即可得到我们所需的四个不同频率的信号输出,我们设计一个输入为48MHZ,有四个输出端分别为1HZ,10HZ和100HZ,1KHZ的分频器,原程序如下:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_ARITH.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
entityfenpinqiis
Port(clk:
inSTD_LOGIC。
clkout1:
outSTD_LOGIC。
clkout10:
outSTD_LOGIC。
clkout100:
outSTD_LOGIC。
clkout1K:
outSTD_LOGIC)。
endfenpinqi。
architectureBehavioraloffenpinqiis
signalcnt1:
integerrange1to24000000。
signalcnt10:
integerrange1to2400000。
signalcnt100:
integerrange1to240000。
signalcnt1K:
integerrange1to24000。
signalc1:
std_logic。
signalc2:
std_logic。
signalc3:
std_logic。
signalc4:
std_logic。
begin
process(clk)is
begin
ifclk'eventandclk='1'then
ifcnt1<24000000then--对cnt1进行计数,当cnt1未计满后对其进行加1
cnt1<=cnt1+1。
elsifcnt1=24000000then--cnt1计满后对其进行赋一,并且令c1进行翻转,然后将c1的值赋给clkout1
c1<=notc1。
--由于48MHZ的的信号,前一半的时候c1为0,则后一半是为1,就完成了对信号进行分频,产生了1HZ的信号
cnt1<=1。
endif。
endif。
endprocess。
process(clk)is
begin
ifclk'eventandclk='1'then--方法同上
ifcnt10<2400000then
cnt10<=cnt10+1。
elsifcnt10=2400000then
c2<=notc2。
cnt10<=1。
endif。
endif。
endprocess。
process(clk)is
begin
ifclk'eventandclk='1'then--方法同上
ifcnt100<240000then
cnt100<=cnt100+1。
elsifcnt100=240000then
c3<=notc3。
cnt100<=1。
endif。
endif。
endprocess。
process(clk)is
begin
ifclk'eventandclk='1'then--方法同上
ifcnt1K<24000000then
cnt1K<=cnt1K+1。
elsifcnt1=24000then
c4<=notc4。
cnt1K<=1。
endif。
endif。
endprocess。
clkout1<=c1。
clkout10<=c2。
clkout100<=c3。
clkout1K<=c4。
endBehavioral。
源文件编写成功后编译并生成图形文件符号如图:
仿真文件编写如下:
LIBRARYieee。
USEieee.std_logic_1164.ALL。
USEieee.std_logic_unsigned.all。
USEieee.numeric_std.ALL。
ENTITYtbb_vhdIS
ENDtbb_vhd。
ARCHITECTUREbehaviorOFtbb_vhdIS
COMPONENTfenpinqi
PORT(clk:
INstd_logic。
clkout1:
OUTstd_logic。
clkout10:
OUTstd_logic。
clkout100:
OUTstd_logic。
clkout1K:
OUTstd_logic)。
ENDCOMPONENT。
SIGNALclk:
std_logic:
='0'。
SIGNALclkout1:
std_logic。
SIGNALclkout10:
std_logic。
SIGNALclkout100:
std_logic。
SIGNALclkout1K:
std_logic。
BEGIN
uut:
fenpinqiPORTMAP(clk=>clk,
clkout1=>clkout1,
clkout10=>clkout10,
clkout100=>clkout100,
clkout1K=>clkout1K)。
tb:
PROCESS
BEGIN
clk<='0'。
waitfor10ps。
clk<='1'。
waitfor10ps。
ENDPROCESS。
END。
对该模块进行仿真结果如下:
有上图可知分频器工作正常,产生的个信号也没有毛刺,结果十分理想。
2、闸门选择器:
在这个模块中我们有四个输出端和六个输入端,其中四个输出端中有一个是频率输出端,是通过三个闸门选择开关输入和三个输入频率决定的,另外三个输出端则是用来后面的小数点控制的,而六个输入端中的三个是上面分频器的三个输出1HZ,10HZ和100HZ,另外三个是电路板上的拨动开关,用来选择闸门,控制输出。
其原程序和分析如下:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_ARITH.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
entitySELEis
Port(SE1:
inSTD_LOGIC。
SE10:
inSTD_LOGIC。
SE100:
inSTD_LOGIC。
F1HZ:
INSTD_LOGIC。
F10HZ:
INSTD_LOGIC。
F100HZ:
INSTD_LOGIC。
FREF:
outSTD_LOGIC。
DP1:
outSTD_LOGIC。
DP2:
outSTD_LOGIC。
DP3:
outSTD_LOGIC)。
endSELE。
architectureBehavioralofSELEis
begin
PROCESS(SE1,SE10,SE100)IS
BEGIN
IFSE1='1'ANDSE10='0'ANDSE100='0'THEN
FREF<=F1HZ。
--当闸门控制在第一档的时候,令输出端输出1HZ输入端的输入,小数点控制dp1有效,dp2,dp3无效
DP1<='0'。
DP2<='1'。
DP3<='1'。
ENDIF。
IFSE1='0'ANDSE10='1'ANDSE100='0'THEN
FREF<=F10HZ。
--第二档,输出为10HZ,dp2有效
DP1<='1'。
DP2<='0'。
DP3<='1'。
ENDIF。
IFSE1='0'ANDSE10='0'ANDSE100='1'THEN
FREF<=F100HZ。
--第三档,输出为100HZ,dp3有效
DP1<='1'。
DP2<='1'。
DP3<='0'。
ENDIF。
ENDPROCESS。
endBehavioral。
源代码编写完成后保存并生成图形文件符号如图:
仿真文件编写如下:
LIBRARYieee。
USEieee.std_logic_1164.ALL。
USEieee.std_logic_unsigned.all。
USEieee.numeric_std.ALL。
ENTITYTTB_vhdIS
ENDTTB_vhd。
ARCHITECTUREbehaviorOFTTB_vhdIS
COMPONENTSELE
PORT(SE1:
INstd_logic。
SE10:
INstd_logic。
SE100:
INstd_logic。
F1HZ:
INstd_logic。
F10HZ:
INstd_logic。
F100HZ:
INstd_logic。
FREF:
OUTstd_logic。
DP1:
OUTstd_logic。
DP2:
OUTstd_logic。
DP3:
OUTstd_logic)。
ENDCOMPONENT。
SIGNALSE1:
std_logic:
='1'。
SIGNALSE10:
std_logic:
='0'。
SIGNALSE100:
std_logic:
='0'。
SIGNALF1HZ:
std_logic:
='0'。
SIGNALF10HZ:
std_logic:
='0'。
SIGNALF100HZ:
std_logic:
='0'。
SIGNALFREF:
std_logic。
SIGNALDP1:
std_logic。
SIGNALDP2:
std_logic。
SIGNALDP3:
std_logic。
BEGIN
uut:
SELEPORTMAP(
SE1=>SE1,
SE10=>SE10,
SE100=>SE100,
F1HZ=>F1HZ,
F10HZ=>F10HZ,
F100HZ=>F100HZ,
FREF=>FREF,
DP1=>DP1,
DP2=>DP2,
DP3=>DP3)。
tb:
PROCESS
BEGIN
F1HZ<='0'。
FREF<='0'。
waitfor100ns。
F1HZ<='1'。
FREF<='1'。
WAITFOR100NS。
ENDPROCESS。
END。
仿真结果如图:
有仿真结果可知闸门选择器工作正常,能够准确输出我们所需的信号。
3、门控信号:
在此模块中有一个输入端和两个输出端,输入端为上面的闸门选择器输出的频率,两个输出端分别为计数器是能控制信号(锁存器控制信号),和计数器清零信号。
具体源程序即分析如下:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_ARITH.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
entityCONTROLSis
Port(FREF:
inSTD_LOGIC。
GAT:
outSTD_LOGIC。
CLR:
outSTD_LOGIC)。
endCONTROLS。
architectureBehavioralofCONTROLSis
SIGNALG1:
STD_LOGIC:
='0'。
begin
PROCESS(FREF)IS
BEGIN
IFFREF'EVENTANDFREF='1'THEN
G1<=NOTG1。
--该过程对时钟信号又一次进行分频,产生出半个周期时间为1的控制信号,作为计数使能,保证了时间的准确性
ENDIF。
ENDPROCESS。
PROCESS(FREF,G1)IS
BEGIN
IFFREF='0'ANDG1='0'THEN
CLR<='1'。
--该过程产生清零信号,即当使能信号为无效0同时时钟为0时,即在技术始终无效半个时钟时间后,对计数器清零
ELSECLR<='0'。
--清零信号高电平有效
ENDIF。
ENDPROCESS。
GAT<=G1。
--将G1赋给gat输出端,它是计数器的使能信号同时也是锁存器的锁存信号
endBehavioral。
源文件编写完成后保存编译并生成图形文件符号如图:
仿真文件代码如下:
LIBRARYieee。
USEieee.std_logic_1164.ALL。
USEieee.std_logic_unsigned.all。
USEieee.numeric_std.ALL。
ENTITYTBCON_vhdIS
ENDTBCON_vhd。
ARCHITECTUREbehaviorOFTBCON_vhdIS
COMPONENTCONTROLS
PORT(FREF:
INstd_logic。
GAT:
OUTstd_logic。
CLR:
OUTstd_logic)。
ENDCOMPONENT。
SIGNALFREF:
std_logic:
='0'。
SIGNALGAT:
std_logic。
SIGNALCLR:
std_logic。
BEGIN
uut:
CONTROLSPORTMAP(
FREF=>FREF,
GAT=>GAT,
CLR=>CLR)。
tb:
PROCESS
BEGIN
FREF<='0'。
WAITFOR100NS。
FREF<='1'。
WAITFOR100NS。
ENDPROCESS。
END。
对上面的文件进行仿真,结果如下:
由上图的仿真结果可知,控制电路工作正常,输出信号稳定,很理想。
同时我们也可以看出来该模块对分频器的时钟输出的稳定性依赖十分严重,一旦分频器输出时钟有毛刺,该控制信号将会完全的无效,这也是为什么我知道上面的分频器设计不是最优的方案,却还是采用了上述方法的原因。
4、计数器:
该模块实现的功能是对输入信号脉冲的计数,并正确的输出结果和溢出。
使用上面的门控信号产生的gat信号控制计数器的使能端,以实现计数器的定时计数。
该模块是使用六个十进制计数器同步并联而成的,首先我们设计用于并联的十进制计数器,原程序如下:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_ARITH.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
entityCNT10is
Port(CLK:
inSTD_LOGIC。
CLR:
inSTD_LOGIC。
ENA:
inSTD_LOGIC。
CQ:
outSTD_LOGIC_VECTOR(3downto0)。
CO:
outSTD_LOGIC)。
endCNT10。
architectureBehavioralofCNT10is
SIGNALCQI:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000"。
--定义中间信号CQI,用于数据输出的循环计数
begin
PROCESS(CLK,CLR)IS
BEGIN
IFCLR='1'THENCQI<="0000"。
--当CLR清零信号有效时使输出为0000,无效时进行下述操作
ELSIFCLK'EVENTANDCLK='1'THEN--对时钟进行计数
IFENA='1'THEN--判断使能信号,有效则进行计数,否则不作处理
IFCQI="1001"THENCQI<="0000"。
--数据0~9循环,计满后重新回到0
ELSECQI<=CQI+'1'。
ENDIF。
ENDIF。
ENDIF。
ENDPROCESS。
CO<='1'whenena='1'andcqi=9else'0'。
--进位信号,最高位的仅为信号作为计数的溢出信号
CQ<=CQI。
--当且仅当使能有效且计数为9时产生进位信号,进位信号1有效,同步并联时连高位的使能端
endBehavioral。
文件编写完成后保存编译生成图形文件符号,如上图:
创建图形文件cnt6并按照下图进行连接,保存后编译生成图形文件符号如图:
仿真文件代码如下:
LIBRARYieee。
USEieee.std_logic_1164.ALL。
USEieee.std_logic_unsigned.all。
USEieee.numeric_std.ALL。
ENTITYTBCNT10_vhdIS
ENDTBCNT10_vhd。
ARCHITECTUREbehaviorOFTBCNT10_vhdIS
COMPONENTCNT10
PORT(CLK:
INstd_logic。
CLR:
INstd_logic。
ENA:
INstd_logic。
CQ:
OUTstd_logic_vector(3downto0)。
CO:
OUTstd_logic)。
ENDCOMPONENT。
SIGNALCLK:
std_logic:
='0'。
SIGNALCLR:
std_logic:
='0'。
SIGNALENA:
std_logic:
='1'。
SIGNALCQ:
std_logic_vector(3downto0)。
SIGNALCO:
std_logic。
BEGIN
uut:
CNT10PORTMAP(
CLK=>CLK,
CLR=>CLR,
ENA=>ENA,
CQ=>CQ,
CO=>CO)。
tb:
PROCESS
BEGIN
CLK<='0'。
waitfor100ns。
CLK<='1'。
WAITFOR100NS。
ENDPROCESS。
END。
仿真结果如图:
如仿真结果我们可以看出,该模块运行正常,计数稳定,结果十分理想。
5、锁存器:
由于前面的计数器的输出为六组四位二进制数和一个溢出信号,所以我们使用的锁存器也使用六个四位锁存器和一个一位锁存器。
锁存器使用下降沿锁存,即当计数器的使能信号变为无效的一瞬间我们令锁存器将数据锁存。
四位锁存器的原代码如下:
libraryIEEE。
useIEEE.STD_LOGIC_1164.ALL。
useIEEE.STD_LOGIC_ARITH.ALL。
useIEEE.STD_LOGIC_UNSIGNED.ALL。
entityLATCH4is
Port(CLK:
inSTD_LOGIC。
DIN:
inSTD_L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 数字频率计 方案设计 书报