频率计参考论文.docx
《频率计参考论文.docx》由会员分享,可在线阅读,更多相关《频率计参考论文.docx(20页珍藏版)》请在冰豆网上搜索。
频率计参考论文
1.2电子测量仪器现状
1.2.1频率计的发展现状
在电子测量领域中,频率测量的精确度是最高的,可达10—10E-13数量级。
因此,在生产过程中许多物理量,例如温度、压力、流量、液位、PH值、振动、位移、速度、加速度,乃至各种气体的百分比成分等均用传感器转换成信号频率,然后用数字频率计来测量,以提高精确度。
目前最主要的方法是基于单片机和FPGA或CPLD利用EDA技术设计实现等精度频率测量,这使设计过程大大简化,缩短了开发周期,减小了电路系统的体积,同时也有利于保证频率计较高的精度和较好的可靠性。
而实现等精度的算法主要是,在计数法和测周期法基础上发展起来的新型等精度频率测量算法,主要原理是预置闸门信号频率时随着被测信号频率的改变而改变,从而实现了等进度的测量。
1.4FPGA简介
1.4.1FPGA概述
FPGA是现场可编程门阵列(FieldProgrammableGateArray)的简称,与之相应的CPLD是复杂可编程逻辑器件(ComplexProgrammableLogicDevice)的简称,两者的功能基本相同,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件或CPLD/PGFA。
CPLD/PGFA几乎能完成任何数字器件的功能,上至高性能CPU,下至简单的74电路。
它如同一张白纸或是一堆积木,工程师可以通过传统的原理图输入或硬件描述语言自由的设计一个数字系统。
通过软件仿真可以事先验证设计的正确性,在PCB完成以后,利用CPLD/FPGA的在线修改功能,随时修改设计而不必改动硬件电路。
使用CPLA/FPGA开发数字电路,可以大大缩短设计时间,减少PCB面积,提高系统的可靠性。
这些优点使得CPLA/FPGA技术在20世纪90年代以后得到飞速的发展,同时也大大推动了EDA软件和硬件描述语言HDL的进步[6]。
1.4.2FPGA的发展现状
先进的ASIC生产工艺已经被用于FPGA的生产,越来越丰富的处理器内核被嵌入到高端的FPGA芯片中,基于FPGA的开发成为一项系统级设计工程。
随着半导体制造工艺的不断提高,FPGA的集成度将不断提高,制造成本将不断降低,其作为替代ASIC来实现电子系统的前景将日趋光明。
随着EDA技术在全球范围内的飞速发展,业界都在翘首以待基于Linux环境的EDA技术成为电路设计领域的主流。
首先,由于Linux费用很低,源代码开放,这使得EDA软件的前期开发费用很低,而且运行维护的成本也很低,同时大大方便了工程师的设计工作。
而Linux工作站的费用也要比Unix工作站便宜很多。
此外,Linux的成本大约是Unix以及Windows的1/15~1/10,但是效能并不比后者差,甚至运行速度要更快一些。
现在业界普遍的看法就是预计在未来的5年内,Linux将成为EDA的主角。
可以预见,Linux的普及只是时间问题[11]。
另一方面,随着现场可编程逻辑器件越来越高的集成度,加上对不断出现的I/O标准、嵌入功能、高级时钟管理的支持,使得设计人员开始利用现场可编程逻辑器件来进行系统级的片上设计。
Altera公司目前正积极倡导SOPC(SystemOnaProgrmmableChip,系统可编程芯片)。
“片上可编程系统”(SOPC)得到迅速发展,主要有以下几个原因:
1)密度在100万门以上的现场可编程逻辑芯片已经面市;
2)第4代现场可编程逻辑器件的开发工具已经成形,可对数量更多的门电路进行更快速的分析和编译,并可使多名设计人员以项目组的方式同步工作;
3)知识产权(IP)得到重视,越来越多的设计人员以“设计重用”的方式对现有软件代码加以充分利用,从而提高他们的设计效率并缩短上市时间。
Altera公司为了实现SOPC的设计,不仅研制开发出新器件,而且还研制出新的开发工具对这些新器件提供支持,并且与新芯片及软件相配合的是带知识产权的系统级设计模块解决方案,它们的参数可由用户自己定义。
芯片、软件及知识产权功能集构成了Altera完整的可编程解决SOPC方案——Excalibur解决方案,如图1-1给出了利用这一方案实现SOPC的流程图[12]。
2频率计的原理和设计
2.1频率计的测频原理
2.1.1等精度测频法
传统的测频方法有直接测频法和测周法,在一定的闸门时间内计数,门控信号和被测信号不同步,计数值会产生一个脉冲的误差。
等精度测频法采用门控信号和被测信号同步,消除对被测信号计数产生的一个脉冲的误差。
等精度频率测量方法消除了量化误差,可以在整个测试频段内保持高精度不变,其精度不会因被测信号频率的高低而发生变化。
利用FPGA强大的逻辑处理功能使被测信号和标准信号在闸门时间内同步测量,为了提高精度,将电子计数功能转为测周期,采用多周期同步测量技术,实现等精度测量。
在测量过程中分别对被测信号和标准信号同时计数。
测量的具体方法是:
首先给出闸门开启信号(预置闸门信号),此时计数器并不开始计数,而是等被测信号的上升沿到来时计数器才开始计数,然后预置闸门信号关闭信号(下降沿),计数器并不立即停止计数,而是等到被测信号上升沿来到时才停止计数,完成一次测量过程,过程如图2-1所示。
图2-1等精度测频原理
Fig.2-1Principleofequalprecisionfrequencymeasuring
预置闸门信号
和实际闸门信号
不相等,但两者差值不会相差被测信号的一个周期。
但从图2-1中可得实际闸门控制信号与被测信号
同步,因此消除了
的脉冲误差,并且此测频方法不仅对被测信号进行计数,而且去标准信号
也计数,所以称为多周期同步测频法。
2.1.2等精度测频误差分析
计数器对标准信号的计数是
,被测信号的计数是
,标准信号的频率为
,被测信号的频率:
(2-1)
由式(2-1)可知,若忽略标频的
误差,则等精度测频可能产生的相对误差为:
(2-2)
其中
为被测信号频率的准确值。
在测量中,由于
计数的起停时间都是由该信号的上升测触发的,无字误差。
而对
的计数
最多相差一个数的误差,即
其测量频率为:
(2-3)
将式(2-1)和(2-2)代入式(2-3),并整理得:
(2-4)
从公式(2-4)可以看出等精度算法产生的误差和被测信号的频率无关,仅与闸门时间和标准信号频率有关,从而实现整个频率段的等精度测量。
2.2等精度频率计的Verilog实现
等精度频率计的结构图如图2-2所示。
等精度频率计总共分为4个部分:
32位的乘法器、32位的除法器、根据输入信号产生预置闸门信号模块和计算频率值模块。
首先是根据输入信号产生预置闸门信号,再根据预置闸门信号产生实际闸门信号;在实际闸门信号的控制下分别对基准100MHz方波信号和输入信号计数,在实际闸门信号的结束时停止计数并将计数值锁存到寄存器,根据式(2-1)调用32位的乘法器和32位的除法器计算频率值。
图2-2等精度频率计结构图
Fig.2-2Equalprecisionfrequencymeterstructure
2.2.1预置闸门信号产生模块
根据输入信号产生预置闸门信号模块的实现方法是:
首先对输入信号计数,当计数值在3到9之间时产生预置闸门信号。
目的是舍去前3个输入信号再产生预置闸门信号,防止输入信号刚接入系统时不稳定对测量结果产生影响。
预置闸门信号的周期是输入信号周期的5倍。
下面给出产生预置闸门信号模块的Verilog代码。
/*************************************
根据输入信号产生门信号
*************************************/
moduleSuit_Freq(
inputrst_n,//复位信号
inputin_signal,//输入信号
outputregpre_gate//预置闸门信号
);
/***************************************
对输入信号计数
*/
reg[7:
0]cnt_in_signal;//计数器
always@(posedgein_signalornegedgerst_n)
begin
if(!
rst_n)
cnt_in_signal<=8'd0;
elseif(cnt_in_signal>9)
cnt_in_signal<=8'd0;
else
cnt_in_signal<=cnt_in_signal+1'b1;
end
/***************************************
根据输入信号产生预置闸门信号
丢掉输入信号前4个脉冲
*/
always@(posedgein_signalornegedgerst_n)
begin
if(!
rst_n)
pre_gate<=1'b0;
elseif((cnt_in_signal>3)&&(cnt_in_signal<9))
pre_gate<=1'b1;
else
pre_gate<=1'b0;
end
endmodule
产生预置闸门信号模块的功能仿真波形如图2-3所示,rst_n是复位信号,in_signal是输入信号,pre_gate是根据in_signal产生的预置闸门信号。
由仿真波形可见pre_gate的周期是in_signal的5倍。
图2-3预置闸门信号模块仿真波形
Fig.2-3Presetgatesignalmodulesimulationwaveform
2.2.232位乘法器模块
32位乘法器模块的实现方法是:
根据二进制乘法的原理,从乘数的最低位开始判断,如果乘数位为0则输出32位寄存器左移一位;如果乘数位为1则暂存64位寄存器的高32位加上被乘数再左移一位,直到计算完毕最后将暂存64位寄存器的低32位输出[7]。
例如十进制数3乘以5结果为十进制的15,其相应的二进制数乘法为0011乘以0101,二进制乘法过程为:
从乘数0101的最低位开始判断,0101的最低位为1,则输出寄存器加上被乘数0011再左移一位为00011000;接着判断乘数的第二位为0则输出寄存器左移一位为00001100;然后判断乘数的第三位为1,则输出寄存器加上0011再左移一位为00011110;最后判断乘数的最高位为0,则输出寄存器左移一位为00011111结果为十进制的15和十进制的乘法得到的结果一致。
32位乘法器的程序流图如图2-4所示。
图2-4乘法器程序流图
Fig.2-4Multiplierprogramflowdiagram
下面给出32位乘法器的Verilog代码。
/****************************************
乘法器
32*32
****************************************/
modulemultiplication(
inputclk,
inputrst_n,
inputstart,//起始信号
input[31:
0]ain,//乘数
input[31:
0]bin,//被乘数
outputreg[31:
0]yout,//结果输出
outputregdone//计算完成标志
);
parameterBW=32;
parameter_2BW=64;
/*******************************************
产生计算完成信号
*/
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
done<=1'b0;
elseif(i==BW)
done<=1'b1;
elseif(i[5])
done<=1'b0;
/*******************************************
计算
*/
reg[5:
0]i;
reg[BW-1:
0]areg;//
reg[BW-1:
0]breg;//
reg[_2BW-1:
0]yout_r;
always@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)
begin
areg<=0;
breg<=0;
yout_r<=64'd0;
i<=6'd0;
end
elseif(start)
begin
if(i>6'd0&&i<=BW)//修改此处的位宽
begin
if(areg[i-1])
yout_r<={1'b0,yout_r[_2BW-1:
BW]+breg,yout_r[BW-1:
1]};
else
begin
yout_r<=yout_r>>1;
end
end
elseif(i==BW+1)
begin
yout<=yout_r[BW-1:
0];
areg<=ain;
breg<=bin;
yout_r<=64'd0;
i<=0;
end
i<=i+1'b1;
end
end
endmodule
32位乘法器的时序仿真波形如图2-5所示,第一个信号是100MHz的系统时钟clk。
第二个信号是复位信号rst_n。
第三个信号是乘数ain。
第四个信号是被乘数bin。
第五个信号是开启计算信号start,高电平有效。
第六个信号是计算完成标志信号done,done的上升沿标志着计算完毕。
第七个信号是计算结果yout,每个计算过程需要32个时钟周期。
由图2-5可见当ain=100000000,bin=5时计算结果yout=500000000,当ain=6,bin=7时计算结果yout=42。
图2-5乘法器仿真波形
Fig.2-5Multipliersimulationwaveform
2.2.332位除法器模块
32位除法器模块的实现方法是:
将32位的被除数和除数分别放在两个64位的暂存寄存器temp_a的低32位和temp_b的高32位。
然后对temp_a每左移1位就将其高32位和temp_b的高32位比较,如果前者大于或等于后者则temp_a=temp_a-tempb+1;如果前者小于后者则temp_a不变。
直到temp_a向左移完32位,取出temp_a的低32位即为商,temp_a的高32位即为余数。
例如两个4位的十进制数7除以3,结果为商2余1。
其相应的二进制除法过程为:
0111和0011分别放在两个8位的暂存寄存器temp_a的低4位和temp_b的高4位,即temp_a=00000111和temp_b=00110000。
然后temp_a左移一位为00001110,将其高4位0000与temp_b的高4位0011进行比较,因为前者小于后者,所以temp_a不变;继续将temp_a左移一位为00011100,因为0001小于0011,所以temp_a=00011100;继续将temp_a左移一位为001110,因为0011等于0011,所以temp_a=temp_a-temp_b+1=0011
1000-00110000+1=00001001;再将temp_a左移一位为00010010,因为0001小于0011,所以temp_a=00010010,temp_a已经向左移完4位,所以取出temp_a的低4位0010即为商2,temp_a的高4位0001即为余数1。
与十进制除法的结果一致。
32位除法器的程序流图如图2-6。
下面给出32位除法器的Verilog代码。
/********************************
32/32除法器
********************************/
moduleDiviser(
inputclk,
inputrst_n,
input[31:
0]a,//被除数
input[31:
0]b,//除数
outputreg[31:
0]result,//商
outputreg[31:
0]remainder,//余数
outputregcalc_done//计算完成标志,高脉冲
);
parameterBW=32;
parameter_2BW=64;
reg[BW-1:
0]tempa;
reg[BW-1:
0]tempb;
reg[_2BW-1:
0]temp_a;
reg[_2BW-1:
0]temp_b;
reg[5:
0]counter;
/**************************************
锁存输入值*/
always@(aorb)
begin
tempa<=a;
tempb<=b;
end
图2-6除法器的程序流图
Fig.2-6Programflowdiagramofthedivider
/**************************************
锁存输入值
*/
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
begin
temp_a<=32'd0;//修改此处的位宽
temp_b<=32'd0;//修改此处的位宽
calc_done<=1'b0;
end
elseif(counter>BW-1)
begin
counter<=6'd0;
calc_done<=1'b1;
result<=temp_a[BW-1:
0];
remainder=temp_a[_2BW-1:
BW];
temp_a={32'h0,a};//修改此处的位宽
temp_b={b,32'h0};//修改此处的位宽
end
else
begin
temp_a={temp_a[_2BW-2:
0],1'b0};
if(temp_a[_2BW-1:
BW]>=temp_b[_2BW-1:
BW])
temp_a<=temp_a-temp_b+1'b1;
else
temp_a<=temp_a;
counter<=counter+1'b1;
calc_done<=1'b0;
end
endmodule
32位除法器的时序仿真波形如图2-7所示。
第一个信号是100MHz的系统时钟clk。
第二个信号是复位信号rst_n。
第三个信号是被除数a。
第四个信号是除数b。
第五个信号是计算完成标志信号calc_done,calc_done的上升沿标志着计算完毕。
第六个信号是商result,第七个信号是余数remainder,每个计算过程需要32个时钟周期。
由图2-6可见,当a=56765,b=23443时,商result=2,余数remainder=9879;当a=10000,b=500时,商result=20,余数remainder=0;当a=12000,b=3890时,商result=3,余数remainder=330。
图2-7除法器仿真波形
Fig.2-7Dividersimulationwaveform
2.2.4计算频率值模块
计算频率值模块首先根据预置闸门信号产生实际闸门信号,然后在实际闸门信号的控制下分别对标准的100MHz的基准信号和输入信号计数,得到的计数值分别为count_standard和count_insignal。
计算频率模块的程序流图如图2-8所示,相应的Verilog代码详见附录E。
频率计的时序仿真如图2-9所示,第一个信号是100MHz的系统时钟clk。
第二个信号是复位信号rst_n。
第三个信号是预置门信号pre_gate。
第四个信号是输入的10000KHz的被测信号。
第五个信号是实际闸门信号real_gate。
第七个信号是锁存信号latch_falg。
第八个信号是对输入信号的计数器count_insignal。
第九个信号是对标准信号的计数器count_standard。
第十个信号是锁存输入信号计数器的锁存器Nx。
第十一个信号是锁存标准信号计数器值得锁存器Ns,第十二个信号是输出频率值frequency。
由图2-8可见,预置闸门信号pre_gate控制产生实际闸门信号real_gate,在实际闸门信号real_gate的上
升沿到来时,开启对输入信号和对标准信号的计数,当实际闸门信号的下降沿到来时产生一个高脉冲的锁存信号latch_falg,在latch_falg的控制下将count_insignal和count_standard的计数值分别所存在Nx和Ns里用于频率计算,锁存完值后,并将count_insignal和count_standard清零。
图2-8计算频率值代码流图
Fig.2-8Frequencycalculationflowdiagram
图2-9频率计时序仿真
Fig.2-9Thetimingsequencesimulationfrequency
为了能够在SOPCBuilder里面将频率计集成到可编程系统上,必须还要利用Avalon总线协议对其进行封装。
下面给出其封装的代码。
/******************************
毕业设计
频率计Avalon封装
******************************/
moduleFreq_Count_Avalon(
inputclk,
inputrst_n,
inputin_signal,//被测输入信号
//Avalon信号----------------
inputchipselect,//片选信号
inputaddress,//地址信号
inputread,//读使能信号
outputreg[31:
0]readdata//读数据
);
wire[31:
0]frequency;
//----------------------------------------
Freq_countFreq_count_m(
.clk(clk),
.rst_n(rst_n),
.in_signal(in_signal),//被测输入信号
.frequency(frequency)
);
//----------------------------------------
/***********************************