自制基于CPLD的多功能计数测频仪

时间:2022-07-29 02:57:51

在设计单片机和数字电路时经常需要测量脉冲个数、脉冲宽度、脉冲周期、脉冲频率等参数,虽然使用逻辑分析仪可以很好地测量这些参数,但其价格过于昂贵。笔者基于Altera公司的EPM7064SLC可编程逻辑芯片(CPLD),设计了一种多功能计数测频仪,可以进行脉冲计数,测量脉冲宽度、周期和频率,实现了一部分逻辑分析的功能。

系统简介

1.系统功能

笔者自制的这套多功能计数测频仪有计数、测频、测宽、测周四种工作模式,计数、测频时,可以测量最高50MHz的输入脉冲信号;测宽、测周时,时间分辨率为50ns,可以测量脉冲宽度(周期)长达200s的脉冲信号。

本系统的核心是基于CPLD的32位计数器及相应控制逻辑,它完成所有的计数、测量功能,对应于四种工作模式,计数器的计数值分别为:脉冲计数、脉冲频率、脉冲宽度和脉冲周期;本系统采用8个数码管作为系统的输出,测量结果以十六进制格式在数码管上显示输出;本系统中,计数、测频时可以选择被测脉冲的有效沿,测宽时可以选择被测脉冲的有效电平;本系统通过四个轻触按键控制系统的工作状态,四个按键分别用于:计数器清零、选择计数有效沿、选择工作模式、启动测量。

2.系统工作原理

在脉冲计数模式下,直接将被测脉冲输入作为计数器的时钟,每个被测脉冲的有效沿计数器加1,数码管上显示的数值就是当前的脉冲计数。在计数过程中可以随时通过“计数器清零”按键来清零计数器,也可以通过“选择计数有效沿”按键选择被测脉冲的有效沿。

测量脉冲频率时,仍将被测输入信号作为计数器时钟,同时使用系统内的1Hz时钟信号来启动和终止计数器计数,按下“启动测量”按键后,在相邻的1Hz时钟的上升沿启动计数器计数,下一个1Hz时钟上升沿停止计数器计数,则计数停止后计数器的值就是被测信号的频率。

测量脉冲宽度时,将系统的20MHz时钟作为计数器的时钟,计数器仅在按下“启动测量”按键后的相邻被测信号的有效电平期间计数,计数停止后计数器的值就是被测信号的脉冲宽度(以50ns为单位)。

测量脉冲周期时,将系统的20MHz时钟作为计数器的时钟,按下“启动测量”按键后,在相邻的被测脉冲信号的有效沿处启动计数器计数,下一个脉冲信号有效沿停止计数器计数,则计数停止后计数器的值就是被测信号的周期(以50ns为单位)。

3. 系统构成

系统由一片CPLD、8个数码管、4个按键、几片74XX逻辑芯片构成,电路由键盘模块、时钟模块、显示模块和CPLD核心模块四部分构成,如图1所示。它使用一片CPLD作为系统核心,把原本需要多片门电路完成的计数和控制逻辑集成到一片EPM7064可编程逻辑芯片中,不但缩小了电路板的面积、降低了系统功耗、使系统工作更加稳定可靠,而且可以非常方便地通过重新编程CPLD芯片实现系统功能的修改和升级。

键盘模块 键盘模块由四个轻触按键构成,每个轻触按键都是一端接地,另一端用10kΩ电阻上拉、并连接到CPLD。

时钟模块 时钟模块为CPLD提供测量脉冲宽度和周期使用的20MHz、测量频率使用的1Hz以及显示使用的512Hz时钟信号。这三种时钟信号使用了20MHz和32768Hz钟表晶振两个晶体振荡源,1Hz和512Hz信号分别由32768Hz信号经32768和64分频得到。

显示模块 显示模块将本系统的测量值以8位十六进制数字的格式显示输出于8个数码管,8个数码管轮流显示,扫描频率为64Hz;十六进制7段译码电路在CPLD中实现,显示模块接收从CPLD发来的7段数码信号和位选信号,7段数码信号同时送给8个数码管,位选信号经3-8译码后,选择某位数码管显示,通过不同的7段数码信号和位选信号可以实现8个数码管的轮流显示、实现8位十六进制数字的输出。为了保证数码管的亮度,显示模块使用了三极管扩展显示电流。

CPLD核心模块 本模块是系统的核心,最重要的是其功能的设计,将在下面详细介绍。

4. CPLD的设计

CPLD的设计采用了Altera公司提供的MaxPlusII软件,综合使用了原理图和硬件描述语言,顶层使用原理图进行描述,各个模块单元使用AHDL硬件描述语言进行描述。

CPLD接收按键输入、时钟输入和被测脉冲信号输入,并将测量结果以扫描的方式发送给显示模块在数码管进行显示。CPLD的设计分为计数控制单元、计数器单元、显示单元3个单元,其关系如图2所示。

计数控制单元 计数控制单元控制整个系统的工作状态,它接收按键、时钟、被测信号输入,输出计数脉冲到计数器单元。计数控制单元完成选择计数有效沿、切换工作模式、启动测量及自动终止功能。

选择计数有效沿(脉冲有效电平)是通过将被测脉冲输入信号与“有效沿选择寄存器”异或而实现的,其描述如下:

EdgeSelect.clk

= nEdgeSelBut;

% 有效沿选择寄存器%

EdgeSelect

= !EdgeSelect;

%轻触按键,则翻转有效沿%

Signal

=SignalIn xor EdgeSelect;

通过选择计数器的计数时钟可以切换工作模式,其描述如下:

WorkingMode[].clk

=ModeBut;

%工作模式寄存器%

WorkingMode[]

=WorkingMode[] + 1;

%轻触按键,则切换 工作模式%

Case WorkingMode[]is

%选择计数器的计数 时钟%

When H"0"=> CounterClk =Signal;

%脉冲计数%

When H"1"=> CounterClk =Signal and OneSec;

%测频%

When H"2"=> CounterClk =Signal and PulseWidth and Clock20M; %测脉宽%

When H"3"=> CounterClk =PulseWidth and Clock20M; %测周期%

End Case;

测量脉冲频率的启动与自动终止控制描述如下:

En1SCount.clk

=nStartBut;

%捕获启动按键%

En1SCount.clrn

=!OneSec;

%测量开始后清除捕获%

En1SCOunt

=VCC;

OneSec.clk

=Clock1S;

%每秒钟监测启动与自动终止%

OneSec.clrn

=nClearBut and !ModeBut;

OneSec

=En1SCount;

%确定测量启动与自动终止%

测量脉冲宽度与周期的启动与自动终止控制描述如下:

CanPulse.clk

=nStartBut;

%捕获启动按键%

CanPulse.clrn

=!PulseWidth;

%测量开始后清除捕获%

CanPulse

=VCC;

PulseWidth.clk

=!Signal;

%监测启动与自动终止%

PulseWidth.clrn

=nClearBut and !ModeBut;

PulseWidth

=CanPulse;

%确定测量启动与自动终止%

计数器单元 计数器单元是一个32位的计数器,它接收计数控制单元输出的计数脉冲,把此脉冲作为计数器的计数时钟,计数值送给显示单元进行显示。计数器单元由32位寄存器组成,其时钟通过控制单元控制,描述如下:

Counter[].clk

=CounterClk;

%计数时钟%

Counter[]

=Counter[] + 1;

%加1计数%

Counter[].clrn

=nClearBut and !ModeBut;

%异步清零%

显示单元 显示单元接收32位的计数值,将计数值分为8组,每组4位,在512Hz的显示时钟控制下,轮流选择其中一组,对其计数值进行十六进制7段译码,将译码后的7段信息以及当前组的编号输出CPLD,由CPLD的显示模块显示在相应的数码管上。

显示单元完成十六进制7段译码、扫描输出等功能。扫描输出的语言描述如下:

DispScan[].clk

=Clock512;

DispScan[]

=DispScan[] + 1;

十六进制7段译码的语言描述如下:

Table

NumDisplay[]

=>Num7Seg[];

H"0"

=>B"1111110";

H"1"

=>B"0110000";

H"2"

=>B"1101101";

H"3"

=>B"1111001";

H"4"

=>B"0110011";

H"5"

=>B"1011011";

H"6"

=>B"1011111";

H"7"

=>B"1110000";

H"8"

=>B"1111111";

H"9"

=>B"1111011";

H"A"

=>B"1110111";

H"B"

=>B"0011111";

H"C"

=>B"1001110";

H"D"

=>B"0111101";

H"E"

=>B"1001111";

H"F"

=>B"1000111";

End Table;

CPLD的编程 设计完CPLD的功能后,将CPLD的JTAG接口通过下载电缆连接到计算机打印口,使用MaxPlusII软件即可编译设计并下载到CPLD芯片内。

小 结

本系统基于一片CPLD芯片,实现了脉冲计数、测周、测频等功能,可以完成部分逻辑分析仪的功能。通过自制本系统,既可以学习CPLD的设计,又制作了一台实用的工具,值得广大电子爱好者一试。

上一篇:一种防止程序跑飞的“热启动”方法 下一篇:基于GSM技术的GPS定位及跟踪系统