数字频率计的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一:摘要
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率的测量就显得更为重要。
测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
电子计数器测频有两种方式:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法。
频率计主要由四个部分构成:时基(T)电路、输入电路、计数显示电路以及控制电路。
在一个测量周期过程中,被测周期信号在输入电路中经过放大、整形、微分操作之后形成特定周期的窄脉冲,送到主门的一个输入端。
主门的另外一个输入端为时基电路产生电路产生的闸门脉冲。
在闸门脉冲开启主门的期间,特定周期的窄脉冲才能通过主门,从而进入计数器进行计数,计数器的显示电路则用来显示被测信号的频率值,内部控制电路则用来完成各种测量功能之间的切换并实现测量设置。
二:关键词
周期;频率;数码管,锁存器,计数器,中规模电路,定时器
三:概述
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。
其设计的灵活性使得EDA技术得以快速发展和广泛应用。
以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域。
EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。
四:软件介绍
在本设计中使用的软件有Protel99SE、Quartus II 4.0
4.1 .1Protel的简介
Protel99 SE是Protel公司近几年来致力于Windows平台开发的拳头产品。
它能实现电学概念设计到输出物理生产数据,以及这之间的所有分析、验证和设计数据管理。
今天的Protel99 SE软件已不是单纯的PCB(印刷电路板)设计工具,而是一个系统工具。
它覆盖了以PCB为核心的全部物理设计。
4.1.2 Protel99 SE的划分
Protel99 SE共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。
4.1.3 Protel99 SE的功能
Protel99 SE软件具有其它EDA工具软件(例:multisim)的功能。
这些功能是:(1)原理布图(2)PCB自动或人工布线(3)SPICE电路仿真
革命性的特点:
(1)互动的电路仿真 :用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
(2)仿真处理器及其外围电路 :可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。
还可以直接在基于原理图的虚拟原型
4.2.1Quartus II
Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
功能
Quartus II提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;
芯片(电路)平面布局连线编辑;
LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTap II逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件和Verilog网表文
件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件。
五:电路组成
5.1 时基电路
5.2 放大整形电路
为保证测量精度,在整形电路的输入端加一前置放大器。
对幅值较低的被测信号经放
大后再送入整形器整形。
如图3.2.2为放大整形电路原理图。
此电路采用晶体管3DG100与74LS00等组成,其中3DG100为放大器,可对周期信号进行放大再传入整形器中对信号进行整形。
5.2.1 译码器模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity display is
port(data_in:in std_logic_vector(3 downto 0);
data_out:out std_logic_vector(0 to 3));
end entity display;
architecture one of display is
signal indata:std_logic_vector(3 downto 0);
begin
process(data_in)
begin
indata<=data_in;
case indata is
when"0000"=>data_out<="0000";
when"0001"=>data_out<="0001";
when"0010"=>data_out<="0010";
when"0011"=>data_out<="0011";
when"0100"=>data_out<="0100";
when"0101"=>data_out<="0101";
when"0110"=>data_out<="0110";
when"0111"=>data_out<="0111";
when"1000"=>data_out<="1000";
when"1001"=>data_out<="1001";
when others=>data_out<="1111";
end case;
end process; end one;
5.3 逻辑控制电路
逻辑控制电路的作用主要是控制主控门的开启和关闭,同时也控制整机逻辑关系。
本设计采用74LS123组成逻辑控制电路,先启动脉冲置成1,其余触发器置成0,然后时基电路传入脉冲,控制电路开始工作。
被测信号通过闸门进入计数电路,于是计数器译码器同时工作,从而记下所测信号频率值。
当控制电路转为其他状态时,闸门关闭,计数器停止工作,数码管继续显示所测频率
值。
直到有一次循环,计数器清零,数码管显示消失,到此为止,频率计完成一次测量。
脉冲信号可由两个单稳态触发器74LS123产生,它们的脉冲宽度由电路的时间常数决定。
5.4 计数器
各个挡之间的转换应遵循设计要求,要根据在时基有效时间内的计数值进行判断。
计数器可以直接定义成一个整型信号,这样计数器计数(即加1)就十分方便,只要使用语句“计数器<=计数器+1;”就可以。
但是这个计数值要作为显示输出,就要将这个计数器用个位、十位、百位分开表示,而且要遵循加法“逢十进一”的规则。
这样可以直接通过7段译码器进行显示。
因为在不同的挡位,小数点的位置是不同的,所以小数点的显示以所在挡为判断条件。
由于频率计的测量范围10~9999Hz,因此采用十进制计数器74LS90,它不仅可用于对脉冲进行计数,还可用于分频;此电路则需分频,N位进制计数器就是N 分频器。
被测信号由闸门开通送入计数器,记录所测信号频率值传入译码显示电路中,显示器显示测得频率值;待闸门关闭,计数器停止工作;电路则继续工作进行下次循环,计数器清零,显示器数值消失,频率计完成一次测量。
被测信号经过放大整形电路变成方波,
加到门控电路产生闸门信号,若
s
T
X
μ1
=。
则计数器记得的脉冲数10000个。
若以毫秒为
单位,则显示器上的读数为10.000。
以上分析可见,频率计测周期的基本原理正好与测频相反,即被测信号用来控制闸门电路的开通与关闭,标准时基信号作为计数脉冲。
5.4.1 计数器模块
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity frequency is
port(treset:in std_logic;
tclk:in std_logic;
tsig:in std_logic;
tkeep1:out std_logic_vector(3 downto 0);
tkeep2:out std_logic_vector(3 downto 0);
tkeep3:out std_logic_vector(3 downto 0));
end entity frequency;
architecture one of frequency is
signal tcou1:std_logic_vector(3 downto 0);
signal tcou2:std_logic_vector(3 downto 0);
signal tcou3:std_logic_vector(3 downto 0);
begin
ctrcou:process(treset,tclk)
begin
if treset='1' then
tcou1<="0000";tcou2<="0000";tcou3<="0000";
else
if tclk'event and tclk='1' then
if tsig='1' then
if tcou3="1010" then
tcou3<="1010";
else
if tcou1="1001" and tcou2="1001" and tcou3="1001" then
tcou1<="0000";tcou2<="0000";tcou3<="1010"; elsif tcou1="1001" and tcou2="1001" then
tcou1<="0000";tcou2<="0000";tcou3<=tcou3+1;
elsif tcou1="1001" then
tcou1<="0000";tcou2<=tcou2+1;
else tcou1<=tcou1+1;
end if;
end if;
else
tcou1<="0000";tcou2<="0000";tcou3<="0000";
end if;
end if;
end if;
end process ctrcou;
oputctr:process(treset,tsig)
begin
if treset='1' then
tkeep1<="0000";tkeep2<="0000";tkeep3<="0000";
else
if tsig'event and tsig='0' then
tkeep1<=tcou1;
tkeep2<=tcou2;
tkeep3<=tcou3;
end if;
end if;
end process oputctr;
end one;
5.5 锁存器
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。
锁存,就是把信号暂存以维持某种电平状态。
锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。
在确定的时间内计数器的技术结果必须经锁定后才能获得稳定的显示值。
锁存器的作用是通过触发脉冲控制,将测量的数据寄存起来,送入译码显示器。
锁存器可以采用一般的8位并行输入寄存器。
此电路采用74LS273锁存器,其作用是将计数器在1s结束时锁记得的数进行锁存,使显示器上能稳定地显示此时计数器的值。
当1s计数结束时,通过逻辑电路产生信号送入锁存器,将此时计数的值送入译码显示器。
选用两个8位锁存器74LS273可以完成上计数功能。
当时钟脉冲CP的正跳变来
到时,锁存器的输入等于输入,即Q=D,从而将计数器的输出值送到锁存器的输出端正脉冲结束后,无论D为何值,输出端Q的状态仍保持原来的状态的Q不变。
所以在计数期间内,计数器的输出不会送到译码显示器
5.5.1 分频进程
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity dfre is
port(reset:in std_logic;
clk1k:in std_logic;
testsignal:in std_logic;
display1:out std_logic_vector(0 to 3);
display2:out std_logic_vector(0 to 3);
display3:out std_logic_vector(0 to 3);
unit:out std_logic;
dot:out std_logic_vector(2 downto 0));
end entity dfre;
5.6 设计原理图
根据系统框图,方案论证,设计数字频率计系统原理图如下图所示。
在多谐振荡器中,电路从暂稳态过渡带另一个状态,其“触发”信号是由电路内部电容充(放)电提供的,因此无需外部触发脉冲。
暂稳态持续的时间是脉冲电路的主要参数,它与电路的阻容原件取值有关。
电路中RC电路充、放电过程对相应门输入电平的影响是分析电路的关键。
图中根据课题要求,电路采用555定时器组成的多谐振荡器,为获得较为稳定的时间基准信号,用来准确的控制主控门的开启时间。
被测信号首先通过放大整形电路进行整形,使其得到所需的整形信号,晶体振荡器的输出信号经整形和分频器逐级分频后,可获得各种事件基准。
通过时基选择开关,将所选用的时基信号作为控制电路的触发信号(用8位寄存器,实际上就是触发器构成的计数器,它可以循环位移一个1电平,也可以循环位移一个0电平),再将信号传入逻辑控制电路中,控制电路输出接往主控门,该输出端仅在所选时间基准内维持高电平,使主控门开启,被测信号在采样时间内通过主控门,进入十进制计数器计数,计数器数值由数字显示器在数字频率计面板上显示出来。
此即为所测信号之频率值。
译码器是组合逻辑电路的一个重要的器件,其可以分为:变量译码和显示译码两类。
它们的工作原理和分析设计方法大同小异,其中二进制译码器、二-十进制译码器和显示译码器是三种最典型,使用十分广泛的译码电路。
显示译码器,一般是将一种编码译成十进制码或特定的编码,并通过显示器件将译码器的状态显示出来。
本设计译码显示器则采用十进制74LS48来实现,其作用是把BCD码表示的十进制数转换成能驱动数码管正常显示的段信号,以获得数字显示。
5.6.1总原理图:
5.6.2 频率计源文件
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity dfre is
port(reset:in std_logic;
clk:in std_logic;
testsignal:in std_logic;
display1:out std_logic_vector(0 to 3);
display2:out std_logic_vector(0 to 3);
display3:out std_logic_vector(0 to 3);
unit:out std_logic;
dot:out std_logic_vector(2 downto 0));
end entity dfre;
architecture one of dfre is
type state is
(start,judge,count1,count2to89,count90,count91to98,count99,count100); signal myfre:state;
signal frecou:integer range 0 to 99;
signal clk1k:std_logic;
signal cou1k:integer range 0 to 2094;
signal enfre:std_logic;
signal flag:std_logic_vector(2 downto 0);
signal keepcou1:std_logic_vector(3 downto 0);
signal keepcou2:std_logic_vector(3 downto 0);
signal keepcou3:std_logic_vector(3 downto 0);
signal ttclk:std_logic;
signal ttsig:std_logic;
component display is
port(data_in:in std_logic_vector(3 downto 0);
data_out:out std_logic_vector(0 to 6)
);
end component;
component frequency is
port(treset:in std_logic;
tclk,tsig:in std_logic;
tkeep1:out std_logic_vector(3 downto 0);
tkeep2:out std_logic_vector(3 downto 0);
tkeep3:out std_logic_vector(3 downto 0));
end component;
begin
constrclk1k:process(reset,clk)-
begin
if reset='1' then
cou1k<=0;clk1k<='0';
else
if clk'event and clk='1' then
if cou1k=9999 then
cou1k<=0;
clk1k<=not clk1k;
else
cou1k<=cou1k+1;
end if;
end if;
end if;
end process constrclk1k;
ctrdot:process(flag)
begin
case flag is
when"000"=>dot<="000";
when"001"=>dot<="100";
when"010"=>dot<="010";
when"011"=>dot<="001";
when others=>dot<="111";
end case;
end process ctrdot;
ctrfre:process(reset,clk1k)
begin
if reset='1' then
frecou<=0;enfre<='0';flag<="001";myfre<=start;
else
if clk1k'event and clk1k='1' then
case myfre is
when start=>frecou<=0;enfre<='0';flag<="011";myfre<=judge;
when judge=>if flag="000" then;if keepcou3="0000" and keepcou2="0000" and keepcou1="0000" then; flag<="001";enfre<='1'; else flag<="000"; end if;
elsif flag="100" then
if keepcou3="1010" then flag<="100";
else flag<="011";end if;
elsif flag="010" then if keepcou3<"0001" then flag<=flag-1;enfre<='1';
elsif keepcou3="1010" then
flag<=flag+1; else flag<=flag;end if;
elsif flag="001" then if keepcou3<"0001" then flag<=flag-1;
elsif keepcou3="1010" then
flag<=flag+1;
else flag<=flag;
enfre<='1';
end if;
else
if keepcou3<"0001" then flag<=flag-1;elsif keepcou3="1010" then flag<=flag+1;
else flag<=flag;
end if;end if;myfre<=count1;
when count1=>
if flag="001" or flag="000" then
enfre<='1';
else enfre<=enfre;
end if;
frecou<=1;
myfre<=count2to89;
when count2to89=>
if frecou=88 then
frecou<=89;
myfre<=count90;
else frecou<=frecou+1;
myfre<=count2to89;
end if;
when count90=>
if flag="010" then
enfre<='1';
else enfre<=enfre;
end if;
frecou<=90;
myfre<=count91to98;
when count91to98=>
if frecou=97 then
frecou<=98;
myfre<=count99;
else frecou<=frecou+1;
myfre<=count91to98;
end if;
when count99=>
if flag="011" or flag="100" then
enfre<='1';
else enfre<=enfre;
end if;
frecou<=99;
myfre<=count100;
when count100=>
frecou<=100;
enfre<='0';
myfre<=judge;
when others=>null;
end case;
end if;
end if;
end process ctrfre;
ctrtt:process(reset,flag)
begin
if reset='1' then
ttclk<='0';ttsig<='0';unit<='0';
else
if flag=0 then ttclk<=clk1k;ttsig<=testsignal;unit<='1';
else ttclk<=testsignal;ttsig<=enfre;unit<='0';
end if;
end if;
end process ctrtt;
c1: frequency port map(reset,ttclk,ttsig,keepcou1,keepcou2,keepcou3);
dis1: display port map(keepcou1,display1);
dis2: display port map(keepcou2,display2);
dis3: display port map(keepcou3,display3);
end one;
5.7 性能技术指标与分析
在74LS48输入端加入不同的高低电平组合,观察数码管能否显示相应的数字,判断译码,显示部分是否能工作正常。
频率测试:测量时间是频率计完成一次测量所需要的时间,包括准备、计数、锁存和复位时间。
(3)对电路进行分部分测试,可以准确定位出现问题的具体位置,从而保证能够很快地解决。
5.8仿真图:
测试信号是频率为5kHz脉冲时的仿真波形图
第一次仿真中的换挡情况
六:总结
在设计中,我们根据频率计的测频原理,可以选择合适的时基信号即闸门时间,对输入被测信号脉冲进行计数,实现测频的目的。
根据数字频率计的基本原理,本文设计方案的基本思想是分为五个模块来实现其功能,即整个数字频率计系统分为分频模块、控制模块、计数模块、译码模块和量程自动切换模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
在进行设计之前,首先搞清楚在什么情况下是测频率,在什么情况下是测周期,其实就是一个选择合适的时基信号的问题。
在这个设计中,要在频率计提供的时基信号和输入信号之间做出选择,充当时基信号即闸门时间。
当测频率的时候,要以输入信号作为时钟信号,因为输入信号的频率大于频率计提供的基准频率,在频率计提供的基准信号周期内,计算输入信号的周期数目,再乘以频率计基准频率,就是输入信号的频率值了。
此时的时基信号为频率计的基准信号。
七:心得体会
在这次设计中我们掌握了许多以前通过这从实训,我对自己的能力和我们这个专业有了正确的认识,在以后的操作中,我们要吸取这一次的教训,不再犯类似的错误,在今后的学习中更要努力提高自己的能力、不断完善自己,做一个出色的人。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
这些都是一种锻炼,一种知识的积累,能力的提高。
完全可以把这个当作基础东西,只有掌握了这些最基础的,才可以更进一步,取得更好的成绩。
很少有人会一步登天吧。
永不言弃才是最重要的。
而且,这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
所谓频率,就是周期性信号在单位时间(1s)里变化的次数。
八参考书目:
[1]陈晓文主编.电子线路课程设计.北京:电子工业出版社,2004
[2]李哲英,《电子技术及其应用基础》(数字部分),高等教育出版社,北京,2003
[3] 朱正伟主编.《EDA技术及应用》[M].北京:清华大学出版社,2005.10
[4] 赵明富主编.《EDA技术与实践》[M].北京:清华大学出版社,2005.11
[5] 赵明富刘文进主编.《EDA技术基础》[M].北京:北京大学出版社
一:摘要 (1)
二:关键词 0
三:概述 0
四:软件介绍 0
4.1 .1Protel的简介 (2)
4.1.2 Protel99 SE的划分 (2)
4.1.3 Protel99 SE的功能 (2)
4.2.1Quartus II (1)
五:电路组成 (3)
5.1 时基电路 (3)
5.2 放大整形电路 (2)
5.2.1 译码器模块 (4)
5.3 逻辑控制电路 (3)
5.4 计数器 (5)
5.4.1 计数器模块 (4)
5.5 锁存器 (5)
5.5.1 分频进程 (7)
5.6 设计原理图 (6)
5.6.1总原理图: (7)
5.6.2 频率计源文件 (7)
5.7 性能技术指标与分析 (10)
5.8仿真图: (11)
六:总结 (12)
七:心得体会 (12)
八参考书目: (12)
《EDA课程设计》课程设计报告题目:数字频率计的设计
学院:
班级:
学号:
姓名:
指导教师:
6.2设计总电路框图
图5设计总电路框图
6.3仿真结果
图6程序仿真波形图。