基于FPGA的数字频率计.docx
《基于FPGA的数字频率计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字频率计.docx(23页珍藏版)》请在冰点文库上搜索。
![基于FPGA的数字频率计.docx](https://file1.bingdoc.com/fileroot1/2023-7/4/4b35a220-e04d-4d54-9d1b-a94dd0a3324b/4b35a220-e04d-4d54-9d1b-a94dd0a3324b1.gif)
基于FPGA的数字频率计
基于FPGA的数字频率计
1前言
数字频率计是一种基本的测量仪器,是用数字显示被测信号频率的仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。
如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。
因此,它被广泛应用与航天、电子、测控等领域。
它的基本测量原理是,首先让被测信号与标准信号一起通过一个闸门,然后用计数器计数信号脉冲的个数,把标准时间内的计数的结果,用锁存器锁存起来,最后用显示译码器,把锁存的结果用液晶显示器显示出来。
根据数字频率计的基本原理,本文设计方案的基本思想是分为四个模块来实现其功能,即整个数字频率计系统分为分频模块、计数模块、锁存器模块和显示模块等几个单元,并且分别用VHDL对其进行编程,实现了闸门控制信号、计数电路、锁存电路、显示电路等。
而且,本设计方案还要求,被测输入信号的频率范围自动切换量程,控制小数点显示位置,并以十进制形式显示。
本文详细论述了利用VHDL硬件描述语言设计,并在EDA(电子设计自动化)工具的帮助下,用大规模可编程器件(CPLD)实现数字频率计的设计原理及相关程序。
特点是:
无论底层还是顶层文件均用VerilogHDL语言编写,避免了用电路图设计时所引起的毛刺现象;改变了以往数字电路小规模多器件组合的设计方法。
整个频率计设计在一块CPLD芯片上,与用其他方法做成的频率计相比,体积更小,性能更可靠。
该设计方案对其中部分元件进行编程,实现了闸门控制信号、多路选择电路、计数电路、位选电路、段选电路等。
频率计的测频范围:
0~100MHz。
该设计方案通过了QuartusⅡ软件仿真、硬件调试和软硬件综合测试。
2总体方案设计
2.1方案比较:
方案一:
本方案是利用电路的频率响应特性来测量频率值。
任何具有适当频率响应特性的可调无源网络都可用来测量频率值。
测频方法:
谐振测频法:
利用谐振回路测量高频(微波)信号的频率值(图2.1.2)。
调节C使回路在被测频率值上谐振,此时,可得到被测频率值fx
图2.2谐振法测频工作原理图
显示方法:
CPLD直接输出控制显示 ,本设计采用双色(红色和绿色)8*8LED点阵作为终端显示器件,在CPLD的ROM数据控制下,8*8LED点阵的每个像素点能产生红色、绿色、$(红绿混合色),能够再现颜色的多样化。
由于一般的I/O的驱动能力是有限的,CPLD中的ROM输出的显示数据需要经过驱动电路后送至8*8LED点阵的行选端(阳极),列选线(阴极)则受74HC138输出的低电平译码信号的控制。
方案二
测频方法:
CPLD测频:
CPLD作为一种新型的可编程逻辑器件,具有集成度高、逻辑电路设计方便灵活、可靠性好、工作速度快等特点,
显示方法:
由单片机产生控制时序,通过总线送给CPLD再显示
2.2方案论证:
方案一:
本方案主要对频率的模拟测量:
测频电桥是测量低频信号的频率值,谐振测量是利用谐振回路来实现对高频信号的测量。
具体实现是通过调节图2.1.2中的C使回路在被测频率值上谐振,此时便可得到待测的频率值。
然后在CPLD直接输出控制显示来控制输出部分。
方案二:
2.3方案选择
3单元模块电路设计
3.1电路设计总体框图
本设计主要由8个部分组成,以CPLD芯片部分为核心展开,待测信号输入,由外部电源,复位电路,单片机电路,液晶显示,标准时钟以及JTAG下载各个单元配合起来实现测试频率并在液晶显示屏上实时显示出数字频率信号。
图3.1电路设计总体框图
3.2标准时钟(100MHz)产生部分
本部分采用100M的有源晶振,因为有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。
有源晶振通常的用法:
一脚悬空,二脚接地,三脚接输出,四脚接电压。
相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。
对于时序要求敏感的应用,个人认为还是有源的晶振好。
R204
图3.2标准100M信号的产生电路
3.3CPLD程序下载。
Altera器件编程下载电缆有:
ByteBlaster并行下载电缆,ByteBlasterMV并行下载电缆等等。
本设计采用的是ByteBlaster并行下载电缆,它具有与PC机25针标准并行口相连的接口。
通过PC机标准并行口在线编程MAX7000S(EPM7064SLC44-10)。
与PCB电路板相连的是10针插座。
具体原理图如图3.3:
图3.3CPLD程序下载接口
注:
上图中TCK为时钟;TDO为器件输出到数据;TMS为JTAG状态机控制;TDI为配置到器件的数据。
JTAG各个接口与EPM570T144C5N相应接口相连,实现数据的下载。
3.4数字液晶显示部分。
本设计用液晶显示屏显示被测量的频率值。
设计通过单片机产生控制时序,然后通过总线送给CPLD,然后通过CPLD送出数据通过接插件JP501直接连接液晶显示屏显示数字频率。
如图3.4.1
CPLD的LCD_D[7..0]作为总线通过与外部接插件连接,实现与液晶显示屏相连。
LCD_DD0-LCD_DD7,以及LCD_RES_X0-LCD_RES_X3、LCD_RESET、片选线等等外部都连接一上拉电阻。
如图3.4.2所示。
图3.4.1液晶显示1
图3.4.2上拉电阻
3.5测频复位电路。
设计要求在测试频率过程中可以随时按照需要复位显示频率,被测频率可以重新测试。
如图3.5所示,按键K302-K306与总线KEY[4..0]相连。
当按键K303按下后,KEY1得到一个低电平,然后CPLD分析得出结论将液晶显示屏复位,等待重新测试新的频率信号。
图3.5测频复位电路
3.6核心部分(EPM570T1445N器件简介)
图3.6EPM570T1445N器件的管脚图
EPM570T1445N器件属于Altera公司MAX7000S系列,EPM570T144C5N器件包含一个二维行和列的架构实现自定义逻辑。
行和列的互连提供信号互连之间的逻辑阵列块(实验室)。
逻辑阵列组成的实验室,10个逻辑单元,在每个实验室(LE)之间。
一个LE是一小单位逻辑用户提供逻辑功能的有效实施。
实验室分为行和列上的设备。
多轨互连实验室提供快速颗粒之间的时间延迟。
括约肌之间的快速路由提供最低的时间延迟逻辑电平的增加与全球路由互连结构。
MAXII器件的I/O引脚由我I/O单元(雇主组织)在劳工顾问委员会的目的所在行和列周围设备的边缘。
每个雇主组织包含一个双向I/O缓冲区的多种高级功能。
I/O引脚支持施密特触发输入和各种单端标准,例如66兆赫,32位PCI,和LVTTL等级。
MAXII器件提供了一个全局时钟网络。
全球时钟网络的组成4全局时钟线,在整个整个设备驱动器,提供对所有时钟内资源的设备。
全球时钟线也可用于控制信号如明确,预设,或输出使能。
如图为EPM570T1445N的逻辑阵列块。
每个MAXII器件包含一个在其平面图闪存块。
在EPM240设备,此区块位于设备的左侧。
在的EPM570,EPM1270和EPM2210器件,快闪记忆体区块位于左下区的设备。
该闪存大部分分区的专用配置闪存(CFM)的块。
采用CFM块提供了非易失性存储的SRAM配置的所有信息。
采用CFM自动下载并配置逻辑和I/O上电时,提供即时的行动。
f在有关配置上电时的信息,请参阅热插拔和上电的MAXII器件章重置了MAXII器件手册。
一个闪存在MAXII器件部分划分为一个小用户数据块。
这个用户快闪记忆体(UFM)的块提供了8,192位通用用户存储。
该超滤膜提供可编程端口连接对阅读和写作逻辑阵列。
劳有三个相邻的行本块,列由设备与人数不等。
表2-1显示了每个设备的行和列数,以及行和列毗邻地区的快闪记忆体数量的EPM570,EPM1270和EPM2210器件。
长排满行延长从一排I/O块到其他。
简短的行毗邻超滤膜块,其长度是在列的宽度显示。
每一个LAB包括驱动控制信号LES的专用逻辑。
控制信号包括两个时钟,两个时钟使能,两个异步清除,1同步清除,异步预置/负载,同步载荷,加/减控制信号,提供了一次10个控制信号最大。
虽然同步负载和清除的信号通常用于执行时计数,也可以用于其他功能。
每个LAB可以使用两个时钟,两个时钟使能信号。
每个LAB的时钟和
时钟使能信号联系。
例如,任何一个LE在一个特定的LAB场合时使用labclk1信号也使用labclkena1。
如果同时使用LAB时钟上升沿和下降沿,它也同时使用LAB全时钟信号。
Deasserting时钟,使能信号关闭,LAB宽的时钟。
每个LAB可以使用两个异步明确信号,异步加载/预置信号。
默认情况下,QuartusII软件使用非门的回推技术,实现预设。
如果您禁用非门推回选项或指定某一登记电力成立的高科技使用QuartusII软件,预设然后通过使用该异步异步加载数据输入负荷信号并列高。
最小的逻辑了MAXII结构单位是LES,它结构紧凑,提供高效利用先进的逻辑功能。
每个LES包含4输入LUT,这是一个函数发生器,可以实现任何四个变量的函数。
另外,每个lES包含一个可编程的登记和进位链选择能力。
单一LES还支持动态的单位加法或减法模式LAB选择一个全控制信号。
每个LES驱动所有类型的互连:
局部的,行,列,LUT链,显示链和DirectLink互连。
每个LE的可编程寄存器可配置为D,T,JK,或SR操作。
每个寄存器有数据,真正的异步加载数据,时钟,时钟使能,清除,异步加载/预设的投入。
全球信号,通用I/O引脚,或任何LE’S可驱动登记的时钟和明确的控制信号。
无论通用的I/O引脚或括约肌可以驱动时钟使能,预设,异步加载,和异步数据。
异步加载数据输入来自为LE’S输入的data3。
为了组合功能,LUT的输出绕过登记和直接驱动的LE产出。
每个LE有三个输出,推动本地,行和列的布线资源。
那个或注册LUT的输出可以驱动这三个独立的产出。
双LE产出驱动器列或行和DirectLink路由连接和一个本地驱动器互连资源。
这使得LUT的一个输出驱动,而寄存器驱动器的另一个输出。
这个寄存器包装功能改善了设备的利用率因为该设备可以使用选民登记册和功能,用户终端无关。
另外的特殊包装模式允许寄存器的输出反馈到同一LUT的回LE以便登记的包装有自己的扇出LUT的。
这提供了另机制改善配件。
3.7电源部分
CPLD芯片工作电压在3.3V,单片机工作电压为5V。
所以,在要求进行电压转换时,用到芯片LM1117进行5V电压到3.3V电压。
3.8单片机部分
3.8.1STC12_LQFP芯片介绍
如图3.8.1所示,STC12系列单片机为增强型8051芯片,1T,单时钟/机器周期,指令代码完全兼容传统8051单片机。
通用I/O口(27/23/15个),复位后为:
准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:
准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不得超过55mA。
ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片,EEPROM功能,看门狗定时器内部集成MAX810专用复位电路(外部晶体20M以下时,可省外部复位电路)。
时钟源:
外部高精度晶体/时钟,内部R/C振荡器
用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟
常温下内部R/C振荡器频率为:
5.2MHz~6.8MHz精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,应认为是4MHz~8MHz。
STC12_LQFP芯片是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC12_LQFP为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
STC12_LQFP具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC12_LQFP可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3.8.2控制单元
如图3.8.1所示,STC12_LQFP芯片具有4个串口P0-P3,各个串口不仅作为普通的I/O口用,还可以作为第二功能用。
外围有一个无源晶振,晶振为11.0592MHz的,为单片机提供时钟信号,从XTAL1和XTAL2输入,RESET信号连接到芯片复位引脚上面,提供芯片复位作用。
图3.8.2单片机控制单元
4软件设计
4.1VerilogHDL和原理图输入模块组成框图。
数字频率计基本原理是用计数器来计算1s内输入信号周期的个数。
如图3-1所示是6位六位七段显示器数字频率计的系统方框原理图,它由一个测频控制信号发生器,一个有时钟使能的计数器,一个锁存器REG,一个译码电路组成和一个实现位扫描电路。
图4.1软件设计模块原理框图
图4.2原理图输入设计总图
4.2分频电路
4.7.11Hz的标准时钟信号。
1Hz的标准时钟信号是由对2MHz的信号进行2M分频得到的。
其文本输入设计(VerilogHDL)为:
modulemediv(clk,clkdiv);//clk为2MHz的信号输入,clkdiv为输出1Hz标准信号
inputclk;
outputclkdiv;
regclkdiv;
reg[19:
0]q;
always@(posedgeclk)
begin
if(q==999999)//当计数计到999999后再将clkdiv取反;
begin
clkdiv<=!
clkdiv;
q<=0;
end
else//如果不够999999则继续计数;
q<=q+1;
end
endmodule
4.2.2500Hz的扫描时钟。
500Hz的标准时钟信号是由对2MHz的信号进行4000分频得到的。
其文本输入设计(VerilogHDL)为:
modulemediv2(clk,clkdiv);//clk为2MHz的信号输入,clkdiv输出500Hz标准信号
inputclk;
outputclkdiv;
regclkdiv;
reg[19:
0]q;
always@(posedgeclk)
begin
if(q==1999)//当计数计到1999后再将clkdiv取反;
begin
clkdiv<=!
clkdiv;
q<=0;
end
else//如果不够1999则继续计数;
q<=q+1;
end
4.8测频控制信号发生器模块:
输入信号:
clkdiv2.
输出信号:
tsten计数使能信号;clr计数器清零信号;load锁存信号。
逻辑功能:
产生1s脉宽的周期信号,并根据测频需要产生相应的计数器清零信号和锁存信号。
源程序为:
testcontrol.v
moduletestcontrol(clkdiv2,tsten,clr,load);
inputclkdiv2;
outputtsten,clr,load;
regclr;
wiretsten,load;
regdiv2clk;
always@(posedgeclkdiv2)
div2clk<=!
div2clk;
always@(clkdiv2ordiv2clk)
if(!
clkdiv2&!
div2clk)
clr<=1;
else
clr<=0;
assignload=!
div2clk;
assigntsten=div2clk;
endmodule
4.9十进制计数模块.
4.4.1单个十进制计数模块。
输入信号:
ena输入时钟使能信号;clk为输入清零信号;clr为输入时钟触发信号。
输出信号:
cq[3..0]输出BCD码;cot为输出计数器进位信号。
逻辑功能:
ena为高电平时计数,CLK为输入时钟变量,CLR为高电平时计数器清零,当计数器到9时,COT为高电平。
源文件为mecount10.v
modulemecount10(ena,clk,clr,cq,cot);
inputena,clk,clr;
outputcot;
output[3:
0]cq;
regcot;
reg[3:
0]cq;
always@(posedgeclkorposedgeclr)
begin
if(clr)
cq<=0;
elseif(ena)
begin
if(cq==9)
begin
cq<=cq+1;
cot<=0;
end
end
end
endmodule
4.4.26位十进制计数器模块。
输入信号:
ena输入时钟使能信号;clk为输入清零信号;clr为输入时钟触发信号。
输出信号:
dout[3:
0]到dout[23:
0]输出6个计数器的计数值(BCD码)。
逻辑功能:
ena为高电平时计数,为低电平时保持所计的值。
Clk为时钟信号输入。
Clr为高电平是计数器清零。
图4.36位计数器原理图
4.5输出信号锁存器
输入信号:
LOAD锁存器锁存信号DIN0,DIN1,DIN2,DIN3,DIN4,DIN5,6个计数器输出的4位BCD码。
输出信号:
DOUT[23..0]6位输出显示
逻辑功能:
当LOAD信号上跳时,将输入的BCD码送到输出端,由于接收的是6个计数器的输出信号,因此输入信号是6个4位而不是一个24位。
由六位七段显示器显示。
源文件为alereg.v
modulealereg(din0,din1,din2,din3,din4,din5,dout,load);
input[3:
0]din0,din1,din2,din3,din4,din5;
inputload;
output[23:
0]dout;
reg[23:
0]dout;
always@(posedgeload)
dout[23:
0]<={din5[3:
0],din4[3:
0],din3[3:
0],din2[3:
0],din1[3:
0],din0[3:
0]};
endmodule
4.624—4选择器。
modulexz24_4(din,a,dout);
input[2:
0]a;
input[23:
0]din;
output[3:
0]dout;
reg[3:
0]dout;
always@(a)
case(a)
3'b000:
dout<=din[3:
0];
3'b001:
dout<=din[7:
4];
3'b010:
dout<=din[11:
8];
3'b011:
dout<=din[15:
12];
3'b100:
dout<=din[19:
16];
3'b101:
dout<=din[23:
20];
3'b110:
dout<=din[3:
0];
3'b111:
dout<=din[7:
4];
endcase
endmodule
4.7译码动态扫描。
4.7.1译码器。
输入信号:
din[3:
0]输入4位BCD码。
输出信号:
dout[7:
0]输出4位BCD码对应的7位二进制码。
源文件为trans48.v。
moduletrans48(din,dout);
input[3:
0]din;
output[7:
0]dout;
reg[7:
0]dout;
always@(din)
case(din)
4'b0000:
dout<=8'b11111100;
4'b0001:
dout<=8'b01100000;
4'b0010:
dout<=8'b11011010;
4'b0110:
dout<=8'b00111110;
4'b0111:
dout<=8'b11100000;
4'b1000:
dout<=8'b11111110;
4'b1001:
dout<=8'b11110110;
default:
dout<=8'b00000000;
endcase
endmodule
4.7.2动态扫描电路。
(1)6进制计数器。
modulemeadd(clk,q);
inputclk;
output[2:
0]q;
reg[2:
0]q;
always@(posedgeclk)
if(q==3'b101)
q<=0;
else
q<=q+1;
endmodule
(2)3—8译码器。
moduleyima38(a,y);
input[2:
0]a;
output[7:
0]y;
reg[7:
0]y;
always@(a)
case(a)
3'b000:
y=8'b11111110;
3'b001:
y=8'b11111101;
3'b010:
y=8'b11111011;
3'b011:
y=8'b11110111;
3'b100:
y=8'b11101111;
3'b101:
y=8'b11011111;
3'b110:
y=8'b10111111;
3'b111:
y=8'b01111111;
endcase
endmodule
注意:
24—4选择器,500Hz的扫描脉冲,6进制的计数器和3—8的译码器要配合使用才能实现6位动态数码管的显示。
5系统调试
由于本次设计没有作出相应的硬件来,故只存在软件调试。
5.1分频模块调试。
由于本方案采用的标准时钟是由2M有源晶振产生2mHz的全局时钟。
而且都是2M和4000分频这对于QuartusII6.0软件来说无法仿真,故后续仿真均建立在输入的门口信号为1Hz,扫描信号为2Hz的基础上。
5.2测频控制信号发生器模块调试。
调试方法为设定其输入量,观察其输出是否符合设计要求。
其仿真波形为:
图5.1测频控制信号发生器模块仿真波形
注:
ena信号为对clk输入信号的2分频。
在5.1中我们假设过输入信号为1Hz,经过2分频后就产生了脉宽为1s的计数使能信号。
并根据测频需要产生相应的计数器清零信号clr和锁存信号load;仿真结果符合要求。
5.36位十进制计数器模块调试。
调试方法