名称:数字频率计 BCD 数码管显示 Verilog Quartus
软件:Quartus
语言:Verilog
功能介绍
本工程实现一个基于 FPGA 的数字频率计,用 Verilog 编写并在 Quartus 环境下建立工程。系统输入 50MHz 时钟和一路被测信号 signal_in,通过计数、锁存和动态数码管显示,将测得的频率计数结果输出到 6 位数码管显示端口。
设计中包含基准频率输出 ts_1K,可用于观察或辅助验证系统时基;数码管接口由 LED_BIT 位选和 LED_SEG 段选组成,适合常见 FPGA 实验板的多位数码管显示结构。顶层模块 frequency 已完成各子模块例化,用户可以直接查看整体连接关系,也可以按模块分别学习测频控制、计数锁存和显示扫描的实现方法。
该项目适用于电子技术课程设计、数字系统设计实验和 Verilog 综合训练。重点内容包括闸门控制、脉冲计数、数据锁存、分频时钟生成以及数码管动态扫描显示,逻辑层次清晰,便于在原工程基础上扩展量程、修改显示格式或替换输入信号源。
运行环境
开发语言:Verilog
开发软件:Quartus
仿真环境:ModelSim / NativeLink 相关工程文件
顶层模块:frequency
主要工程文件:frequency.qpf、frequency.qsf、frequency.v、counter.v、data_store.v、Frq_Ctrl.v、test_sig.v、LED_DISP.v、div_10.v
设计思路
该设计采用典型的“定时闸门计数法”实现数字频率测量。系统以 50MHz 时钟作为工作基准,通过控制模块周期性地产生计数使能、清零和锁存控制信号:在测量窗口内允许计数器对被测信号脉冲进行累加,窗口结束后将计数结果锁存,再进入下一轮清零和重新计数流程。
顶层 frequency 模块把计数、控制、锁存和显示功能拆分为独立模块,便于理解和二次修改。Frq_Ctrl 负责测频时序控制,counter 负责对 signal_in 进行计数,data_store 用于保存稳定显示值,LED_DISP 则把锁存后的 BCD/数值信息送到多位数码管动态扫描显示。
显示部分使用由 test_sig 产生的扫描时钟驱动数码管刷新,同时输出 ts_1K 基准频率信号。这样的结构可以避免计数值在测量过程中直接抖动显示,使用户看到的是每个测量周期结束后的稳定结果,适合课程设计、数字电路实验和 FPGA 频率计入门项目。
模块结构
顶层模块:frequency
主要子模块包括:
1. test_sig:由 50MHz 时钟产生显示扫描相关时钟和 1KHz 基准输出。
2. Frq_Ctrl:产生计数使能 en、清零 rst、锁存 lat 等测频控制信号。
3. counter:在使能窗口内对被测信号 signal_in 进行计数,输出 32 位计数值。
4. data_store:在锁存控制信号作用下保存当前计数值,供显示模块稳定读取。
5. LED_DISP:根据锁存后的数值驱动 6 位数码管位选 LED_BIT 和段选 LED_SEG。
6. div_10:用于十进制分频/拆分相关逻辑,配合显示数据处理使用。
开发板验证
工程带有完整的 Quartus 管脚约束文件 frequency.qsf,可用于开发板 I/O 分配和硬件下载验证。顶层端口包含 50MHz 系统时钟、被测信号输入、1KHz 基准频率输出以及 6 位数码管位选和 8 位段选信号,适合连接到带多位数码管显示接口的 FPGA 实验平台进行频率测量显示验证。
硬件验证重点在于时钟输入、被测信号输入、基准输出和 LED 数码管显示端口的约束匹配。工程已生成 Quartus 输出文件,可在对应 FPGA 目标环境下继续进行编译、下载和板级观察。
仿真图/仿真说明/设计文档图片
工程带有 ModelSim 仿真目录和 Quartus NativeLink 仿真报告,可用于继续进行 RTL 仿真、模块级检查和时序观察。适合结合 frequency 顶层、counter 计数模块、Frq_Ctrl 控制模块以及 LED_DISP 显示模块分别验证测频流程。
部分代码
以下展示顶层模块 frequency 的部分代码,完整源码请下载压缩包查看。
module frequency( input clk,//50MHz input signal_in,//被测信号 output ts_1K,//基准频率 output [5:0] LED_BIT, output [7:0] LED_SEG ); wire en; wire rst; wire lat; wire clk_400Hz; wire [31:0] number; wire [31:0] store_number;//锁存值 //分频模块 test_sig i_test_sig( . clk(clk),//50MHz . clk_400Hz(clk_400Hz), . ts_1K(ts_1K) ); //控制模块 Frq_Ctrl i_Frq_Ctrl( . clk(clk),//50MHz . 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(store_number)//锁存值 ); //数码管显示 LED_DISP i_LED_DISP( . clk(clk_400Hz),//400K . store_number(store_number),//锁存值 . LED_BIT(LED_BIT), . LED_SEG(LED_SEG) ); endmodule
44