校赛一等奖基于FPGA的数字频率计设计李博 赵本东 李安冬.docx
- 文档编号:6226399
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:34
- 大小:575.50KB
校赛一等奖基于FPGA的数字频率计设计李博 赵本东 李安冬.docx
《校赛一等奖基于FPGA的数字频率计设计李博 赵本东 李安冬.docx》由会员分享,可在线阅读,更多相关《校赛一等奖基于FPGA的数字频率计设计李博 赵本东 李安冬.docx(34页珍藏版)》请在冰豆网上搜索。
校赛一等奖基于FPGA的数字频率计设计李博赵本东李安冬
基于FPGA和单片机
的数字频率计
设计
设计者:
李博
200904015010
赵本东
200904015034
李安冬
200904015009
院别:
四院
摘要:
传统测量频率的方法主要有直接测量法、分频测量法、测周法等,这些方法往往只适用于测量一段频率,当被测信号的频率发生变化时,测量的精度就会下降。
本文提出一种基于等精度原理的测量频率的方法,在整个频率测量过程中都能达到相同的测量精度,而与被测信号的频率变化无关。
本文利用FPGA(现场可编程门阵列)的高速数据处理能力,实现对被测信号的测量计数;利用单片机的运算和控制能力,实现对频率、周期、脉冲宽度、占空比、相位差等参数的计算及显示,并可通过调整闸门时间预置测量精度,使两者有机地结合起来。
在QuartusⅡ8.0EDA(电子设计自动化)开发平台上进行仿真、测试,并最终下载到FPGA芯片内部。
关键词等精度测量,单片机,频率计,FPGA
引言:
测量频率是电子测量技术中最常见的测量之一。
不少物理量的测量,如时间、速度等都涉及到或本身可转化为频率的测量。
基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性,如直接测量法、周期测量法等,这几种测量法的精度都与被测信号有关,因而它们属于非等精度测量法。
而等精度频率计不但具有较高的测量精度,而且在整个测频区域内保持恒定的测试精度。
等精度测量法原理:
等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。
在计数允许时间内,同时对标准信号和被测信号进行计数,再通过数学公式推导得到被测信号的频率。
由于门控信号是被测信号的整数倍,就消除了对被测信号产生的±1误差,但是会产生对标准信号±1的误差。
如图1所示。
系统中,如果采用的标准信号源的精度很高,就可以达到一个很高的测量精度,一般情况下都是采用晶体作为标准信号源,因此可以达到很高的精度,满足一般系统的要求。
1频率测量模块
设在一次预置门时间Tpr内对被测信号的计数值为Nx,对标准信号的计数值为Ns。
则下式成立:
fx/Nx=fs/Ns
由此推得:
fx=fs*Nx/Ns
若所测频率值为fx,其真实值为fxe,标准频率为fs,一次测量中,由于fx计数的起停时间都是该信号的上跳沿触发的,因此在Tpr时间内对fx的计数Nx无误差,在此时间内的计数Ns最多相差一个脉冲,即fx/Nx=fs/Ns,则下式成立:
fxe/Nx=fs/Ns+△et
可分别推得fx=fs*Nx/Nsfxe=fs*Nx/Ns+△et
根据相对误差的公式有:
△fxe/fxe=fxe-fx/fxe
经整理可得到:
△fxe/fxe=△et/Ns
因△et≤1,故△fxe/fxe≤1/NsNs=Tpr*fs
根据以上分析,我们可知等精度测频法具有三个特点:
1,相对测量误差与被测频率的高低无关;
2,增大Tpr或fs可以增大Ns,减少测量误差,提高测量精度;
3,测量精度与预置门宽度和标准频率有关,与被测信号的频率无关,在预置门和常规测频闸门时间相同而被测信号频率不同的情况下,等精度测量法的测量精度不变;
2周期测量模块
等精度周期测量法:
该方法在测量电路和测量精度上与等精度测量完
全相同,只是在进行计算时公式不同,在周期1/T代换频率f即可,其计算公式为Tx=Ts*Ns/Nx
3脉宽测量模块
在进行脉冲宽度测量时,首先经信号处理电路进行处理,脉冲边沿被处理得非常陡峭,然后送入测量计数器进行测量。
测量电路在检测到脉冲信号的上升沿时打开计数器,在下降沿是关闭计数器,设脉冲宽度为Twx,计算公式为:
Twx=Nx/fs。
4占空比测量模块
测一次脉冲信号的脉宽,记录其值为Twx,通过下式计算占空比:
占空比=Twx/Tx*100%
5相位差测量模块
信号fs与信号fR经放大整形后得到的方波送入由异或门组成的相位比较电路,其输出脉冲A的脉宽tp反映了两列信号的相位差;
相位差=tp/(2*tx)*100%
系统总体设计方案:
等精度数字频率计涉及到的计算包括加、减、乘、除,耗用的资源比较大,用一般中小规模的FPGA芯片难以实现。
因此,我们选择单片机和FPGA的结合来实现。
电路系统原理图如图所示,其中单片机完成整个测量电路的测试控制、数据处理和显示输出;FPGA完成测频功能。
显示电路采用LCD动态显示,由单片机P2口直接驱动
等精度频率计主要由由以下几个部分构成:
①信号放大整形电路:
用于对待测信号进行放大整形,以便作为FPGA的输入信号。
②测频电路:
是测频的核心模块,由FPGA担任。
③单片机模块:
用于控制FPGA的测频操作和读取测频数据,并发出相应数据处理。
安排单片机的P1口直接读取测试数据。
控制命令从P0口的相关口线发出。
④50MHz的标准频率信号源:
本模块采用FPGA内部锁相环PLL(PhaseLockLoop)倍频技术,倍频出一个100MHz标准频率信号源,产生100MHz的标准频率给FPGA使用。
FPGA测频模块逻辑设计
与单片机的接口按照如下方式连接:
1单片机的P1口接8位数据DATA[7..0],负责读取测频数据;
2START信号输出到单片机的P3.2口线,通过中断的方式来判断计数是否结束,以确定何时可以读取数据;
3P0口第四位与SEL[3..0]相接,用于控制多路数据选择器。
当SEL分别为“0000”、“0001”、“0010”、“0011”时,由低8位到高8位读出标准频率计数值;
当SEL分别为“0100”、“0101”、“0110”、“0111”时,由低8位到高8位读出待测频率计数值;
当SEL分别为“1000”、“1001”、“1010”、“1011”时,由低8位到高8位读出信号带宽计数值;
当SEL分别为“1100”、“1101”、“1110”、“1111”时,由低8位到高8位读出信号相位差计数值。
图2-2等精度频率计FPGA部分的RTL电路图
4P0.4接预置门控信号CL,CL是由定时器T0产生的一个周期为1S的方波信号,即每隔1S钟左右测试一次频率,频率低于1Hz后,测频的间隔会大于1S钟,特别是待测频率为0.1Hz时,每隔10S钟测试一次。
5P0.5接清零信号CLR,高电平有效。
每一个测频周期开始,都应该首先清零。
单片机主控模块
单片机在该系统中,主要是完成整个测量电路的测试控制、数据处理和显示输出。
系统启动后,如不能正常测试,可以由按键强制性清零。
主程序不断的扫描显示程序,并扫描计数结束标识START是否为零,一旦为零,立即把FPGA的两个计数器技术结果取出、计算,把计算的结果送去显示。
在资源的分配上,P2口用来进行LCD1602的写入与显示;P0和P1口负责与FPGA的通信,P0主要是通信过程的控制,P1则是读取FPGA从输入信号获取的频率等核心数据的计数,然后单片机再进行相应的加减乘除运算和显示的控制。
P3口则是采用了4*4的矩阵键盘控制单片机,以实现清零,读数,显示,切屏等人机交互功能。
单片机主程序流程图及核心端口如下图所示:
并行液晶模块和键盘模块:
外围电路设计
1、电源模块
整个电路的供电电源如图所示,220V交流经变压、整流、滤波后,最终向系统提供稳定的+5V和-5V电压信号。
2、放大整形电路
方案一:
该部分由高速比较器LM311构成简单滞回比较器,后跟两级74HC14反相器,即可输出波形较好的TTL电平,再用3.3v稳压管将输出高电平稳定在3.3v,即可输入FPGA进行检测。
方案二:
在方案一前加一个由LF356和四个4148二极管组成的一个简单钳位放大电路,可对小信号先进行限幅放大再进行比较,这样可以提高整形上限频率,也可以降低输入信号幅度要求。
在试验调试中发现用方案一完全可以达到题目发挥部分要求:
0.5v—5v;0.1Hz—1MHz。
为了简化电路,节约元器件,我们最终选择方案一。
3、移相电路
该部分主要采用RC网络进行移相,理论上一个RC移相网络可以移相0—90度。
于是我们选择用两级RC移相网络,这样可以实现0—180度相移。
用变位器改变相移度数与输出电压幅值。
后把原信号与相移后的信号输入到两个一模一样的整形电路(如上)进行整形后即可输入FPGA进行检测。
测试结果
测试由信号源发出的频率,核心数据频率测量值如表所示:
被侧信号参考频率
测量频率值
误差
1.1045MHz
1.104MHz
<0.01%
908.34KHz
908.39KHz
<0.01%
91.389KHz
91.39KHz
<0.01%
8.8354KHz
8.835KHz
<0.01%
952.67Hz
952.7Hz
<0.01%
97.86Hz
97.87Hz
<0.01%
10.63Hz
10.63Hz
<0.01%
0.9435Hz
0.9435Hz
<0.01%
0.3654Hz
0.3653Hz
<0.01%
0.1219Hz
0.1220Hz
<0.01%
周期,脉宽,占空比,相位差的测量结果都能满足题目要求,就不一一列举出来了。
结束语
本系统设计采用FPGA和单片机结合的方式实现等精度测量频率,充分发挥了FPGA高速的数据处理能力以及单片机的计算、控制能力。
采用Verilog硬件描述语言对系统进行仿真测试,最终下载到FPGA内部。
单片机采用C语言编写程序,利用浮点数进行计算,精度高。
同时设计了门控信号控制,大大地提高了系统的性能。
等精度测量技术在生产、实验等环境中得到了广泛的应用。
参考文献
[1]谭会生,瞿遂春.EDA技术综合应用实例与分析[M].西安电子科技大学出版社,2004.
[2]徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:
电子工业出版社,2002.
[3]AlteraCorporationAlteraDigitalLibrary[M].Altera,2002.
[4]王金明,杨吉斌.数字系统设计与VerilogHDL[M].北京:
电子工业出版社,2002.
[5]赵亮,基于Verilog语言的等精度频率计设计[M].电子工程师,2007.
[6]宏晶科技,STCMicrocontrollerHandbook,2007
[7]郭天祥,51单片机C语言教程.电子工业出版社,2009
[8]江志红,51单片机技术应用与应用系统开发案例精选.清华大学出版社,2008
附件:
FPGA程序:
/*
DESCRIPTION
设计者:
李安东
学号:
200904015009
时钟:
50M
芯片:
FPGA核心板cycloneIII
平台:
QuartusII8.0
*/
modulefreq(clk,freq_input,freq_input2,clr,call,sel,start,data,outf,outf2);
inputclk;
inputclr;
inputcall;
input[3:
0]sel;
inputfreq_input;
inputfreq_input2;
outputstart;
output[7:
0]data;
outputoutf;
outputoutf2;
reg[31:
0]freq_num;
reg[31:
0]clock_num;
reg[31:
0]bandwidth_num;
reg[31:
0]phasic_num;
regena;
regena_bandwidth;
regena_phasic;
regphasic_check;
wireclock;
wireoutf;
wireoutf2;
pll_sclkpll(clk,clock,outf,outf2);
//clock_set
wirefreq_phasic;
assignfreq_phasic=freq_input^freq_input2;
reg[7:
0]data;
always@(selorfreq_numorclock_numorbandwidth_numorphasic_numorphasic_check)
begin
case(sel)
4'd0:
data=freq_num[7:
0];
4'd1:
data=freq_num[15:
8];
4'd2:
data=freq_num[23:
16];
4'd3:
data=freq_num[31:
24];
4'd4:
data=clock_num[7:
0];
4'd5:
data=clock_num[15:
8];
4'd6:
data=clock_num[23:
16];
4'd7:
data=clock_num[31:
24];
4'd8:
data=bandwidth_num[7:
0];
4'd9:
data=bandwidth_num[15:
8];
4'd10:
data=bandwidth_num[23:
16];
4'd11:
data=bandwidth_num[31:
24];
4'd12:
data={phasic_num[7:
1],phasic_check};
4'd13:
data=phasic_num[15:
8];
4'd14:
data=phasic_num[23:
16];
4'd15:
data=phasic_num[31:
24];
default:
data=8'd0;
endcase
end
//data
assignstart=ena;
always@(posedgefreq_inputornegedgeclr)
begin
if(~clr)
ena<=1'b0;
elseif(freq_input)
ena<=call;
end
//start
always@(posedgefreq_input)
begin
phasic_check<=freq_input2;
end
always@(posedgefreq_inputornegedgeclr)
begin
if(~clr)
freq_num<=32'b0;
else
if(ena)
//if(ena&freq_input)
freq_num<=freq_num+1'b1;
end
//freq
always@(posedgeclockornegedgeclr)
begin
if(~clr)
clock_num<=32'b0;
else
if(ena)
clock_num<=clock_num+1'b1;
end
//clock
always@(freq_inputorena)
begin
ena_bandwidth<=ena&freq_input;
end
always@(posedgeclockornegedgeclr)
begin
if(~clr)
bandwidth_num<=32'b0;
else
if(ena_bandwidth)
bandwidth_num<=bandwidth_num+1'b1;
end
//bandwidth
always@(freq_phasicorena)
begin
ena_phasic<=ena&freq_phasic;
end
always@(posedgeclockornegedgeclr)
begin
if(~clr)
phasic_num<=32'b0;
else
if(ena_phasic)
phasic_num<=phasic_num+1'b1;
end
//phasic
Endmodule
单片机程序:
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodedat[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
ucharcodeLCDCode[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','*','#'};
ucharcodetable1[]="Freq:
";
ucharcodetable2[]="HZ";
ucharcodetable3[]="Period:
";
ucharcodetable4[]="Gate:
";
ucharcodetable5[]="Ratio:
";
ucharcodetable6[]="BW:
";
ucharcodetable7[]="Pha:
";
ucharcodetable8[]="Waiting...";
ucharcodetable9[]="clear";
sfrKey_Port=0xB0;
sfrP4SW=0xbb;
sbitP44=0xc4;
sbitlcdrs=P0^7;
sfrP1M1=0x91;
sfrP1M0=0x92;
//sbitled1=P3^2;
//sbitled2=P3^3;
//sbitled3=P3^4;
sbitk1=P0^0;
sbitk2=P0^1;
sbitk3=P0^2;
sbitk4=P0^3;
sbitcall=P0^4;
sbitclear=P0^5;
sbitread=P0^6;
bitKeyon=0;
bitFirst_Getkey=0;
bitGetkey=0;
uintnum=0;
ucharKey_Num=0xff;
ucharKey_NumValid=0xff;
inti,j,k;
voidchushihua();
voidInitial();
voidRead_Key();
voidwrite_com(uchar);
voidwrite_data(uchar);
ucharinter(void);
voiddelay(uint);
voiddelayus(longint);
voidDelay_us(long);
voidDelay_us(longt)
{
while(--t);
}
voiddelay_500ms(unsignedcharx)
{
for(i=63*x;i;i--)
for(j=156;j;j--)
for(k=70;k;k--);
}
voidInitial()
{
TMOD=0x20;
TH1=0xFF-200;
TL1=0xFF-200;
EA=1;
ET1=1;
TR1=1;
}
voidchushihua()
{
P44=0;
//1602LCD
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
/*
write_com(0x30);//LCD12864
write_com(0x0c);
write_com(0x01);
*/
}
voiddelay(uintx)
{
inti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
ucharinter(void)
{
ucharda=0;
da=P1;
return(da);
}
longget_fre_num(void)
{
longa=0;
k4=0;k3=0;k2=0;k1=0;Delay_us(5);a=inter();Delay_us(500);
k4=0;k3=0;k2=0;k1=1;Delay_us(5);a=((long)inter()<<8)|a;Delay_us(500);
k4=0;k3=0;k2=1;k1=0;Delay_us(5);a=((long)inter()<<16)|a;Delay_us(500);
k4=0;k3=0;k2=1;k1=1;Delay_us(5);a=((long)inter()<<24)|a;Delay_us(500);
return(a);
}
longget_clk_num(void)
{
longa=0;
k4=0;k3=1;k2=0;k1=0;Delay_us(5);a=inter();Delay_us(500);
k4=0;k3=1;k2=0;k1=1;Delay_us(5);a=((long)inter()<<8)|a;Delay_us(500);
k4=0;k3=1;k2=1;k1=0;Delay_us(5);a=((long)inter()<<16)|a;Delay_us(500);
k4=0;k3=1;k2=1;k1=1;Delay_us(5);a=((long)inter()<<24)|a;Delay_us(500);
return(a);
}
longget_bandwidth_num(void)
{
longa=0;
k4=1;k3=0;k2=0;k1=0;Delay_us(5);a=inter();Delay_us(500);
k4=1;k3=0;k2=0;k1=1;Delay_us(5);a=((long)inter()<<8)|a;Delay_us(50);
k4=1;k3=0;k2=1;k1=0;Delay_us(5);a=((long)inter()<<16)|a;Delay_us(50);
k4=1;k3=0;k2=1;k1=1;Delay_us(5);a=((long)inter()<<24)|a;Delay_us(50);
return(a);
}
longget_phasic_num(void)
{
longa=0;
k4=1;k3=1;k2=0;k1=0;Delay_us(5);a=inter();Delay_us(50);
k4=1;k3=1;k2=0;k1=1;Delay_us(5);a=((long)inter()<<8)|a;Delay_us(50);
k4=1;k3=1;k2=1;k1=0;Delay_us(5);a=((long)inter()<<16)|a;Delay_us(50);
k4=1;k3=1;k2=1;k1=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 校赛一等奖基于FPGA的数字频率计设计 李博 赵本东 李安冬 一等奖 基于 FPGA 数字频率计 设计 李安