数字频率计的设计
频率计测量频率的原理图如下:
图 1 频率计测量频率的原理图
3.2、频率计测量周期的原理
3.2.1、频率计测量周期的原理
频率计测量周期需要设计整形电路使被测周期性信号整形成脉冲,然后设计计数器对基准信号在被测信号一个周期内重复变化的次数进行计数,计数器计出的数字经锁存器锁存后送往译码驱动显示电路用数码管将数字显示出来,需要设计控制电路产生允许计数的使能信号、计数器的清零信号和锁存器的锁存信号使电路正常工作,再设计一个量程自动转换电路使测量范围更广。
3.2.2、频率计测量周期的原理图
频率计测量周期的原理图如下:
1
图 2频率计测量周期的原理图
4、频率计测量频率的层次化设计方案
4.1、8位十进制计数器模块
8位十进制计数器模块包含8个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有集束使能、清零控制和进位扩展输出的功能。使能信号和清零信号由闸门控制模块的控制信号发生器所产生来对8个级联十进制计数器周期性的计数进行控制。
4.1.1、十进制计数器元件的设计
十进制计数器的程序如下:
2
程序 1十进制计数器的程序
在源程序中COUT是计数器进位输出;DOUT[3..0]是计数器的状态输出;CLK是始终输入端;RST是复位控制输入端,当RST=0时,DOUT[3..0]=0;EN是使能控制输入端,当EN=1时,计数器计数,当EN=0时,计数器保持状态不变。编译成功后进行仿真,其仿真波形如图3所示。
图 3十进制计数器的仿真波形图
在项目编译仿真成功后,将设计的十进制计数器电路设置成可调用的元件CNT10.sym,用于以下的顶层设计,如图4所示。
3
图 4十进制计数器元件CNT10.sym
4.1.2、8位十进制计数器的顶层设计
新建一个原理图编辑窗,从当前的工程目录中凋出8个十进制计数器元件CNT10.sym,并按如图5所示的8位十进制计数器的顶层原理图完成电路连接。
图 5 8位十进制计数器的顶层原理图
将以上设计的8位十进制计数器设置成可调用的元件8_CNT10.sym,以备高层设计中使用,其元件符号图如图6所示。
4
图 6 8位十进制计数器元件8_CNT10.sym
4.2、控制模块设计
频率计电路工作时先要产生一个计数允许信号(即闸门信号),闸门信号的宽度为单位时间,如1S。在闸门信号有效时间内,对被测信号计数,即为信号的频率。该频率计电路的精度取决于闸门信号T。
本设计中选取的基准信号频率为750KHz,为了得到1s高电平的周期性闸门信号,本设计采用对频率为750KHz基准信号先进行75分频,再进行3个10分频,最后进行11分频,再用非门对分频出的信号进行取非变换,这样得到的门闸信号高电平为1秒钟。
1)75进制计数器的程序如下:
5
程序 2 75进制计数器的程序
编译成功后生成元件CNT75.sym如图7所示。
图 7 75进制计数器元件图CNT75.sym
将生成的75进制计数器、10进制计数器和非门连接来得到1S高电平门闸
6
信号,如图8所示:
图 8 由10、75进制计数器和非门连接得到门闸信号
将其电路图进行仿真,其仿真波形如图9所示:
图 9 电路仿真图
对照其仿真波形,其输出门闸信号高电平为1S,符合设计,将其电路生成
7
如下元件图,以便顶层调用。如图10所示。
图10 750KHz元件图
2)控制信号发生器模块
该模块主要根据输入高电平的1S闸门信号,产生计数允许信号EN,该信号的高电平的持续时间即计数允许时间,与输入的门闸控制时钟脉冲周期相同;产生清零信号RST,在计数使能前对计数器先清零;产生存储信号LOAD,在计数结束后,利用上升沿把最新的频率测量值保存在显示寄存器中。
为了产生清零信号RST,使能信EN和存储信号LOAD。不失一般性,控制信号发生器用74161构成4分频计数器,用一个与非门,一个或非门和一个异或门实现3种译码状态,与闸门模块如图11所示连接。
图 11控制信号发生器模块连接图
编译成功后进行仿真,其仿真波形如图12所示。
图 12控制信号发生器模块仿真波形图
该功能正确无误后生成的元件符号图如图13所示。
8
图 13 750KHz控制模块元件图
5、频率计测量频率的顶层设计和仿真
在成功完成底层单元电路模块设计仿真后,可根据第3章的测频原理图,把上面的各个模块按照图14连接起来。
图 14频率计主体电路顶层原理图
对上面的测频总电路图进行仿真,其波形图如图15。
图 15频率计主体电路仿真波形图
其仿真波形正确无误。
9
第二篇:8位十进制频率计_EDA课程设计报告
EDA课程设计报告
名 称: 8位十进制频率计
学 号:
姓 名:
年级专业: 2011级电子信息工程
学 院: 物电学院
指导老师:
日 期: 20xx年6月2日
安徽师范大学物理与电子信息学院
College of Physics and Electronic Information, Anhui Normal University
1
目 录
一、设计目的···········································2
二、设计要求···········································2
三、设计思路···········································3
四、设计原理···········································3
五、设计仿真···········································3
六、实验现象···········································4
七、设计源码···········································4
八、总结···············································9 参考书目···············································9
引言
数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件教多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着现场可编程阵列FPGA的应用,以EDA工具作为开发手段,运用VHDL等硬件描述语言语言,将使整个系统大大简化,提高了系统的整体性能和可靠性。
一、课程设计目的
1)巩固和加深对“EDA技术”、“数字电子技术”的基本知识的理解,提高综
合运用本课程所学知识的能力。
2)培养学生根据课题需要选学参考书籍、查阅手册、图表和文献资料的自
学能力。通过独立思考,深入钻研相关问题,学会自己分析解决问题的方法。
3)培养硬件设计、软件设计及系统软、硬件调试的基本思路、方法和技巧,
并能熟练使用当前较流行的一些有关电路设计与分析的软件和硬件。
二、课程设计要求
1)脉冲信号的频率就是在单位时间内所产生的脉冲个数,其表达式为,f为被 2
测信号的频率,N为计数器所累积的脉冲个数,T为产生N个脉冲所需的时间。所以,在1秒时间内计数器所记录的结果,就是被测信号的频率。
2)被测频率信号取自实验箱晶体振荡器输出信号,加到主控室的输入端。
3)再取晶体振荡器的另一标准频率信号,经分频后产生各种时基脉冲:1ms,
10ms,0.1s,1s等,时基信号的选择可以控制,即量程可以改变。
4)时基信号经控制电路产生闸门信号至主控门,只有在闸门信号采样期间内(时基信号的一个周期),输入信号才通过主控门。
5)f=N/T,改变时基信号的周期T,即可得到不同的测频范围。
6)当主控门关闭时,计数器停止计数,显示器显示记录结果,此时控制电路
输出一个置零信号,将计数器和所有触发器复位,为新一次采样做好准备
三、课程设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求TESTCTL的计数使能信号TSTEN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制。当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前1秒钟的计数值锁存进32位锁存器REG32B中,并由外部的7段译码器译出并稳定显示。锁存信号之后,必须有一清零信号CLR_CNT对计数器进行清零,为下1秒钟的计数操作作准备。
寄存器REG32B设计要求是:若已有32位BCD码存在于此模块的输入口,在信号LOAD的上升沿后即被锁存到寄存器REG32B内部,并由REG32B的输出端输出,然后由7段译码器译者成能在数码管上显示输出的相应数值。
计数器CNT10设计要求:有一时钟使能输入端,用于锁定计数值。当高电平时计数允许,低电平时禁止计数。
这次设计能通过实验箱下载验证,将第一全局时钟CLK接实验箱1Hz频率信号,第二全局时钟CLK2作为待测频率输入,输出接6个数码管显示所测的频率值。
四、课程设计原理
在电子技术中,频率是最基本得参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有很多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本次设计中使用的就是直接测频法,即用计数器在计算机1S内输入信号周期的个数,其测频范围为1Hz~999999Hz。
五、设计电路的顶层结构及仿真图
这次设计有三个模块组成,测频控制信号发生器TESTCTL八个有时钟时能功能的十进制计数器CNT10和一个32位锁存器REG32B,如图:
3
顶层结构图
测频控制信号发生器TESTCTL仿真效果图
六、实验现象
从时钟源TJ4~TJ6输入一方波信号,数码管则将显示该信号的频率值,输入信号频率范围为1Hz~100MHz,频率高时有误差。另外,可从GCLK2端输入外部数字信号,进行测量。
七、设计源码
十进制计数器CNT10程序:
library ieee;
use ieee.std_logic_1164.all;
4
entity cnt10 is
port(clk: in std_logic;
clr: in std_logic;
ena: in std_logic;
cq : out integer range 0 to 9;
carry_out: out std_logic);
end cnt10;
architecture behav of cnt10 is
signal cqi: integer range 0 to 9;
begin
process(clr,clk,ena)
begin
if(clr='1') then
cqi<=0;
elsif(clk'event and clk='1') then
if(ena='1') then
if(cqi=9) then
cqi<=0;
carry_out<='1';
else
cqi<=cqi+1;
carry_out<='0';
end if;
end if;
end if;
end process;
cq<=cqi;
end behav;
作用:实现十进制计数功能。当第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零。依次递推到8个CNT10。
32位锁存器REG32B程序:
library ieee;
use ieee.std_logic_1164.all;
entity reg32b is
port( load : in std_logic;
rst: in std_logic;
din: in std_logic_vector(31 downto 0);
dout:out std_logic_vector(31 downto 0));
end reg32b;
architecture behav of reg32b is
5
signal data:std_logic_vector(31 downto 0);
begin
process(rst,load)
begin
if rst='1' then
data<=(others=>'0');
elsif(load'event and load='1') then
data<=din;
end if;
dout<=data;
end process;
end behav;
实现方式:复位信号RST为高电平时复位,为低电平时LOAD信号上升沿到来时将对输入到内部的CNT10计数信号进行锁存。
作用:锁存信号,并将结果输出给SELTIME。
测频控制信号发生器TESTCTL程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity testctl is
port(
clk : in std_logic;
tsten : out std_logic;
clr_cnt : out std_logic;
load : out std_logic);
end testctl;
architecture behav of testctl is
signal div2clk : std_logic;
begin
process(clk)
begin
if(clk'event and clk='1') then
div2clk<=not div2clk;
end if;
end process;
process(clk,div2clk)
begin
if(clk='0' and div2clk='0') then
clr_cnt<='1';
else
clr_cnt<='0';
6
end if;
end process;
load<=not div2clk;
tsten<=div2clk;
end behav;
作用:对8个CNT10产生同步使能信号TSTEN;产生一个清零信号CLR_CNT,计数完成时对8个CNT10清零;产生一个锁存信号LOAD对锁存器RED32B,对CNT10产生的信号进行锁存。
数码管译码显示DELED的程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DELED IS
PORT(
S: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
A,B,C,D,E,F,G,H: OUT STD_LOGIC);
END DELED;
ARCHITECTURE BEHAV OF DELED IS
SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL DOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
DATA<=S;
PROCESS(DATA)
BEGIN
CASE DATA IS
WHEN "0000"=>DOUT<="00111111";
WHEN "0001"=>DOUT<="00000110";
WHEN "0010"=>DOUT<="01011011";
WHEN "0011"=>DOUT<="01001111";
WHEN "0100"=>DOUT<="01100110";
WHEN "0101"=>DOUT<="01101101";
WHEN "0110"=>DOUT<="01111101";
WHEN "0111"=>DOUT<="00000111";
WHEN "1000"=>DOUT<="01111111";
WHEN "1001"=>DOUT<="01101111";
WHEN "1010"=>DOUT<="01110111";
WHEN "1011"=>DOUT<="01111100";
WHEN "1100"=>DOUT<="00111001";
WHEN "1101"=>DOUT<="01011110";
WHEN "1110"=>DOUT<="01111001";
WHEN "1111"=>DOUT<="01110001";
WHEN OTHERS=>DOUT<="00000000";
7
END CASE;
END PROCESS;
H<=DOUT(7);
G<=DOUT(6);
F<=DOUT(5);
E<=DOUT(4);
D<=DOUT(3);
C<=DOUT(2);
B<=DOUT(1);
A<=DOUT(0);
END BEHAV;
作用:将实验结果使用数码管直观的显示出来。
数码管扫描SELTTIME的程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity seltime is
port(
clk : in std_logic;
din : in std_logic_vector(31 downto 0); daout: out std_logic_vector(3 downto 0); sel : out std_logic_vector(2 downto 0)); end seltime;
architecture behav of seltime is
signal sec : std_logic_vector(2 downto 0);
begin
process(clk)
begin
if(clk'event and clk='1') then
if(sec="111") then
sec<="000";
else
sec<=sec+1;
end if;
end if;
end process;
process(sec,din(31 downto 0))
begin
case sec is
when "000"=>daout<=din(3 downto 0);
8
when "001"=>daout<=din(7 downto 4);
when "010"=>daout<=din(11 downto 8);
when "011"=>daout<=din(15 downto 12);
when "100"=>daout<=din(19 downto 16);
when "101"=>daout<=din(23 downto 20);
when "110"=>daout<=din(27 downto 24);
when "111"=>daout<=din(31 downto 28);
when others=>null;
end case;
end process;
sel<=sec;
end behav;
作用:锁存信号输出给DIN[31..0],然后由SELTIME进行扫描输出,当SEL为”000”时选通第一个CNT10,输出到DELED进行译码输出。依次类推。
八、设计总结
EDA课程设计很快就结束了,虽然在之前的学习过程中还存在着没有弄懂的问题,但是通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。
EDA设计我感觉程序调试、试验软件、硬件熟悉最重要。在编完各模块程序之后,编译查错最初有十几个错误,有输入错误、语法错误。一遍一遍的编译查错,直到没有错误。必须注意工程名和实体名一致,不然一般会出错。在没有错误之后可以进行波型仿真。若与理想的不同,再查看程序,有无原理上的编辑错误或没有查出的输入错误。
参考书目:潘松,《EDA技术使用教程》,北京,科学出版社,2006; 9