1. 简介
2.数字频率计的基本原理
2.1 数字频率计的设计方案
2.1.1 方案一:M法测频原理
2.1.2方案二:T法测频原理
2.1.3 方案三:M/T法律原理(等精度测量法)
3 数字频率计模块设计
3.1测频模块
3.2显示数值分解模块
3.3数字管译码和动态扫描模块
4数字频率计的系统逻辑设计
4.1 顶层设计代码的频率计
4.2 模块框图的频率计系统
5硬件设计
5.1电源接口电路设计
5.2电源系统设计
5.3 时钟设计
5.4 JTAG端口和FPGA配置电路设计
芯片的电源引脚-toc" style="margin-left:40px;">5.5FPGA芯片的电源引脚
5.6 数字管电流扩展电路
5.7数码管电路
5.8 复位电路
5.9 信号采集电路
5.10 PCB设计图
5.11实物图
6实物验证
6.1管脚分配
6.2 实物验证
数据收集包传输门:
1. 简介
本博客将基于本博客的完整描述FPGA等精度数字频率计的设计
2.数字频率计的基本原理
频率计:顾名思义就是计算一个波形在1s时间里的周期个数,频率作为信号的一种特性,被广泛运用调制解调、测量仪器等应用领域中。
2.1 数字频率计的设计方案
通常实现数字频率计的测量的方法有两种,通常被叫做M法和T法。
2.1.1 方案一:M法测频原理
M法的原理很简单,在一个固定时间长度的窗口中,计算窗口中脉冲的个数,原理如下图所示:
注:pulse_in(被测脉冲) 、 window_signal(窗口信号) 、signal_cnt(脉冲个数计数器)
由于window_signal窗口的时间T是已知的,所以被测脉冲的pulse_in的周期Tpulse_in = T/Nsignal_cnt ,由此可以计算出pulse_in的频率Fpulse_in = Nsignal_cnt /T。
M法原理很简单,但也存在明显的缺点:因为窗口的时间是固定的,当输入信号的一个周期的时间大于窗口的时间长度时,就无法对输入信号进行计数,无法完成频率测量。(注:M法其实是使用pulse_in去采样window_signal信号,当pusle_in的频率低于window_signal 的频率时,自然无法完成采样;当不满足奈特斯特采样定律时,测频的效果必然存在较大的误差。)
2.1.2 方案二:T法测频原理
T法的原理也很简单,利用较高频率的采样信号去采样获得被测信号的一个周期的时间长度,即可获得被测信号的周期,原理如下图所示:
由于采样信号的的周期Tsamping_clk已知,即可得被测信号的周期Tpulse_in = Nsignal_cnt*Tsamping_clk, 进而可推倒出被测信号的频率Fpulse_in = 1/ Nsignal_cnt*Tsamping_clk ,又因为采样信号频率Fsamping_clk = 1\Tsamping_clk ,最终可得被测信号的频率为Fpulse_in = Fsamping_clk / Nsignal_cnt 这样一个结果。
T法也存在一定的缺点,当被测信号的频率远小于采样信号的频率时,可获得比较高的测量精度,但是随着被测信号的频率提高,精度越低。
M法和T法较容易实现,根据实际工程的不同需求以及应用环境,只要能满足要求都是可以是使用的。就性能而言T法无论是在精度和动态性能方面都要优于M法。
2.1.3 方案三:M/T法原理(等精度测量法)
通过吸收M法和T法的优点,总结出一种M/T法,也叫等精度测量法。原理如下图所示:
等精度测量的一个最大特点是测量的窗口时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对标准信号和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于窗口信号是被测信号的整数倍,就消除了对被测信号产生的±l周期误差,但是会产生对标准信号±1周期的误差。
等精度的测量原理可以很容易得出如下结论:首先,被测信号频率fx的相对误差与被测信号的频率无关;其次,增大测量时间段“窗口时间”或提高 “标准频率”f0,可以减小相对误差,提高测量精度;最后,由于一般提供标准频率f0的稳定性和精度很高,所以标准信号的相对误差很小,可忽略。假设标准信号的频率为100 MHz,只要实际闸门时间大于或等于1s,就可使测量的最大相对误差小于或等于10ns,即精度达到1/100 MHz。
M/T法频率计算公式:Fpluse_in = Nsignal_cnt/Nf0_cnt *Ff0 ,两个计数器的固定关系可获得被测信号与标准频率的关系,由于标准频率已知,所以可计出被测信号的频率。
本篇文章将完成方案三M/T法(等精度测量法),在FPGA上的实现。
3 数字频率计的模块设计
如图为数字频率计设计框图,本章内容着重讲解FPAG内部各个模块的设计,其余模块由硬件工程师设计完成。
3.1 测频模块
测频模块是整个设计的核心,通过该模块可以计算出输入脉冲的实际频率值。设计采用了M/T法等精度测量法,使用系统时钟100Mhz作为标准频率。
实现方案:计数公式为:Fpluse_in = Nsignal_cnt / Nf0_cnt *Ff0,Nsignal_cnt为固定数 ,Nf0_cnt是一个变数;Nsignal_cnt/Nf0_cnt计算结果可能为一个浮点数,不便于FPGA处理,所以公式转换为一个便于FPGA处理形式:Fpluse_in = Nsignal_cnt * Ff0 /Nf0_cnt ,与原有公式等效。
仿真结果如下:
测量出了脉冲的结果为1000hz。
显示数值分解模块
测频功能完成了数值频率计的核心功能,计算出了频率值,但是这个值是无法直接在数码管上显示的。所以必须使用一个模块将数值按个位、十位、百位、千位等分开,这样才能用于数码管的显示。
实现方案:设计中最高可现实8位频率值,采用以下步骤可将数值分离:
第1步:输入的频率值除以10_000_000求商可得出第8位的数值;
第2步:将上一步的余数除以1_000_000求商可得出第7位的数值;
第3步:将上一步的余数除以100_000求商可得出第6位的数值;
第4步:将上一步的余数除以10_000求商可得出第5位的数值;
第5步:将上一步的余数除以1_000求商可得出第4位的数值;
第6步:将上一步的余数除以100求商可得出第3位的数值;
第7步:将上一步的余数除以10求商可得出第2位的数值,剩下的余数是即是第1位的值。
以上步骤中一共要使用7次除法,在FPGA中使用7个除法去完成是不合理的(占用大量的逻辑资源,资源少的FPGA可能时序难以收敛),所以设计采用分时复用的方法,使用一个除法器去完成所有的除法运算。
仿真结果如下图:
结论:可以看出,当输入数为55_555_555时,num8~num1每个都是5;当输入数为12_345_678时,num8~num1则按顺序为1~8,证明拆分结果正确。
数码管译码与动态扫描模块
这里指的数码管就是最常见的七段显示数码管,如图:
可以看出它是由7段小灯组成的,通过点亮小灯的组合不同可以组成不同的字符。管脚图如下:
每个管脚控制着一段灯管,数码管还分为共阴和共阳两种,共阴是说每段小灯的负极是连接在一起的(一个共地管脚),每段小灯的正级是分开的(对应着每个管脚),共阳数码管的则刚好相反,本文就以共阴的数码管为例来讲解。
数码管显示0~9这10个数字,按照管脚状态的组合,可以得到如下的数字管脚组合表,称它为译码表(小数点忽略,该设计不涉及小数点的使用):
图中用‘1’表示该管脚状态为高,点亮该管脚对应的段码;‘0’则相反;
数字 管脚 |
a |
b |
c |
d |
e |
f |
g |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
2 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
3 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
4 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
5 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
6 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
7 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
8 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
9 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
了解数码管的基本原理以后,还需要解决一个问题,频率计中一共使用了8个数码管,如果每个数码管都需要单独驱动的话,那么就需要56个管脚,管脚使用太多的话不论是对FPGA IO资源占用还是PCB布线都是不合理的,所以需要使用数码管的动态扫描来解决这个问题。
动态扫描的原理(百度百科):数码管动态显示接口是嵌入式系统中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
仿真结果如下图:
结论:一共出现8端波形,从左至右分别是:第8位数码管显示1、第7位数码管显示2、第6位数码管显示3、第5位数码管显示4、第4位数码管显示5、第3位数码管显示6、第2位数码管显示7、第1位数码管显示8,证明显示结果正确。
数码管动态扫描是该系列博客通用模块,可参见该系列博客其他设计的相同内容。
数字频率计的系统逻辑设计
上一章已经完成了频率计的各个模块的仿真验证工作,这一章将上一章节的模块有机的结合起来就构成了一个完整的频率计了,这里要完成的工作即是编写频率计的顶层设计代码,将各个模块连接起来。
4.1 频率计顶层设计代码
/*=====================================================
*****************************************************
design name :frequency_indicator
use :频率计顶层设计
version :V0.1
****************************************************
*****************************************************
端口信号说明:
in clk :100M时钟输入
in rst_n :复位信号输入
in pluse_in :被测脉冲信号
out seg_en :数码管使能端
out seg_data :数码管数据端
*****************************************************
========================================================*/
module frequency_indicator
(
input clk ,
input rst_n ,
input pluse_in ,
output [7:0] seg_en ,
output [6:0] seg_data // //从高到低位abcdefg
);
//================================
//********测频模块定义*************
wire [27:0] frequency;
//================================
//================================
//*****显示数值分解模块模块定义******
wire [3:0] num8;
wire [3:0] num7;
wire [3:0] num6;
wire [3:0] num5;
wire [3:0] num4;
wire [3:0] num3;
wire [3:0] num2;
wire [3:0] num1;
//================================
fre_indicator U1
(
.clk (clk ),
.rst_n (rst_n ),
.pluse_in (pluse_in ),
.frequency (frequency)
);
num_factor U2
(
.clk (clk ),
.rst_n (rst_n ),
.frequency (frequency),
.num8 (num8 ),
.num7 (num7 ),
.num6 (num6 ),
.num5 (num5 ),
.num4 (num4 ),
.num3 (num3 ),
.num2 (num2 ),
.num1 (num1 )
);
nixie_tube U3
(
.clk (clk ),
.rst_n (rst_n ),
.num8 (num8 ),
.num7 (num7 ),
.num6 (num6 ),
.num5 (num5 ),
.num4 (num4 ),
.num3 (num3 ),
.num2 (num2 ),
.num1 (num1 ),
.seg_en (seg_en ),
.seg_data (seg_data )
);
endmodule
4.2 频率计系统模块框图
用quartuse ii对系统工程进行综合以后,点击RTL_VIWER系统可以自动生成设计的系统框图(RTL视图)如图:
仿真结果如下图:
结论:将seg_data的值按照数码管译码表对比,动态扫描显示的数值为1000hz,证明系统级仿真正确,系统仿真正确。
硬件设计
前面的硬件描述语言已经把整个设计的做完,功能仿真也进行完毕了。但是的硬件设计的核心器件还没有定下来。采用器件(EP4CE6E22C8)对工程进行综合编译,可以看到资源占用报告,如图:
可以看出设计占用了该器件40%的资源,这样还有60%的资源余量,那这样看来该器件是可以完成该设计的。
下面以FPGA为例选用EP4CE6E22C8来完成该设计,下面分模块对硬件原理图进行讲解。
5.1 电源接口电路设计
电源接口电路采用了两种供电的方式,满足不同的情况下使用。
(1)Micro Usb供电,取电方便,用智能手机的充电线或者充电宝均可取电;(2)排针供电,但是必须要实验室直流电源通过排线接入5V电源。
电路中使用D1用来防反接,防止电源接反;R1使用的是自恢复保险丝,当后面电路意外短路的时,电阻急剧增大,形成高阻状态,防止烧坏后面电路的器件,当短路情况消失后,电阻减少,形成低阻状态,从而不需要人工干预,有效地保护电路。LED作为一个电源指示灯,当电源接好并且K1开关打开时,电源指示灯常亮。
5.2 电源系统设计
FPGA芯片需要用到3种电源供电,所以电路中设计3种电源转换电路。
(1)5V电源转3.3V,E5、E6用来滤波储能,C3、C6用来滤出高频电源噪声。
(2)5V电源转2.5V,外部加的滤波电容功能同上。
(3)3V电源转1.2V,外部的电容功能同上。
5.3 时钟设计
全局主时钟采用50M有源晶振设计,频率精度高、稳定性好,C7、C8用来滤除有源晶振的电源噪声。
5.4 JTAG端口和FPGA配置电路设计
程序的下载,采用通用的JTAG方式下载程序,由于FPGA掉电易失,所以需要挂一个存储器,电路中选用的是EPCS16S18N,设计PCB板的时候需要注意的地方,就是有些脚需要上拉电阻。
5.5 FPGA芯片的电源引脚
FPGA的电源引脚分布情况,VCC3_3,VCC1_2,以及VCC2_5。
5.6 数码管电流扩展电路
此次设计的数码管电路采用动态扫描的方式来显示。由于电路中有8个数码管,如果不采用动态扫描电路,那么将会用到60多个IO口,不利用PCB布线且也浪费了FPGA芯片的IO口。由于闪烁的频率在大于40HZ后,人眼就无法识别闪烁了,这样,在程序中设置每个数码管的点亮时间大于40HZ,就会实现眼睛被欺骗的结果,数码管常亮。在使用数码管动态扫描电路的时候,一定要注意驱动电流的选择,如果不增加电流扩展电路,那么最终的结果就是数码管的显示很暗又或者显示不稳定,电路中每个公共信号都采用一个NPN三极管来扩展电流,增加驱动能力。
5.7 数码管电路
电路里面的使用了8个上图所示的数码管,采用共阴极的接法,程序中按照8个数码管从高到地位分时选择seg_en_x的管脚,点亮选择的数码管,由于分时选择的速度很快,远远大于人眼能够识别的频率,从而看上去数码管都是亮的。
5.8 复位电路
复位电路,用于程序的复位,本电路中使用的是低电平复位。
5.9 信号采集电路
电路中信号采集电路使用了LM393比较器使用。信号的输入端采用了一个单刀双掷开关实现主板测试信号与外部待测试信号的切换,主板测试信号可以用来测试主板的好坏,当开关拨到主板测试信号时,数码管会显示1000,因为主板的测试信号就是1000hz,比较器的同相端和反相端都是通过一个电阻与一个可调电位器分压的方式来实现信号的调整,当知道待测信号的幅值情况后,可以调节RP1的电阻值来调节反相端的参考电压值,当输入的待测信号幅值大时,也可以通过RP2调整分压值(务必将输入的待测信号调到5V一下,以免输入电压过高,击穿同相输入端)。当同相端电压大于反相端的时候,LM393输出高电平;当同相端电压小于反相端电压时,LM393输出低电平,由于LM393的输出是开漏型,故需要外部上拉。
5.10 PCB设计图
5.11 实物图
6 实物验证
在这里就已经到达设计的最后一个阶段了,需要把整个设计在的实物上进行验证。
6.1 管脚分配
Step1:打开中的工程
(注:formal_code正式程序中的在系统仿真的工程中加入了锁相环和自测脉冲模块,锁相环用于将50Mhz的晶振时钟倍频到100Mhz,自测脉冲用于频率测量的自测实验使用)。
Step2:选择Pin Planner
Step3:根据《管脚分配手册》,对管脚进行分配
分配完成以后保存并从新编译工程。(注:在正式程序的工程中,管脚已经分配好,所以使用时无需再进行分配,这里只是带大家学习这一过程。)
最后一步任务就是把程序下载进入设计的开发板中,然后就可以验证功能是否正确了。
Step1:将实物行如下连接:
Step2: 打开中的工程
Step3:打开programmer
Step4:设置硬件链接
Step4:点击start等待下载完成,下载完成后重新上电
运行结果:(工程中的下载配置文件已固化好,下载即可,若想学习如何进行下载文件的生成,请自行搜索相关方法)
资料合集包传送门:
至此,基于FPGA的等精度数字频率流程已经讲解完毕,博客中讲解了所有的设计原理和设计重点,同时介于篇幅的限制,部分源码没办法全部给出,需要进一步学习的可下载全套资料合集包,资料包合集分为Verilog和VHDL两个版本,本案例资料合集包较大所以分卷压缩成了两卷,请下载两卷后放在同一文件夹下,这样才能解压成功:
传送门: Frequency_indicator_Verilog.rar
传送门: Frequency_indicator_VHDL.rar
资料包含内容如下:
元器件清单 |
||
模块级的仿真工程(可能采用不同的仿真形式和仿真工具,具体以对应的博客为准) |
需要安装Quartuse II 13.1 |
|
系统级的仿真工程(可能采用不同的仿真形式和仿真工具,具体以对应的文档为准) |
需要安装Quartuse II 13.1 |
|
程序工程的实物运行版本版本,用于下载到板卡上运行的(与仿真版本只有参数上的差异,并且生成了配置文件) |
需要安装Quartuse II 13.1 |
|
原理图和PCB设计图 |
打开文档需要安装Adobe Acrobat |
|
产品设计讲解课程,与document的文件使用方法相同,也需要用你的机器码来获取播放密码。并且需要“比特电子视频专用播放器”打开,否则会报文件损坏错误。 |
使用“比特电子视频专用播放器” 去打开视频 |
|
工作室提供了文件使用所需要的软件下载地址和对应的软件安装使用教程提取网址 |
||