霍旭阳
在设计单片机和数字电路时经常需要测量脉冲个数、脉冲宽度、脉冲周期、脉冲频率等参数,虽然使用逻辑分析仪可以很好地测量这些参数,但其价格过于昂贵。笔者基于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的设计,又制作了一台实用的工具,值得广大电子爱好者一试。