当前位置: 首页 > article >正文

等精度频率计的设计

目录

主控电路设计

频率测量与计算电路设计

顶层电路设计

功能扩展及应用


频率测量的三种方法

   等精度频率计通过控制闸门信号与被测信号同步,消除了直接测频法中的计数误差,因而在被测信号频率范围内测量精度基本上是恒定的。

   本节以设计能够测量信号频率为1Hz~100MHz、测量误差的绝对值不大于0.01%的等精度频率计为目标,说明IP在数字系统设计中的应用。

   等精度测频的总体设计方案如图所示,其中主控电路、标准频率信号产生电路、频率测量和计算电路以及数值转换与译码电路都可以在FPGA中实现。

主控电路设计

  主控电路与直接测频法中主控电路的功能完全相同,用于周性性产生计数器的复位信号CLR'、闸门信号CNTEN和锁存器时钟LE,可以直接应用Verilog HDL描述。

 module fp_ctrl ( input clk,   // 时钟,8Hz
     output reg clr_n,          // 计数器清零信号
     output reg cnt_en,        // 闸门信号,作用时间为1秒
     output reg le              // 锁存器en,高电平有效
     );
     // 计数变量定义  
     reg [3:0] q;  
     // 描述10进制计数逻辑
     always @( posedge clk )  
        if ( q >= 4'd9 )        
             q <= 4'b0000;                     
           else
             q <= q + 1'b1;
     // 控制信号生成过程
     always @( q )     
        case ( q ) 
           4'b0000 : begin clr_n = 0; cnt_en = 0; le = 0; end 
           4'b0001 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b0010 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b0011 : begin clr_n = 1; cnt_en = 1; le = 0; end           
           4'b0100 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b0101 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b0110 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b0111 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b1000 : begin clr_n = 1; cnt_en = 1; le = 0; end
           4'b1001 : begin clr_n = 1; cnt_en = 0; le = 1; end
            default : begin clr_n = 1; cnt_en = 0; le = 0; end
       endcase
  endmodule

 新建工程,将模块编译综合后封装成原理图符号以便在顶层设计电路中调用。

频率测量与计算电路设计

   等精度频率测量和计算电路的实现电路的框图如图所示。

  频率测量与计算电路中的D触发器既可以在顶层设计模块中调用原理图库primitives中的D触发器实现。

  module DFF_mk(G,Fx,SG);
      input G,Fx;
       output reg SG;
       always @(posedge Fx)
            SG <= G; 
   endmodule

   当闸门时间取1秒、采用96MHz标准信号时,若要测量100MHz的信号,则标准计数器和测频计数器至少需要采用27位二进制计器实现(因为226<96MHz<227,226<100MHz<227),同时需要为计数器添加异步复位端CLR'和计数允许控制端ENA,以便与主控电路连接。

28位标准计数器的代码参考如下:

module FScnt(FSCLK,CLR_n,ENA,FSQ); 
   input FSCLK,CLR_n,ENA;
   output reg {27:0] FSQ;
   always @(posedge FSCLK 
                     or negedge CLR_n)
      if ( !CLR_n ) 
          FSQ <= 28'b0;
      else if (ENA) 
          FSQ <= FSQ+1'b1; 
endmodule

28位测频计数器的代码参考如下:

module FXcnt(FXCLK,CLR_n,ENA,FXQ);
   input FXCLK,CLR_n,ENA;
   output reg {27:0] FXQ;
   always @(posedge FXCLK 
                     or negedge CLR_n)
      if ( !CLR_n )
           FXQ <= 28'b0; 
       else if (ENA) 
           FXQ <= FXQ+1'b1; 
endmodule

   频率计算电路中所需要的乘法器和除法器通过定制参数化宏功能模块LPM_MULT和LPM_DIVIDE实现,其中乘法器的输入定制为28位无符号二进制数、乘法结果定制为56位无符号二进制数,除法器的被除数定制为56位无符号二进制数、除数定制为28位无符号二进制数,整除结果和余数定制为56位和28位无符号二进制数,分别用56位和28位锁存器锁存。另外,锁存器需要添加一个锁存允许端口EN,以便与测频控制电路连接。

  56位和28位锁存器用Verilog代码描述如下:

module latch84  ( en,din56, 
          din28,dout28a,dout28b);
    input en;
    input [55:0] din56;
    input [27:0] din28;
    output reg [27:0] dout28a;
    output reg [27:0] dout28b;
    // 锁存输出过程
    always @(en,din56,din28)
      if ( en ) begin
         dout28a <= din56[27:0];
         dout28b <= din28;
         end
 endmodule

  新建工程,将模块latch84编译综合后封装成原理图符号以便在顶层设计电路中调用。    数值转换与译码电路用于将计算得到的二进制频率值转换为8位BCD码,以驱动数码管显示测频结果。

  根据上述显示格式定义,调用上述BinarytoBCD模块,实现代码转换与译码显示的Verilog代码参考如下:

module HEX7_8 ( 
   input wire [27:0] iBIN28a,iBIN28b,               // 除法商和余数输入
   output wire [6:0] oSEG7,oSEG6,oSEG5,oSEG4,   // 数码管驱动信号
                         oSEG3,oSEG2,oSEG1,oSEG0, 
   output reg  [2:0]  DPoints,                          // 小数点驱动信号
   output reg          OV_LED   );                    // 超量程指示指示信号
    // 内部线网和变量定义
   wire [31:0] BCD32a,BCD32b;                       // 商数BCD码,余数BCD码
   reg  [31:0] DispBCD;                                // 显示BCD码
   // 数值转换
   BIN28toBCD x1(iBIN28a,BCD32a);                // 二进制商数转换为BCD码
   BIN28toBCD x2(iBIN28b,BCD32b);                // 二进制余数转换为BCD码        
   // 根据频率值自动切换显示格式
   always @( iBIN28a ) begin
      if ( iBIN28a >= 100_000_000 )                   // 如果频率≥100MHz
           OV_LED  = 1'b1;                              // 超量程指示指示信号亮
        else  OV_LED  = 1'b0;                           // 超量程指示指示信号亮
     if ( iBIN28a >= 10000 ) begin                     // 如果频率≥10kHz
          DispBCD = BCD32a[31:0];                     // 显示8位商数
          DPoint  = 3'b000;                              // 不显示小数点
          end
      else if ( iBIN28a >= 1000 ) begin                  // 如果频率≥1kHz
            DispBCD = {BCD32a[15:0],BCD32b[31:16]}; // 显示4位商数和4位余数
            DPoints = 3'b001;                              // 显示低位小数点
             end
     else if ( iBIN28a >= 100 ) begin                    // 如果频率≥100Hz
           DispBCD = {BCD32a[11:0],BCD32b[31:12]};  // 显示3位商数和5位余数
           DPoints = 3'b010;                              // 显示中位小数点
           end     
       else begin                                             // 否则,频率小于100Hz
          DispBCD = {BCD32a[7:0],BCD32b[31:8]};      // 显示2位商数和6位余数
          DPoints = 3'b100;                                // 显示高位小数点
          end
    end
        // 例化显示译码模块
       CD4511s U7 ( .le(1'b0), .bcd(DispBCD[31:28]), .seg7(oSEG7));
       CD4511s U6 ( .le(1'b0), .bcd(DispBCD[27:24]), .seg7(oSEG6));
       CD4511s U5 ( .le(1'b0), .bcd(DispBCD[23:20]), .seg7(oSEG5));
       CD4511s U4 ( .le(1'b0), .bcd(DispBCD[19:16]), .seg7(oSEG4));
       CD4511s U3 ( .le(1'b0), .bcd(DispBCD[15:12]), .seg7(oSEG3));
       CD4511s U2 ( .le(1'b0), .bcd(DispBCD[11:8]),  .seg7(oSEG2));
       CD4511s U1 ( .le(1'b0), .bcd(DispBCD[7:4]),   .seg7(oSEG1));
       CD4511s U0 ( .le(1'b0), .bcd(DispBCD[3:0]),   .seg7(oSEG0));
 endmodule

顶层电路设计

  等精度频率计的顶层设计电路如图所示。其中锁相环输出96MHz(c0)和2kHz(c1)的信号,分别作为计数器标准频率信号FSCLK和8Hz分频基准信号。当待测信号FX1Hz_100MHz的频率超过100MHz时,OV_LED为1,驱动发光二极管闪烁指示被测信号的频率超量程。

   图中分频模块fp2kHz_8Hz用于将锁相环产生的2kHz信号分频为8Hz,为主控电路(fp_ctrl模块)提供时钟。

功能扩展及应用

   等精度频率计以其频率测量精度高而获得广泛的应用。如果在频率计顶层设计电路中再扩展部分功能电路,还可以实现脉冲占空比测量和序列相差检测。

脉冲占空比测量


http://www.kler.cn/a/402592.html

相关文章:

  • Large Spatial Model:End-to-end Unposed Images to Semantic 3D 论文解读
  • 线性代数的发展简史
  • 非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2
  • 标贝科技大模型声音复刻 快速获取高品质专属AI声音
  • 《操作系统 - 清华大学》5 -2:覆盖技术
  • D78【 python 接口自动化学习】- python基础之HTTP
  • 如何选择聚类算法、回归算法、分类算法?
  • 揭秘云计算 | 5、关于云计算效率的讨论
  • python学习笔记(3)运算符
  • Spring Boot 3.3高级日志配置详解:从 Logback 到 Log4j 2 的全面掌握
  • 优化移位寄存器
  • 【linux】线程概念与控制
  • HarmonyOS:UIAbility组件间交互(设备内)
  • SpringBoot(8)-任务
  • 阿里云IIS虚拟主机部署ssl证书
  • 汉诺塔(hanio)--C语言函数递归
  • 【提效工具开发】管理Python脚本执行系统实现页面展示
  • Android Studio启动模拟器显示超时
  • 基于BindingList的WinForm数据绑定机制与DataGridView动态刷新技术
  • Layui的select控件的onchange事件 无效的解决方法
  • MySQL库和表的操作
  • Spark RDD sortBy算子执行时进行数据 “采样”是什么意思?
  • 电脑超频是什么意思?超频的好处和坏处
  • Java小白成长记(创作笔记一)
  • Agent AI:智能代理AI:多模态交互视野的探究
  • Docker 数据卷 和 挂载 的区别