基于CPLD的含倍频器的数字频率计

更新时间:2023-10-19 07:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于CPLD的含倍频器的数字频率计

目录

引言2222222222222222222222222222222222222222222222222页

方案设计222222222222222222222222222222222222222222223页

总体设计222222222222222222222222222222222222222222225页

单元电路及软件模块设计2222222222222222222222222222226页

单元电路测试2222222222222222222222222222222222222215页

附录222222222222222222222222222222222222222222222216页

参考文献2222222222222222222222222222222222222222220页

- 1 -

一、引言

基于CPLD的数字频率计设计,它由锁相环倍频器、及基于CPLD的测频单元两部分组成,可以将待测频率放大一百倍之后通过测频单元,由于CPLD往往存在一个波形的误差,将待测频率放大一百倍后,误差变为以前的百分之一,这样就大大提高了测频计的精度。传统的频率计直接测量低频的待测频率,精度不高,本设计改善了这点。

本设计达到的技术要求:(1)在0Hz~400Hz时倍频器能将输入信号倍频一百倍;(2)倍频器的误差范围±0.5Hz;(3)测频计有两个四联排的数码管构成,测频范围在2Hz~3MHz之间。 二、方案设计 1、方案选择

(1)基于CPLD的数字频率计:该方案选择QUARTUS‖作为软件平台,用EPM240核心板及外围硬件实现数字频率计的功能。 软件框图如下:

主控制模块 八位十进制计数器 32位锁存器 LED显示控制模块 译码器显示模块 显示

- 2 -

硬件框图如下:

倍频器工作原理电路

①倍频电路可以把待测频率放大100倍后通过测频单元,可以将误差减小到原来的1/100。

②对低频信号做放大100倍处理减小误差,高频信号直接测量频率,从而实现了测频计的高精度。 (2)基于单片机的数字频率计:

3、方案确定

在传统的控制系统中,通常将单片机作为控制核心并辅以相应的元器件构成一个整体。但这种方法硬件连线复杂、可靠性差,且在实际应用中往往需要外加扩展芯片,这无疑会增大控制系统的体积,还会增加引入干扰的可能性。对一些体积小的控制系统,要求以尽可能小的器件体积实现尽可能复杂的控制功能,直接应用单片机及其扩展芯片就难以达到所期望的效果。复杂可编程逻辑器件(CPLD)具有集成度高、运算速度快、开发周期短等特点,它的出现,改变了数字

- 3 -

电路的设计方法、增强了设计的灵活性。

按以上两个方案,单片机实现数字频率计的设计较为简单,直接应用到单片机内部的计数器,但考虑到单片机的课程尚未完成,且高频时测量误差较大,而方案一具有设计方便,精度较高,并且经过金工实习,使用起来也更加方便。所以我们小组选用方案一作为本次设计的最终方案。 4、理论分析与方案论证

基于CPLD的含倍频器的数字频率计由锁相环倍频器和数字频率计两部分组成,将待测频率用倍频器放大一百倍后通过数字频率计,频率计的内部为八位十进制计数器提供1s的计数时间,为了消除周期性清零而引起的闪烁,将这个计得的数送给32位锁存器,进而通过LED显示控制模块及七段译码模块将锁存器中的数通过数码管输出。

基于CPLD的数字频率计:主控制模块的输入为一个1Hz的时钟信号,并为整个程序提供计数信号,计数器清零信号及锁存信号,将1Hz的时钟信号二分频作为计数使能信号,将这个使能信号反相180°作为锁存器的锁存信号,清零端在锁存后的0.5秒给计数器清零。控制电路为整个频率计提供工作时序,控制器能在无延时的条件下工作,是每个模块正常工作的前提条件。

锁相环倍频器:①属于高频电子的范围,焊接时各个焊点之间可能形成耦合电容,由此会对电路测试产生一定的影响;②合适的工作电压对于电路正常工作也非常重要,如果不在合适的电压下工作也不

- 4 -

会产生倍频的现象。

三、总体设计

锁相环倍频系统由两块CMOS集成电路CD4046、CD4518等元件组成。CD 4046是双十进制同步计数器,在锁相环倍频电路的反馈支路中,作N=100分频器;CD4046为数字锁相环,内部由两个相位比较器、压控振荡器VCD(附有跟随器)、稳压管组成。在锁相环的外部引脚中,9脚和4脚分别为VCD的输入、输出端;5脚为VCD的禁止输出端,5脚为1时,禁止VCD输出;15脚为内部稳压管负极;6、7脚和11、12脚分别为VCD的外接振荡电容、电阻端;10脚为解调输出端。基于CPLD的含倍频器的数字频率计由锁相环倍频器和数字频率计两部分组成。将由锁相环倍频器倍频后的待测频率通过频率计,主控制模块的输入为一个1Hz的时钟信号,并为整个程序提供计数信号,计数器清零信号及锁存信号,将1Hz的时钟信号二分频作为计数使能信号,将这个使能信号反相180°作为锁存器的锁存信号,清零端在锁存后的0.5秒给计数器清零。当计数使能端置‘1’之后,计数器开始计数,此时锁存器的锁存信号为零,锁存器不工作,1s后,计数器停止计数,锁存器进入锁存状态,并把这个锁存的值给七段译码器,最后由二极管显示这个计数值,而这个计数值也就是待测频率的频率值。

四、单元电路及软件模块设计

锁相环倍频器由两个CMOS集成电路芯片CD4046和CD4518组成,

- 5 -

外围电路的原器件的参数如下:R1=1MΩ、R2=20KΩ、R3=100KΩ、C1=2.2μF、C2=1000pF。电路图如下:

软件模块如下:

1、分频器:为二极管的片选提供扫描时钟; library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity fp is

port(osc_clk:in std_logic; work_clk:out std_logic); end fp;

architecture aa of fp is

signal clk_cnt:integer range 0 to 1000; begin

process(osc_clk) begin

if(osc_clk'event and osc_clk='1')then clk_cnt<=clk_cnt+1; end if; end process;

- 6 -

work_clk<='1' when clk_cnt=1000 else '0'; end aa;

2、主控制模块:clk为1Hz的工作时钟,ena为0.5Hz,load与ena反相180°,clk_cnt在load的0.5s之后清零。

Library ieee;

Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity control1 is Port(clk:in std_logic; ena,load,clr_cnt:out std_logic); end control1;

architecture aa of control1 is signal cqi:std_logic; begin process(clk) begin

if(clk'event and clk='1')then cqi<=not cqi; end if; end process; process(clk,cqi)

- 7 -

begin

if clk='0' and cqi='0' then clr_cnt<='1'; else clr_cnt<='0'; end if; end process; load<=not cqi; ena<=cqi; end aa;

3、八位十进制计数器:由八个十进制计数器构成,clk作为被测频率,cq为计数的个位,进位由cout赋给下一个计数器的clk端。

Library ieee;

Use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;

Entity cnt_10 is Port(clk:in std_logic; clr:in std_logic; ena:in std_logic;

cq:out integer range 0 to 15; cout:out std_logic);

- 8 -

end cnt_10;

architecture cc of cnt_10 is signal cqi:integer range 0 to 15; begin

process(clk,ena,clr) begin

if(clr='1')then cqi<=0;

elsif clk'event and clk='1' then if ena='1'then if cqi<9 then cqi<=cqi+1; cout<='0'; elsif cqi<=9 then cqi<=0; cout<='1'; end if;

elsif ena='0' then cqi<=0; end if; end if; cq<=cqi;

- 9 -

end process; end cc;

4、32位锁存器模块:为了消除由于周期清零而引起的闪烁,当锁存信号为‘1’后,输入与输出相等,达到锁存的目的。 Library ieee;

Use ieee.std_logic_1164.all; Use ieee.std_logic_unsigned.all; Entity latch32b is Port(load:in std_logic;

din:in std_logic_vector(31 downto 0); dout:out std_logic_vector(31 downto 0)); end latch32b;

architecture ee of latch32b is begin process(load) begin

if(load'event and load='1')then dout<=din; end if; end process; end ee;

5、七段译码器模块:clk与主控制模块的时钟相同,达到动态

- 10 -

扫描的目的,并由Y进行断码输出。

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity segtwo is port(clk:in std_logic;

a,b,c,d,e,f,g,h:in std_logic_vector(3 downto 0); com:out std_logic_vector(7 downto 0); Y:out std_logic_vector(7 downto 0)); end segtwo;

architecture aa of segtwo is

signal q:std_logic_vector(3 downto 0); signal n:std_logic_vector(2 downto 0); begin process(clk) begin

if(clk'event and clk='1')then n<=n+1; end if;

- 11 -

end process;

with n select q<=a when\ b when\ c when\ d when\ e when\ f when\ g when\ h when\

with n select

com<=\ \ \ \ \ \ \ \ \

- 12 -

with q select

Y<=\ \ \ \ \ \ \ \ \ \ \end aa;

6、整体设计图见附录。

7、1Hz时钟信号发生电路:由89C52单片机的定时器实现该功能,每次定时20ms,循环50次,主要程序如下:

#include #include #include #define uint unsigned int #define uchar unsigned char

- 13 -

sbit fangbo=P1^0; uint i; void main(void) { i=0; EA=0;

TMOD=0x01;//定时器0工作于方式1: 16位 TH0=0xfc; TL0=0x18;// 221 ET0=1; EA=1; TR0=1; while(1); }

void timer_0 (void) interrupt 1 using 2 { TR0=0; TH0=0xfc;

TL0=0x18; // 221 TR0=1; i=i+1; if(i>=492)

- 14 -

{

fangbo=~fangbo; i=0; } }

五、单元电路测试 主控制模块仿真图:

由时序仿真可以看出输出与输入之间有些许的延时

计数器模块仿真图:

图示待测频率clk的周期为0.04s,即频率25Hz.

- 15 -

【附录】

倍频器电路图

图一

图二

- 16 -

CD4046芯片内部原理图:

图三

图四

- 17 -

CD4518引脚列表 表一: 引脚 1 9 7 15 2 10 3 4 5 6 符号 CLOCK RESET ENABLE Q1A-Q4A 功能 时钟输入端 消除端 计数允许控制端 计数输出端 计数输出端 地 电源正 11 12 13 14 Q1B-Q4B 8 16

VSS VDD - 18 -

整体设计图

图五

- 19 -

参考文献:

1、电子技术基础 王应吉 2、高频电子线路实验书 王应吉 3、EDA技术与CPLD/FPGA开发应用简明教程

- 20 -

本文来源:https://www.bwwdw.com/article/hiof.html

Top