社区导航

 

搜索
查看: 427|回复: 0

[资料分享] 频率计

[复制链接]

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-11-3 09:15 | 显示全部楼层 |阅读模式
                         频率计的设计
   测频一般有   直接测频法      测周法        等精度测量法
   直接测频是给定一个周期较长的门阀,在这段时间内计数被测信号的上升沿次数N,然后用标准时钟信号频率与其相比 ,即可得到需测频率,但这种方法所得结果只能是大致的,不能精确.就像用用同一把尺子去量不同的数量级的物体,
1会有一定误差
2会浪费资源
   较前两者而言,最后一个更为精确,它能根据不同的频率范围选择不同的门阀时间,在此基础上再用直接测频法得到频率.
我们的驱动时钟为50Mhz ,为使测量的频率更精确,我们先利用PLL核倍频为100MHZ  
程序分析总结
然后我们选择一个初始预置闸门时间 我们先置为1毫秒 因为倍频后的时钟1s内变换100M次         1ms内变换  100000次
第一个模块:初始预置闸门内测被测信号粗略频率,用于之后判断需要用哪一个更匹配的频率段闸门测量 从而更为精确
always @(posedge fx or negedge rst)
begin
  if(!rst)
   begin
   cnt_fx<=0;
   end
  else
   begin
   if(c1==1)
    cnt_fx<=cnt_fx+1;//预置闸门时间内计数
   else
    cnt_fx<=0;
   end
end
第二模块:实际门阀选择
always @(posedge clk or negedge rst)
begin
  if(!rst)
  begin
  cnt<=0;预置门阀时间内,即 fx_time内的计数器
  cnt_s<=0;标准时钟下的计数器,用于判断频率范围
  end
  end
  else
  begin
  if(cnt
  begin
  cnt<=cnt+1;    在没到预置闸门结束时,两个计数器同步计数
  cnt_s<=cnt_s+1;
  end
  else if(cnt==cnt_time) begin 到预置闸门信号结束时
  进行信号频率范围判断 获得不同的预置闸门
         if(cnt_fx>=10000&&cnt_s==cnt_time)
             begin
              cnt<=cnt+1;  表示满足以上条件时 cnt加1  结束闸门选择,产生能匹配待测信号的实际闸门为什么会结束闸门选择:因为这几个条件语句都在if(cnt==cnt_time)条件语句之内的,一旦不满足,就不会进行选择,进而直接生成实际闸门信号相关参数
                         end
          elseif(cnt_fx>=1000&&cnt_s==cnt_time*10)
                     begin
              cnt<=cnt+1;
                         end
                  elseif(cnt_fx>=100&&cnt_s==cnt_time*100)
                     begin
              cnt<=cnt+1;
                         end
                  elseif(cnt_fx>=2&&cnt_s==cnt_time*1000)
                     begin
              cnt<=cnt+1;
                         end
                  elseif(cnt_fx>=1&&cnt_s==cnt_time*10000)
                     begin
              cnt<=cnt+1;
                         end
           if(fx&!fx_reg)
                    cnt<=cnt+1;
                   else
                   cnt<=cnt;
                         end
                  else
                  
                   begin
                   cnt<=cnt;
                   cnt_s<=cnt_s+1;        若还没有达到结束闸门信号的要求时即(cnt=cnt_time)时cnt保持不变,cnt_s继续计数直到满足其中一个条件
                   end
                  
                                     end
          else
                   begin
                    if(c1==0)闸门信号结束时计数器清零
                         begin
                         cnt<=0;
                         cnt_s<=0;
                         end
                        else
                         begin
                         cnt<=cnt;
                         cnt_s<=0;
                         end
                   end
  end
end
第三模块 :预置闸门控制信号
always@(posedge clk)
begin
if(cnt
c1_r<=1; c1_r为c1的一个寄存器,用于下一个模块中与待测信号同步,避免相差+-1个周期
else
c1_r<=0;
end
第四模块:闸门信号与待测信号同步
always @(posedge fx,negedge rst)
begin
if(!rst)         
  c1<=0;
else
  c1<=c1_r;
end
   
注意事项
  1预置门阀时间越短,越节省资源,一定程度上能缩短测频时间,频率的精度取决于同步计数避免+1个周期,以及标准频率的大小。
  2去毛刺
输出加D触发器
原理就是用一个D触发器去读带毛刺的信号, 利用D触发器对输入信号的毛刺不敏感的特点,去除信号中的毛刺, 尤其是对信号中发生在非时钟跳变沿的毛刺信号去除效果非常的明显。但是对于大多数的时序电路来说,毛刺信号往往发生在时钟信号的跳变沿,这样D触发器的效果就没有那么明显了
信号延时同步法
采用同步电路可以大大减少毛刺。另外,由于大多数毛刺都比较短(大概几个纳秒),只要毛刺不出现在时钟跳变沿, 毛刺信号就不会对系统造成危害了。因此很多人认为,只要在整个系统中使用同一个时钟就可以达到系统同步的目标了
软件延时消抖适用于低频,去掉毛刺后更有利于低频信号的稳定,而高频本身毛刺很多,消抖也无济于事,经过仿真分析,消抖会使高频信号严重变形,使所测频率产生巨大误差。
   
3计数结果不得立即传出去,还得经过锁存器缓冲一下,使显示端显示稳定。当收、发数据双方的工作速度匹配时,这里的缓冲器可以用不带锁存结构的电路来实现。而当收、发数据双方的工作速度不匹配,就要用带锁存结构的电路来实现了,(否则,会出现数据丢失)。
      
   
FPGA任务
频率计总结
学习 FPGA  Spi 32Spi
时间 10月25日——11月5日

来源:EEWorld EE_FPGA学习乐园板块,转载请附上链接


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-22 21:56 , Processed in 0.088378 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表