实验六 数字频率计的设计DOC.docx
- 文档编号:29026798
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:23
- 大小:338.30KB
实验六 数字频率计的设计DOC.docx
《实验六 数字频率计的设计DOC.docx》由会员分享,可在线阅读,更多相关《实验六 数字频率计的设计DOC.docx(23页珍藏版)》请在冰豆网上搜索。
实验六数字频率计的设计DOC
南昌大学实验报告
学生姓名:
学号:
专业班级:
中兴101班
实验类型:
□验证□综合■设计□创新实验日期:
2012年12月14日成绩:
实验六数字频率计的设计
一、实验目的
1)设计具有较高测量精度的频率计;
2)进一步学习QUATUSII的使用
3)学会看RTLVIEWER图。
4)熟悉实验设备和软件,掌握实验操作。
二、实验内容与要求
本实验要完成的任务就是设计一个频率计,系统时钟选择核心板上的50M的时钟,闸门时间为1s(通过对系统时钟进行分频得到),在闸门为高电平期间,对输入的频率进行计数,当闸门变低的时候,记录当前的频率值,并将频率计数器清零,频率的显示每过2秒刷新一次。
被测频率通过一个拨动开关来选择是使用系统中的数字时钟源模块的时钟信号还是从外部通过系统的输入输出模块的输入端输入一个数字信号进行频率测量。
当拨动开关为高电平时,测量从外部输入的数字信号,否则测量系统数字时钟信号模块的数字信号。
三、实验仪器
PC机、QuartusII软件、EDA实验箱
四、实验思路
数字频率计工作原理概述
数字频率计的设计原理实际上是测量单位时间内的周期数。
这种方法免去了实测以前的预测,同时节省了划分频段的时间,克服了原来高频段采用测频模式而低频段采用测周期模式的测量方法存在换挡速度慢的缺点。
采用一个标准的基准时钟,在单位时间(1s)里对被测信号的脉冲数进行计数,即为信号的频率。
由于闸门的起始和结束时刻对于信号来说是随机的,将会有一个脉冲周期的量化误差。
进一步分析测量准确度:
设待测信号脉冲周期为Tx,频率为Fx,当测量时间为T=1s时,测量准确度为&=Tx/T=1/Fx。
由此可知直接测频法的测量准确度与信号的频率有关:
当待测信号频率较高时,测量准确度也较高,反之测量准确度也较低。
因此直接测频法只适合测量频率较高的信号,不能满足在整个测量频段内的测量精度保持不变的要求。
为克服低频段测量的不准确问题,采用门控信号和被测信号对计数器的使能信号进行双重控制,大大提高了准确度。
当门控信号为1时,使能信号并不为1,只有被测信号的上升沿到来时,使能端才开始发送有效信号,两个计数器同时开始计数。
当门控信号变为0时,使能信号并不是立即改变,而是当被测信号的下一个上升沿到来时才变为0,计数器停止计数。
因此测量的误差最多为一个标准时钟周期。
当采用100MHz的信号作为标准信号时,误差最大为0.01μs。
计算每秒钟内待测信号脉冲个数。
这就要求计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的ENA使能端进行同步控制。
当TSTEN为高电平时,允许计数;低电平时,停止计数,并保持其所计的数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的译码器译出并稳定显示。
锁存信号之后,必须由清零信号CLR_CNT对计数器进行清零,为下一秒钟的计数操作做准备。
当系统正常工作时,脉冲发生器提供的1Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
系统的总体设计
当系统正常工作时,由系统时钟提供的50MHz的输入信号,经过分频模块,产生1HZ及1KHz的时钟信号,其中1HZ的输出频率被作为控制模块的时钟输入,1KHz的输出频率被作为显示模块的时钟输入,由控制模块产生的计数使能信号tsten和清零信号clr对计数模块进行控制,而由其产生的锁存信号load对锁存模块进行控制,一旦计数使能信号为高电平,并且时钟上升沿到来,计数器便开始正常计数,清零信号到来则计数清零,而当锁存信号为高电平时,数据便被锁存器锁存,然后将锁存的数据输出到显示模块显示出来,数据锁存保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
数字频率计的原理框图如图1所示。
主要由5个模块组成,分别是:
信号源模块、控制模块、测频信号选择计数模块、锁存器模块和显示器模块。
图1数字频率计的原理框图
根据数字频率计的系统原理,cnt控制信号发生器。
tstctl的计数使能信号tsten能产生一个1s宽的周期信号,并对频率计的每一计数器Cnt10的ENA使能端进行同步控制:
当tsten高电平时允许计数、低电平时停止计数。
reg32b为锁存器。
在信号load的上升沿时,立即对模块的输入口的数据锁存到reg32b的内部,并由reg32b的输出端输出,然后,七段译码器可以译码输出。
在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
Cnt10为十进制计数器。
有一时钟使能输入端ENA,用于锁定计数值。
当高电平时允许计数,低电平时禁止计数。
将八个十进制计数器Cnt10级联起来实现8位十进制计数功能。
disply为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示的相对应的阿拉伯数字,便于读取测量的结果。
为了实现系统功能,测频控制信号发生器testctl、计数器Cnt10、锁存器reg32b存在一个工作时序的问题,设计时需要综合考虑。
8位数字频率计的顶层框图(endfreq.bdf),设计实现包括信号源模块(F1MHZ、CNT)、频率计模块(FREQ)和显示模块(display)三大模块。
五.原理图输入法设计(小时进制转换参考XX文库上的程序,其余独立完成)
1.建立文件夹
建立自己的文件夹(目录),如c:
\myeda,进入Windows操作系统
●QuartusII不能识别中文,文件及文件夹名不能用中文。
2.原理图设计输入
打开QuartusII,选菜单File→New,选择“DeviceDesignFile->BlockDiagram->SchematicFile”项。
点击“OK”,在主界面中将打开“BlockEditor”窗口。
(1)分频器模块:
(实体名为clkout)
分频器是为了产生1Hz的门控信号和1KHz的数码管扫描信号,而对输入系统时钟clk(50MHz)进行分频的模块,设计源代码clkout.VHD对输入系统时钟clk(50MHz)进行分频产生1Hz信号及1KHz信号。
clkout的封装图如1所示,图中CLK50m为接入的50MHZ信号,图中CLK1khz为接到TElTCL的CLK的1HZ的信号,CLK1hz为接到Display的CLK的1kHZ的信号。
图2clkout封装图
clkout的工作时序仿真图如图3所示。
图3分频模块仿真图
从clkout的工作时序仿真图可以看出:
由系统时钟提供的50MHz的输入信号,经过分频模块,通过两个分频产生1HZ及1KHz的时钟信号,达到了设计所需的预期效果。
具体程序如下:
--时间:
2012年11月01号
--版本:
7.2
--功能:
分频器(100分频)
分频模块DIV源代码div.vhd如下:
-------分频程序,从10KHZ中得到1HZ的计数频率,10000分频----------
--Title:
频率计闸门信号、显示扫描信号产生--
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclkoutIS
PORT(clk50m:
INSTD_LOGIC;--50M系统时钟输入
clk1kHZ:
OUTSTD_LOGIC;--1KHZ显示扫描时钟输出
clk1HZ:
OUTSTD_LOGIC);--1HZ闸门信号产生
ENDclkout;
ARCHITECTUREAOFclkoutIS
BEGIN
PROCESS(clk50m)--产生显示扫描时钟1KHZ
variablecnttemp:
INTEGERRANGE0TO99999;
BEGIN
IFclk50m='1'ANDclk50m'eventTHEN
IFcnttemp=99999THENcnttemp:
=0;
ELSE
IFcnttemp<50000THENclk1khz<='1';
ELSEclk1khz<='0';
ENDIF;
cnttemp:
=cnttemp+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(clk50m)--产生显示扫描时钟1KHZ
variablecnt:
INTEGERRANGE0TO49999999;
BEGIN
IFclk50m='1'ANDclk50m'eventTHEN
IFcnt=49999999THENcnt:
=0;
ELSE
IFcnt<25000000THENclk1hz<='1';
ELSEclk1hz<='0';
ENDIF;
cnt:
=cnt+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDA;
(2)测频控制信号产生器:
(实体名为TElTCL)
控制模块的作用是产生测频所需要的各种控制信号。
控制信号的标准输入时钟为1HZ,每两个时钟周期进行一次频率测量。
该模块产生的3个控制信号,分别为TSTEN,LOAD,CLR_CNT.CLR_CNT信号用于在每次测量开始时,对计数器进行复位,以清除上次测量的结果,该复位信号高电平有效,持续半个时钟周期的时间。
TSTEN为计数允许信号,在TSTEN信号的上升沿时刻计数模块开始对输入信号的频率进行测量,测量时间恰为一个时钟周期(正好为单位时间1s),在此时间里被测信号的脉冲数进行计数,即为信号的频率。
然后将值锁存,并送到数码管显示出来。
设置锁存器的好处是使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
在每一次测量开始时,都必须重新对计数器清0。
测频控制产生器如图4,图中CLK接CNT的FREQ1的1HZ的信号,TSTEN为计数允许信号,接计数器CNT10的ENA,CLR_CNT信号用于在每次测量开始时,对计数器进行复位,接计数器CNT10的CLR,LOAD接锁存器的LOAD。
图4TESTCTL的封装图
测频控制信号发生器TESTCTL的工作时序图,控制模块的几个控制信号的时序关系图如图5所示。
图5TESTCTL的时序仿真图
从图中可看出,计数使能信号TSTEN在1s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,随后产生清0信号上跳沿CLR_CNT。
为了产生这个时序图需首先建立一个由D触发器构成的二分频器,在每次时钟CLK上升沿到来时令其翻转。
其中,控制信号时钟clk的频率取1HZ,而信号TSTEN的脉宽恰好为1s,可以用作闸门信号。
此时,根据测频的时序要求,可得出信号LOAD和CLR_CNT的逻辑描述。
由图可知,在计数完成后,计数使能信号TETEN在1s的高电平后,利用其反相值的上跳沿产生一个锁存信号LOAD,0.5s后,CLR_CNT产生一个清零信号上跳沿。
具体程序如下:
--时间:
2012年12月1号
--版本:
7.2
--功能:
数字频率计控制信号产生
-----------------TElTCL------------------------------------------------------------------
--Title:
数字频率计控制信号产生--
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTElTCLIS
PORT(CLK:
INSTD_LOGIC;--1Hz测频控制时钟
TSTEN:
OUTSTD_LOGIC;--计数器时钟使能
CLR_CNT:
OUTSTD_LOGIC;--计数器清零
LOAD:
OUTSTD_LOGIC);--输出锁存信号
ENDTElTCL;
ARCHITECTUREARTOFTElTCLIS
SIGNALDIV2CLK:
STD_LOGIC;
SIGNALCLR:
STD_LOGIC;
SIGNALloadcnt:
STD_LOGIC;
BEGIN
PROCESS(CLK)IS
BEGIN
IFCLK'EVENTANDCLK='1'--1HZ时钟二分频
THENDIV2CLK<=NOTDIV2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLK,DIV2CLK)
BEGIN
IFCLK='0'ANDDIV2CLK='0'THEN--产生计数器清零信号
CLR<='1';
ELSECLR<='0';
ENDIF;
ENDPROCESS;
LOAD<=notdiv2clk;TSTEN<=DIV2CLK;CLR_CNT<=CLR;
ENDARCHITECTUREART;
(3)十进制计数器:
(实体名为CNT10)
计数器模块是由8个带有异步清零端,进位信号输出的模为10的计数模块级连而成。
通过分频进行元件例化实现。
此十进制计数器的特殊之处是,有一时钟使能输入端ENA,用于锁定计数器。
当高电平计数允许,低电平时计数禁止。
计数器模块用于对输入信号的脉冲进行计数,该模块必须有计数允许、异步清零等端口,以便于控制模块对其进行控制。
CNT10的封装如图6,其中CLR为复位接TESTCTL的CLR_CNT端,ENA接TESTCTL的TSTEN端,CQ[3..0]接锁存器的DOUT[31..0]端。
图6CNT10的封装图
有时钟使能的十进制计数器CNT10的工作时序仿真如图7。
图7CNT10的时序仿真图
此程序模块实现的功能是带使能端的10进制计数。
程序要求只有当使能端信号为高电平时计数器才能正常工作,每个时钟的上升沿到来时计数器加1,因为这里要实现的是10进制计数,所以当计数到10时计数器清零,同时产生进位信号,这里的进位信号仅为一个脉冲信号,一旦计数从10变为1,脉冲信号立即变为低电平。
同时该计数器也应带有清零信号,一旦清零信号为高电平,计数器立即清零。
具体程序如下:
--时间:
2012年12月1号
--版本:
7.2
--功能:
十进制计数器
----------CNT10-----------------------------------------------------------------------------
--Title:
频率计有时钟使能的十进制计数器产生-
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYCNT10IS
PORT(CLK:
INSTD_LOGIC;--计数时钟信号
CLR:
INSTD_LOGIC;--清零信号
ENA:
INSTD_LOGIC;--计数使能信号
CQ:
OUTINTEGERRANGE0TO15;--4位计数结果输出
CARRY_OUT:
OUTSTD_LOGIC);--计数进位
ENDCNT10;
ARCHITECTUREARTOFCNT10IS
SIGNALCQI:
INTEGERRANGE0TO15;
BEGIN
PROCESS(CLK,ENA)IS
BEGIN
IFCLR='1'THENCQI<=0;----计数器异步清零
elsIFCLK'EVENTANDCLK='1'THEN
IFENA='1'THEN
iFCQI=10THENcqi<=1;
ELSECQI<=cqi+1;
ENDIF;----等于9,则计数器清零
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CQI)IS
BEGIN
IFCQI=10THENCARRY_OUT<='1';----进位输出
ELSECARRY_OUT<='0';
ENDIF;
ENDPROCESS;
CQ<=CQI;
ENDART;
(4)二选一被测频率选择模块(实体名:
mux)
二选一被测频率选择模块如图8所示,其中:
输入管脚:
clkin1设定为外部时钟输入;
clkin2设定为数字信号源输入;
key设定为数字信号源输入
输出管脚:
fin被测频率输出,当key为1时,选择外部时钟输入;选择0时为数字信号源输入;
图8
--时间:
2012年12月1号
--版本:
7.2
--功能:
二选一被测频率选择
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entitymuxis
port(clkin1:
instd_logic;--设定为外部时钟输入
clkin2:
instd_logic;--设定为数字信号源输入
key:
instd_logic;--设定为数字信号源输入
fin:
outstd_logic--被测频率输出
);
endmux;
--------------------------------------------------------------------
architecturebehaveofmuxis
begin
process(key,clkin1,clkin2)
begin
ifkey='1'then
fin<=clkin1;
else
fin<=clkin2;
endif;
endprocess;
endbehave;
(5)显示模块(实体名:
display)
LED有段码和位码之分,所谓段码就是让LED显示出八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。
位码也就是LED的显示使能端,对于共阴级的LED而言,低电平使能,在本设计中设计了一个3位的循环计数器,将计数结果输入到译码器,译码结果输出即可依次使能每个LED。
例如:
要让8个LED同时工作显示数据,就是要不停的循环扫描每一个LED,并在使能每一个LED的同时,输入所需显示的数据对应的8位段码。
虽然8个LED是依次显示,但是受视觉分辨率的影响,看到的现象是8个LED同时工作。
display模块的顶层图如下所示。
CNT计数产生扫描信号(位码),LED模块用于查表产生LED段码输出。
图9位display的封装图。
图中in0~in7接锁存器的DOUT[31..0]端。
图9display的封装图
display工作时序图如下图。
图10disply工作时序图
用8个LED将待测频率显示出来,将通过十进制计数器的时钟信号CLK,输出为时钟信号计数译码后的显示驱动端,在八段LED译码为对应的八段二进制编码,并由数码显示器显示出来。
图10中为相应二进制编码与相对应的屏显数字。
显示电路
图11display硬件结构图
此部分如图,图中主要由0~7循环累加器、3-8译码器、BCD-7段显示译码器、8选1多路数据开关和8个LED显示器组成的扫描数码显示器。
--时间:
2012年12月1号
--版本:
7.2
--功能:
数字频率计显示译码输出
---------------display----------------------------------
--Title:
数字频率计显示译码输出--
LIBRARYIEEE;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydisplayis
port(in7,in6,in5,in4,in3,in2,in1,in0:
instd_logic_vector(3downto0);
lout7:
outstd_logic_vector(6downto0);
SEL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
clk:
instd_logic
);
enddisplay;
architecturephtaoofdisplayis
signals:
std_logic_vector(2downto0);
signallout4:
std_logic_vector(3downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(s="111")then
s<="000";
elses<=s+1;
endif;
endif;
sel<=s;
endprocess;
process(s)
begin
casesis
when"000"=>lout4<=in7;
when"001"=>lout4<=in6;
when"010"=>lout4<=in5;
when"011"=>lout4<=in4;
when"100"=>lout4<=in3;
when"101"=>lout4<=in2;
when"110"=>lout4<=in1;
when"111"=>lout4<=in0;
whenothers=>lout4<="XXXX";
endcase;
caselout4is
when"0000"=>lout7<="1111110";
when"0001"=>lout7<="0110000";
when"0010"=>lout7<="1101101";
when"0011"=>lout7<="1111001";
when"0100"=>lout7<="0110011";
when"0101"=>lout7<="1011011";
when"0110"=>lout7<="1011111";
when"0111"=>lout7<="1110000";
when"1000"=>lout7<="1111111";
when"1001"=>lout7<="111
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验六 数字频率计的设计DOC 实验 数字频率计 设计 DOC