Verilog数字频率计.docx
《Verilog数字频率计.docx》由会员分享,可在线阅读,更多相关《Verilog数字频率计.docx(20页珍藏版)》请在冰豆网上搜索。
Verilog数字频率计
摘要
本文介绍了基于FPGA的数字频率计的设计方法,设计采用硬件描述语言Verilog,在软件开发平台ISE上完成,可以在较高速时钟频率(48MHz)下正常工作。
该数字频率计采用测频的方法,能准确的测量频率在10Hz到100MHz之间的信号。
使用ModelSim仿真软件对Verilog程序做了仿真,并完成了综合布局布线,最终下载到芯片Spartan3A上取得良好测试效果。
关键词:
FPGA,Verilog,ISE,测频方法
Abstract
ThispaperintroducesthedesignmethodofdigitalfrequencymeterbasedonFPGA,whichusehardwaredescriptionlanguage-VeriloginsoftwaredevelopmentplatformISEandcanwordinrelativelyhigh-speedclockof48MHz.Thefrequencymeterusesthemethodoffrequencymeasurement,whichcouldaccuratelymeasurethefrequencyofsignalsbetween10Hzto100MHz.Thissystemusesthesimulationtool-ModelSimtorunanddebugtheVerilogprogram,anddesignthecircuitplacement.AgoodresultcanbeachievedwhentheprogramwasburntonthechipSpartan3A.
Keywords:
FPGA,Verilog,ISE,FrequencyMeasurement
第一章测量原理与方法
所谓“频率”,就是周期性信号在单位时间(秒)内变化的次数。
若在一定的时间间隔T内计数,计得某周期性信号的重复变化次数为N,则该信号的频率可表达为:
f=N/T
所以测量频率就要分别知道N和T的值,由此,测量频率的方法一般有三种:
测频方法、测周方法和等精度测量。
1.1测频方法
这种方法即已知时基信号(频率或周期确定)做门控信号,T为已知量,然后在门控信号有效的时间段内进行输入脉冲的计数,原理图如下图所示:
图1-1测频方法原理图
首先,被测信号①(以正弦波为例)经过放大整形后转变成方波脉冲②,其重复频率等于被测信号频率。
把方波脉冲②加到闸门的输入端。
由一个高稳定的石英振荡器和一系列数字分频器组成了时基信号发生器,它输出时间基准(或频率基准)信号③去控制门控电路形成门控信号④,门控信号的作用时间T是非常准确的(由石英振荡器决定)。
门控信号控制闸门的开与闭,只有在闸门开通的时间内,方波脉冲②才能通过闸门成为被计数的脉冲⑤由计数器计数。
闸门开通的时间称为闸门时间,其长度等于门控信号作用时间T。
比如,时间基准信号的重复周期为1S,加到闸门的门控信号作用时间T亦准确地等于1S,即闸门的开通时间——“闸门时间”为1S。
在这一段时间内,若计数器计得N=100000个数,根据公式f=N/T,那么被测频率就是100000Hz。
如果计数式频率计的显示器单位为“KHz”,则显示100.000KHz,即小数点定位在第三位。
不难设想,若将闸门时间设为T=0.1S,则计数值为10000,这时,显示器的小数点只要根据闸门时间T的改变也随之自动往右移动一位(自动定位),那么,显示的结果为100.00Khz。
在计数式数字频率计中,通过选择不同的闸门时间,可以改变频率计的测量范围和测量精度。
1.2测周方法
测周方法即:
被测信号(频率或周期待测)做门控信号,T为未知量,做门控信号T,然后在门控信号有效的时间段内对时基信号脉冲计数,原理图如下图所示:
图1-2测周方法原理图
计数器测周的基本原理刚好与测频相反,即由被测信号控制主门开门,而用时标脉冲进行计数,所以实质上也是一种比较测量方法。
1.3等精度测量法
等精度测量法的核心思想是通过闸门信号与被测信号同步,将闸门时间τ控制为被测信号周期长度的整数倍。
测量时,先打开预置闸门,当检测到被测信号脉冲沿到达时,标准信号时钟开始计数。
预置闸门关闭时,标准信号并不立即停止计数,而是等检测到被测信号脉冲沿到达时才停止,完成被测信号整数个周期的测量。
测量的实际闸门时间可能会与预置闸门时间不完全相同,但最大差值不会超过被测信号的一个周期。
在等精度测量法中,相对误差与被测信号本身的频率特性无关,即对整个测量域而言,测量精度相等,因而称之为“等精度测量”。
标准信号的计数值越大则测量相对误差越小,即提高门限时间τ和标准信号频率
可以提高测量精度。
在精度不变的情况下,提高标准信号频率可以缩短门限时间,提高测量速度。
原理图如下:
图1-4等精度测量的原理图
1.4放大整形电路
放大整形电路包括衰减器、跟随器、放大器、施密特触发器,衰减器由两个双向限幅二极管构成,将来的信号限制在0.7v到-0.7v之间。
跟随器由一个集成运算放大器组成,以增大带负载能力。
放大器为由集成运放构成一个同向比例放大器,放大位数为50倍。
施密特触发器由555定时器组成,实现对波形的整形,整形后的方波送到闸门以便计数。
其仿真电路如下图所示:
图1-5放大整形电路
当输入信号为0.5V时,仿真放大整形后的输出结果如下图示:
图1-6放大整形电路仿真结果
(一)
当输入信号为3V时,仿真放大整形后的输出结果如下图示:
图1-6放大整形电路仿真结果
(二)
当输入信号为10V时,仿真放大整形后的输出结果如下图示:
1.5时基信号产生
系统所使用的时钟信号由时基信号产生模块产生,它由一块晶体振荡器及简单的电路组成,如下图所示:
图1-7时基信号产生电路
第二章任务要求
设计一个计数式频率计,其频率测量范围为10Hz~1MHz,测量结果用6只数码管显示。
有三个带锁按键开关(任何时候都只能有一个被按下)被用来选择1S、0.1S和0.01S三个闸门时间中的一个。
有一个按钮开关用来使频率计复位。
有两只LED,一只用来显示闸门的开与闭,另一只当计数器溢出时做溢出指示。
下图显示了该频率计前面板的基本排布构想。
第三章各模块功能及介绍
3.1分频器
由于晶体振荡器提供的为48M的时钟,而在整个频率计里将用到周期为2s、0.2s和0.02s的闸门信号,还有译码显示的扫描信号1KHz,所以我们在此模块先分频产生1Hz、10Hz、100Hz、1KHz四个分频信号,以留作其它模块用。
分频分别采用4个计数器来实现,当计到一定的值时输出的分频信号翻转,最后分别获得4个分频输出,分频器模块如下图所示:
图3-1分频器模块
此模块的复位为同步方式,当复位有效时,输出将清零。
源程序如下:
modulediv_clk(reset,clk,
clk_1hz,clk_10hz,clk_100hz,clk_1khz);
inputreset,clk;
outputregclk_1hz,clk_10hz,clk_100hz,clk_1khz;
reg[29:
0]counter1,counter2,counter3,counter4;//分频计数值
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
counter1<=0;counter2<=0;counter3<=0;counter4<=0;
clk_1hz<=0;clk_10hz<=0;clk_100hz<=0;clk_1khz<=0;
endelsebegin
if(counter1==24000000)begincounter1<=0;clk_1hz<=~clk_1hz;end
elsebegincounter1<=counter1+1;end
if(counter2==2400000)begincounter2<=0;clk_10hz<=~clk_10hz;end
elsebegincounter2<=counter2+1;end
if(counter3==240000)begincounter3<=0;clk_100hz<=~clk_100hz;end
elsebegincounter3<=counter3+1;end
if(counter4==24000)begincounter4<=0;clk_1khz<=~clk_1khz;end
elsebegincounter4<=counter4+1;end
end
end
endmodule
仿真图如下所示:
图3-2分频器模块仿真图
(一)
图3-3分频器模块仿真图
(二)
4.2闸门选择器
该模块主要实现对闸门的选择功能,通过输入的门选信号来确定输出的闸门,生成的模块如下图所示:
图3-4闸门选择器
具体实现方法如下:
当三个门选信号中有且仅有门选信号gate_ch1有效时,reg变量gate为clk_1hz,f的值为01;当三个门选信号中有且仅有门选信号gate_ch2有效时,reg变量gate为clk_10hz,f的值为10;当三个门选信号中有且仅有门选信号gate_ch3有效时,reg变量gate为clk_100hz,f的值为11。
reg变量gate再二分频则是输出的闸门信号gate_out(f为标记信号,标记了当前闸门的选择情况)。
如果同时有两个或以上的门选信号有效,则err输出为低,否则为高。
另外输出的译码扫描信号为clk_1khz,供后面的扫描译码模块使用。
本模块的源代码如下所示:
modulegate_ch(reset,gate_ch1,gate_ch2,gate_ch3,
clk_1hz,clk_10hz,clk_100hz,clk_1khz,
gate_out,err,scan_freq,f);
inputreset,gate_ch1,gate_ch2,gate_ch3,
clk_1hz,clk_10hz,clk_100hz,clk_1khz;
outputreggate_out,err;
outputwirescan_freq;
outputreg[1:
0]f;
reg[2:
0]counter5;//产生扫描信号时的分频计数值
reggate;
always@(posedgeclk_1khzornegedgereset)
begin
if(!
reset)begin
gate<=0;counter5<=0;err<=1;f=2'b01;
endelsebegin
if(gate_ch1==0&&gate_ch2==1&&gate_ch3==1)begin
gate<=clk_1hz;f=2'b01;err<=1;
endelseif(gate_ch1==1&&gate_ch2==0&&gate_ch3==1)begin
gate<=clk_10hz;f=2'b10;err<=1;
endelseif(gate_ch1==1&&gate_ch2==1&&gate_ch3==0)begin
gate<=clk_100hz;f=2'b11;err<=1;
endelsebegin
err<=0;
end
end
end
assignscan_freq=clk_1khz;
always@(posedgegateornegedgereset)
begin
if(!
reset)begin
gate_out<=0;
end
elsebegin
gate_out<=~gate_out;
end
end
endmodule
仿真结果如下图所示:
图3-5当且仅当gate_ch2有效时的仿真结果图
(一)
4.3频率计数器
频率计数器的功能为在输入的闸门信号的控制下对输入脉冲时行计数,它是一个7拉的模十计数器。
生成的模块如下图所示:
图3-6当且仅当gate_ch2有效时的仿真结果图
(一)
当gate_out信号为高时才计数器才计数,在gate_out为低后,马上将此时计数的值cnt赋给输出cnte,然后当输入carry_in信号再过一个脉冲后降计数的值cn清零,以备下次闸门有效时又重新开始计数。
源程序如下:
modulecount(carry_in,gate_out,reset,
cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6);
inputcarry_in,gate_out,reset;
outputreg[3:
0]cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6;//在每一次闸门有效时读数//器传递的计数值
reg[3:
0]cnt0,cnt1,cnt2,cnt3,cnt4,cnt5,cnt6;//计数器的6个计数值
reg[2:
0]counter6;//延迟将counter-num清零的计数值
always@(posedgecarry_inornegedgereset)begin
if(!
reset)begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;
cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;//判断是否溢出cnte0<=4'b0000;cnte1<=4'b0000;cnte2<=4'b0000;
cnte3<=4'b0000;cnte4<=4'b0000;cnte5<=4'b0000;counter6<=0;
endelsebeginif(gate_out==1)begin
counter6<=0;
if((cnt5==4'b1001)&&(cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)
&&(cnt1==4'b1001)&&(cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;
cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=cnt6+4'b0001;endelsebegin
if((cnt4==4'b1001)&&(cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001)&&(cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;
cnt4<=4'b0000;cnt5<=4'b0001+cnt5;cnt6<=cnt6;
endelsebegin
if((cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001)&&(cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;
cnt4<=4'b0001+cnt4;cnt5<=cnt5;cnt6<=cnt6;
endelsebegin
if((cnt2==4'b1001)&&(cnt1==4'b1001)&&(cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0001+cnt3;
cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;
endelsebeginif((cnt1==4'b1001)&&(cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0001+cnt2;cnt3<=cnt3;
cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;
endelsebeginif((cnt0==4'b1001))begin
cnt0<=4'b0000;cnt1<=4'b0001+cnt1;cnt2<=cnt2;cnt3<=cnt3;
cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;
endelsebegin
cnt0<=4'b0001+cnt0;cnt1<=cnt1;cnt2<=cnt2;cnt3<=cnt3;
cnt4<=cnt4;cnt5<=cnt5;cnt6<=cnt6;
endendendendendendendelsebegin
if(counter6==2'b01)begin
cnt0<=4'b0000;cnt1<=4'b0000;cnt2<=4'b0000;cnt3<=4'b0000;
cnt4<=4'b0000;cnt5<=4'b0000;cnt6<=4'b0000;
endelsebegin
counter6<=counter6+1;cnte0<=cnt0;cnte1<=cnt1;
cnte2<=cnt2;cnte3<=cnt3;cnte4<=cnt4;cnte5<=cnt5;cnte6<=cnt6;
endendendend
endmodule
频率计数器的仿真工作时序如图所示:
图3-7频率计数器的仿真结果图
4.4锁存器
如果计数器输出直接与译码器相连接,那么在计数过程中输出端则随输入脉冲数的增加而不断跳变,那么显示数码管则也会不断闪烁跳变,让人不能看到稳定的输出,设锁存器后,则不再跳变,便可清晰读出计数结果。
其生成的功能模块如图所示:
图3-7锁存器模块
这模块实现了对七位计数结果的锁存功能。
程序很简单如下所示:
modulelatch(reset,clk_1hz,cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6,
cn0,cn1,cn2,cn3,cn4,cn5,cn6);
inputreset,clk_1hz;
input[3:
0]cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6;
outputreg[3:
0]cn0,cn1,cn2,cn3,cn4,cn5,cn6;
always@(posedgeclk_1hzornegedgereset)begin
if(!
reset)begin
cn0<=4'b0000;cn1<=4'b0000;cn2<=4'b0000;cn3<=4'b0000;
cn4<=4'b0000;cn5<=4'b0000;cn6<=4'b0000;
endelsebegin
cn0<=cnte0;cn1<=cnte1;cn2<=cnte2;cn3<=cnte3;
cn4<=cnte4;cn5<=cnte5;cn6<=cnte6;
endend
endmodule
4.5扫描显示控制译码系统
本模块在扫描信号的scan_for的控制下,对多路选择器进行扫描,实现对实现对六位已经锁存的计数结果的扫描输出,由于人眼的视觉暂留效应,每支数码管只需大于25Hz的扫描频率即可实现动态扫描,所以我们用1KHz的扫描信号足以。
其生成的功能模块如图所示:
图3-7频率计数器的仿真结果图
本模块还实现了高位的无意义的消隐,即高位若值为零且无意义时,相应的数码管将不会显示。
输出信号over通过最高位cnt6是否有值来判断结果是否溢出,如果溢出则over输出结果为低,led_khz为单位标志,如果led_khz为有效时,显示结果的单位为KHz,dot实现了小数点的显示。
其源程序较多,可以附录中查看,此模块的仿真结果如下所示:
图3-7频率计数器的仿真结果图
第四章顶层电路及总体仿真
4.1顶层电路
顶层电路如下图所示:
图4-1顶层电路图
4.2总体仿真结果
为了验证我们的设计是否正确,我们用ModelSim对以上设计进行了仿真,仿真精度达到ps级,基准时钟clk用20883ns,结果如下所示,在1Hz到10000Hz中仿真结果与理论值相等,在输入为100000Hz时出现了3Hz的误差,当输入被测信号为1000000Hz时,出现了26Hz的误差。
仿真结果波形如下图所示:
图4-2被测信号为10Hz的仿真结果
图4-3测信号为100Hz的仿真结果
图4-3被测信号为1000Hz的仿真结果
10000Hz:
图4-4被测信号为10000Hz的仿真结果
100000Hz:
图4-5被测信号为100000Hz的仿真结果
1000000Hz:
图4-6被测信号为1000000Hz的仿真结果
4.3测试结果
在成功下载并运行后,为评估该设计系统的实际测量效果,做了一次对比实验,选用频率可调的函数发生器,同时用示波器做同步的跟踪。
测得的数据较为精确,最低频率可以测到10Hz,当输入信号不大于10KHz时,显示结果跟函数发生器以及示波器的显示全吻合,当输入信号频率达到100KHz时,测得的结果和显波器的显示出现了3Hz的差值,当输入信号频率达到1000KHz时,测得的结果和显波器的显示出现了27Hz的差值,由于所使用的函数发生器最大只能产生41MHz的信号,所以我们最高只测到41MHz。