【至简设计案例系列】基于FPGA的频率、电压测量仪器

作者:造就狂野青春

1、概述

基于明德扬至简设计法和明德扬设计规范,设计一个基于FPGA的频率、电压测量仪器,实现了测量AD采集后的波形频率和电压(峰峰值),并将数值显示在数码管上。这个案例通过扩展还可结合明德扬的波形采集显示案例实现显示波形频率、峰峰值功能,还可拓展结合上次DDS案例产生的已知波形的频率峰峰值,验证本设计的正确性。

本案例的扩展和应用在现实生活中具有重大意义。

在本案例的设计过程中,应用了至简设计法、状态机模板应用等,在经过逐步改进、调试等一系列工作之后,最终达到了设计目标。

2、设计目标

(1)将AD采集后的数据转换成同频率的方波,并测量出波形实际频率
(2)能够实现测量出波形的周期
(3)能够实现测量波形的峰峰值或者某个信号的电压值
(4)数码管显示频率或电压值,并通过按键控制切换决定数码管显示频率或电压值

3、模块功能

(1)频率测量模块实现功能:
将AD采集后的数据转换成同频率的方波;
测量出波形的实际频率;
测量出波形的周期

(2)电压测量模块实现功能:
将AD采集后的数据进行缓冲;
记录数据最大值和最小值;
根据公式得出波形的峰峰值(电压)

(3)数码管显示模块实现功能
数码管显示频率值或者电压值
通过按键1实现切换决定数码管显示频率还是电压

(4)按键模块实现功能:
将外来异步信号打两拍处理,将异步信号同步化;
实现20ms按键消抖功能,并输出有效按键信号;

4、信号定义

(1)顶层模块Freq_Volt_Top.v

信号 定义
clk 系统时钟
rst_n 低电平复位信号
ad_data AD采集输入
seg_sel 数码管位选信号
Seg_ment 数码管显示信号

(2)频率测量模块Frequency.v

信号 定义
clk 系统时钟
rst_n 低电平复位信号
ad_data AD采集输入
Freq 频率值
Period 周期

(3)电压测量模块Voltage.v

信号 定义
clk 系统时钟
rst_n 低电平复位信号
ad_data AD采集输入
Volt 电压值(峰峰值)

(4)数码管显示模块sel_disp.v

信号 定义
clk 系统时钟
rst_n 低电平复位信号
din 显示数据
seg_sel 数码管位选信号
Seg_ment 数码管显示信号

(5)按键模块key_module.v

信号 定义
clk 系统时钟
rst_n 低电平复位信号
key_in 按键输入
key_vld 有效按键

5、频率测量代码
在这里插入图片描述
在这里插入图片描述

利用四段式状态机模板,可以很熟练地写出状态的转换,先将ad_data取最高位,得到同频率的方波,再分别计算方波高电平和低电平的时间,就可以得出一个周期的时间,从而计算出频率值和峰峰值。利用wave的高低电平控制状态机进入高电平计数或低电平计数状态。

在这里插入图片描述

S1状态:即wave=1时开始进行高电平计数,wave=0时证明变为低电平,记录下high_cnt的最大值,代表高电平的时间。
在这里插入图片描述

S2状态:即wave=0时开始进行低电平计数,wave=1时证明变为高电平,记录下low_cnt的最大值,代表低电平的时间。
得到高电平和低电平的时间,相加即得到一个周期的时间,可以算出频率值和周期值
在这里插入图片描述

FPGA原则上不能直接进行除法运算,因此调用除法器IP进行除法运算可以算出频率值,取整数部分。

6、电压测量
在这里插入图片描述

将AD数据和初始的最大值最小值相比较,如果AD数据大则赋值给fengzhi_max,如果AD数据小则赋值给fengzhi_min,经过一段时间后可以得出数据的最大值和最小值。如果是8位AD9280,则255代表+5V,0代表-5V;

则可以得到峰峰值计算公式;

值得注意的是,记录下最大最小值后,fengzhi_max,fengzhi_min将不变,为了能够实时记录数据最大最小值,需要定时刷新,因此设置1s RST信号,定时初始化fengzhi_max,fengzhi_min。
在这里插入图片描述

7、数码管显示
在这里插入图片描述

通过按键切换决定数码管显示频率值还是电压值。
在这里插入图片描述
动态扫描数码管,同时显示多个不同数字,显示频率和电压信息。数码显示原理和案例具体请学习论坛上资料。

在这个设计案例中,至简设计法和明德扬计数器模板、状态机模板发挥了至关重要的作用,使我能够快速准确完成设计。

本设计可以加以拓展:
结合明德扬AD采集波形案例,将计算出的频率值、电压值显示在VGA屏幕上;

对于初学者而言,流水灯太简单,复杂项目又太难,不如尝试一下这些相对简单而又酷炫的案例,并一步步拓展成大项目。赶紧动手尝试吧。