频率计应该是FPGA的入门级实现吧!话不多说直接上原理。
1.系统时钟分频至1hz
将系统时钟分频至1hz,1hz时钟看成两部分高电平和低电平,他们对应的时间就是0.5s,在0.5s内开始计数,将计数后的结果再*2即可得到1hz所对应的频率。
2.计数锁存
笔者采用的是低电平时计数,高电平锁存。采用了一个标志位lock_ok进行锁存,详见代码段。
3.频率赋值
大概计算一下1hz 的脉冲宽度为29.999-9.999=20
一个待测频率的时钟宽度为10.199-9.799=0.4
20/0.4=50;
所以还是测偶数频率还是比较可以的,奇数频率有一点点误差。解决办法就是将系统时钟分频至0.5hz,采用类似的原理即可消除。
代码实现:
`timescale 1ns / 1ps
module freCount(
input sclk,
input fre,
output reg [25:0]count_fre
);
reg [26:0]sum;
reg [24:0]count;
reg clk_1;
reg lock_ok;
initial begin
lock_ok<=0;
clk_1<=0;
sum<=0;
count<=0;
end
//get 1hz
always @(posedge sclk)
if(sum==(100_000_000/2)-1)//100M
begin
clk_1<=~clk_1;
sum<=0;
end
else
sum<=sum+1;
always @(posedge fre)
if(!clk_1)
begin
lock_ok<=0;
count<=count+1;
end
else if(!lock_ok) // == lock && !lock_ok
begin
count_fre<=count*2;
lock_ok<=1;
end
else //== lock && lock_ok
count<=0;
endmodule