资源描述
高精度频率计的设计原理
【设计摘要】本文先详细讲解频率计的设计原理,在深入了解频率计工作原理的基础上,通过相应的改进,用verigol语言设计出精度更高的频率计。程序在Quartus II 6.1仿真出波形,在Altera的EP1K30TC144-3硬件板上实现。
一、频率计的原理
一般频率计从总体上来看,包括三个部分:即控制模块、计数模块、锁存模块。总体框图如图所示:
(1)、控制部分原理
控制部分实际上是一个分频器。为什么要分频呢?不分频,能不能测量出频率呢?我们来看看仿真的波形:
从仿真波形图中可以清楚的看到:
没分频时,CLK的使能高电平的有效电平只能维持SIGNAL的实际上升延的半数,只能维持SIGNAL计数器的一半,也就是说测量值仅仅是实际测量的一半。为了得到完整的测量信号,所以我们要分频。
(2)、计数器原理
计数器的设计是频率计的关键。
always @(posedge SIGNAL)
begin
if(en) //此处使能为计数器工作的关键地方,高电平有效。
begin //使能EN是二分频的高电平。
if(out==9)
begin
out=0;
cout=1;
end
else
out=out+1;
cout=0;
end
end
看看它的仿真波形就清楚了:
在使能EN的前提下,测量信号的上升延触发计数器工作,上升延的个数正好是计数器的累加个数,即测量信号的频率,计数器测量的显示值即可得到测量信号的频率。
(3)、锁存器模块
锁存器这块原理比较简单。因为分频出来的使能EN是高低电平交替的,要是不锁存,数码管就会在数字和0之间闪耀,为了得到稳定的信号,所以要锁存起来。锁存器的好处是可以使显示的数据稳定,不会因为周期性的清零信号而不断闪烁。在每一次测量开始时,都必须对计数模块清0。
附录:(参考程序)
*本次设计的整体框图与程序设计说明、注释。
/*频率计的设计,author name。
计数器的设计是本次设计的关键,在设计32位时有点小问题。
2010.5.5;完成计数器的设计,从4位扩展32位注意CLR的范围,完成频率计的设计。
修改:2010.5.5。等精度的计数器设计。(测量范围1K-100K)注意状态机状态不是固定的,RESET高低不断变化问题。
修改:2010.5.5。添加量程指示灯。增加反馈自动调整量程。
修改:2010.5.5。改变模块的顺序。
*/
module frequency(SIGNAL,CLK,CLEAR,QO);
output[31:0] QO;
input SIGNAL,CLK,CLEAR;
wire LOAD,COUNT_CLR,EN,COUNT;
wire[2:0] DATA;
wire[31:0] DIN;
fre_div FFfre_ctrl(CLK,DATA,CLEAR);
control FFcontrol(DATA,RESET,CLEAR,CLK,LOAD,COUNT_CLR,EN,);
count32 FFcount32(DIN,EN,COUNT_CLR,SIGNAL,COUNT);
latch_32 FFlatch_32(QO,DIN,LOAD);
endmodule
1、分频模块
always @(posedge clk)
begin
if(rst)
begin
count_en=0;
load=1;
end
else
begin
count_en=~count_en;
load=~count_en;
end
end
2、计数模块
module count32(out,en,clr,clk,cout7);
output[31:0] out;
output cout7;
input en,clk,clr;
reg[31:0] out;
reg cout,cout1,cout2,cout3,cout4,cout5,cout6,cout7;
always @(posedge clk or posedge clr)
begin
if(clr)
begin
out[3:0]=0;
end
else
begin
if(en)
begin
if(out[3:0]==9)
begin
out[3:0]=0;
cout=1;
end
else
begin
out[3:0]=out[3:0]+1;
cout=0;
end
end
end
end
3、锁存模块
module latch_32(qo,din,load);
output[31:0] qo;
input[31:0]din;
input load;
reg[31:0] qo;
always @(posedge load)
begin
qo=din;
end
endmodule
展开阅读全文