频率周期测量与数码管显示 Verilog Quartus

名称:频率周期测量与数码管显示 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:Cyclone IV FPGA开发板

功能介绍

本工程实现一个基于 Verilog 的数字频率计与周期测量仪,输入被测方波信号后,可在频率测量和周期测量两种模式之间切换,并将结果转换为 BCD 数据显示在多位数码管上。顶层模块提供 50MHz 系统时钟、被测信号输入、两个低有效模式按键,以及 1kHz 基准和 74HC595 数码管驱动接口。\n\n频率测量采用默认 1 秒门控时间,计数分辨率为 1Hz;周期测量以默认 1us 时间刻度计算输入信号周期。工程将时基生成、门控控制、边沿计数、数据锁存、周期测量、显示选择和数码管扫描拆分为独立模块,便于阅读、仿真和参数修改。通过调整顶层参数,可以适配不同系统时钟或改变测量时序。

运行环境

开发环境为 Intel Quartus 工程,设计语言为 Verilog,顶层模块为 frequency,目标平台为 Cyclone IV FPGA 开发板。系统时钟默认 50MHz,数码管扫描时钟约 400Hz,1kHz 基准由分频参数生成。工程包含 frequency.qsf 管脚约束、Quartus 工程文件、ModelSim 仿真配置及可用于编译和下载的输出文件。

设计思路

设计以 50MHz 系统时钟为基础,先由 test_sig 产生约 400Hz 的数码管扫描时钟和 1kHz 基准信号。测频链路由 Frq_Ctrl 产生门控、锁存和复位时序,在默认 1 秒门控窗口内由 counter 对 signal_in 的边沿进行计数,再由 data_store 锁存结果。参数化的总周期、门控周期及锁存复位时刻便于根据时钟频率和测量需求调整。\n\n周期测量链路使用 period_meas 生成 1us 时间基准,对被测方波周期进行计量并输出 BCD 结果。key_mode 根据两个低有效按键选择频率或周期显示,disp_mux 完成两路 BCD 数据的切换。最后由 LED_DISP 完成位选、段选扫描,hc595_ctrl 将显示数据串行送入移位寄存器,减少顶层外部连线并适配数码管显示。

模块结构

顶层模块 frequency 负责连接各功能单元。test_sig 产生 400Hz 扫描时钟和 1kHz 基准;key_mode 处理测频与测周期按键模式;Frq_Ctrl 生成测频使能、锁存和复位时序;counter 对 signal_in 进行门控计数;data_store 锁存频率结果;period_meas 完成周期测量;disp_mux 选择当前显示的频率或周期 BCD 数据;LED_DISP 生成数码管位选和段选;hc595_ctrl 负责移位寄存器串行输出。工程同时包含 div_10 等辅助逻辑以及 testbench 仿真相关模块。

开发板验证

项目已在 Cyclone IV FPGA 开发板上完成验证,工程提供了 frequency.qsf 管脚约束与分配文件,并配套开发板实物图片。下载配置后,可将被测方波接入 signal_in,通过 key_freq_n 选择频率测量、通过 key_period_n 选择周期测量,结果经数码管接口输出。

频率周期测量与数码管显示 Verilog Quartus 开发板验证图片 开发板.jpg

演示视频

配套演示视频展示该频率检测工程的实际使用流程,便于结合工程源码观察测频、测周期模式切换及数码管显示接口的工作效果。

仿真图/仿真说明/设计文档图片

配套设计文档覆盖工程文件、程序编译、RTL 结构、管脚分配、仿真图、Testbench、顶层仿真图,以及分频/时基、按键模式切换、控制、计数、锁存、周期测量、显示选择和 74HC595 数码管驱动等模块说明,可用于对照源码理解信号连接和时序关系。

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image1.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image10.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image11.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image12.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image13.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image14.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image15.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image16.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image17.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image18.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image19.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image2.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image20.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image21.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image3.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image4.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image5.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image6.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image7.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image8.png

频率周期测量与数码管显示 Verilog Quartus 设计文档图片 image9.png

部分代码

以下展示顶层模块 frequency 的部分代码,完整源码请下载压缩包查看。

module frequency #(
	//test_sig 分频参数(默认 50MHz)
	parameter integer CLK400_HALF_DIV = 62500, //50MHz/(2*62500)=400Hz
	parameter integer TS1K_HALF_DIV   = 25000, //50MHz/(2*25000)=1kHz

	//测频门控参数(默认 1秒门控,分辨率 1Hz)
	parameter integer FRQ_TOTAL_CYCLES = 53000000,
	parameter integer FRQ_GATE_CYCLES  = 50000000,
	parameter integer FRQ_LAT_START    = 50000100,
	parameter integer FRQ_LAT_END      = 50000200,
	parameter integer FRQ_RST_START    = 50000300,
	parameter integer FRQ_RST_END      = 50000400,

	//周期测量 us_tick 分频参数(默认 1us)
	parameter integer PERIOD_US_DIV_MAX = 49
)(
	input clk,         //系统时钟(默认 50MHz)
	input signal_in,   //被测方波信号
	input key_freq_n,  //按键1:测频,按下为低
	input key_period_n,//按键2:测周期,按下为低
	output ts_1K,      //1kHz基准信号输出
    output               stcp        ,   //数据存储器时钟
    output               shcp        ,   //移位寄存器时钟
    output               ds          ,   //串行数据输入
    output              oe              //使能信号,低有效
);

wire en;
wire rst;
wire lat;
wire clk_400Hz;
wire [31:0] number;
wire [31:0] freq_bcd;
wire [31:0] period_bcd;
wire mode_period;
wire [31:0] disp_bcd;

wire [5:0] LED_BIT;//数码管位选
wire [7:0] LED_SEG;//数码管段选	

//分频/时基模块:得到扫描时钟与 1kHz 基准信号
test_sig #(
	.CLK400_HALF_DIV(CLK400_HALF_DIV),
	.TS1K_HALF_DIV(TS1K_HALF_DIV)
) i_test_sig(
	. clk(clk),
	. clk_400Hz(clk_400Hz),
	. ts_1K(ts_1K)
);

//按键模式切换
key_mode i_key_mode(
. clk(clk),
. key_freq_n(key_freq_n),
. key_period_n(key_period_n),
. mode_period(mode_period)
);

//控制模块
Frq_Ctrl #(
	.TOTAL_CYCLES(FRQ_TOTAL_CYCLES),
	.GATE_CYCLES(FRQ_GATE_CYCLES),
	.LAT_START(FRQ_LAT_START),
	.LAT_END(FRQ_LAT_END),
	.RST_START(FRQ_RST_START),
	.RST_END(FRQ_RST_END)
) i_Frq_Ctrl(
	. clk(clk),
	. en(en),
	. rst(rst),
	. lat(lat)
);

//计数器
counter i_counter (
. signal_in(signal_in),//被测信号
. en(en),//使能
. rst(rst),//清零
. number(number)//计数值
);

//锁存器
data_store i_data_store(
. lat(lat),//锁存
. number(number),//计数值
. store_number(freq_bcd)//锁存值
);

//周期测量
period_meas #(
	.US_DIV_MAX(PERIOD_US_DIV_MAX)
) i_period_meas(
	. clk(clk),
	. signal_in(signal_in),
	. period_bcd(period_bcd)
);

//频率和周期选择器
disp_mux i_disp_mux(
. mode_period(mode_period),
. freq_bcd(freq_bcd),
. period_bcd(period_bcd),
. disp_bcd(disp_bcd)
);

//数码管控制
LED_DISP i_LED_DISP(
. clk(clk_400Hz),//约 400Hz
. store_number(disp_bcd),//锁存值
. LED_BIT(LED_BIT),
. LED_SEG(LED_SEG)
);

//hc595驱动显示数码管
////////////////////////////////////////////////////////////////////////
hc595_ctrl  i_hc595_ctrl
(
    .sys_clk     (clk),   //系统时钟,频率50MHz
    .sys_rst_n   (1'b1),   //复位信号,低有效
    .sel         (LED_BIT),   //数码管位选信号
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 频率周期测量与数码管显示 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员