50行代码搞定 FPGA频率计

频率计应该是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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值