50行代码搞定 FPGA频率计

频率计应该是FPGA的入门级实现吧!话不多说直接上原理。

1.系统时钟分频至1hz

    将系统时钟分频至1hz,1hz时钟看成两部分高电平和低电平,他们对应的时间就是0.5s,在0.5s内开始计数,将计数后的结果再*2即可得到1hz所对应的频率。

50行代码搞定 FPGA频率计_第1张图片

2.计数锁存

笔者采用的是低电平时计数,高电平锁存。采用了一个标志位lock_ok进行锁存,详见代码段。

50行代码搞定 FPGA频率计_第2张图片

3.频率赋值50行代码搞定 FPGA频率计_第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-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

你可能感兴趣的:(50行代码搞定 FPGA频率计)