频率计数计 FPGA 设计 Verilog Vivado ISE/Vivado

名称:频率计数计 FPGA 设计 Verilog Vivado ISE/Vivado

软件:ISE/Vivado

语言:Verilog

功能介绍

本设计实现基于 FPGA 的频率计数计功能,采用测频法对输入或板内分频产生的测试信号进行计数测量,并将测量结果送至数码管显示。设计目标是完成可综合、可仿真、可上板调试的频率测量工程,适合用于 FPGA 数字系统课程设计、实验项目和频率测量类 Verilog 工程参考。 系统围绕频率测量、计数控制、数据锁存和显示输出展开。计数模块负责在规定测量窗口内统计待测信号脉冲数,控制模块负责协调测量周期、清零、锁存等工作,显示模块将结果转换为数码管可显示的数据形式。由于显示部分面向 8 位数码管,工程适合展示多位频率结果,便于观察测量过程和输出状态。 工程同时包含仿真工程和板级工程,可用于先在 Vivado 中进行行为仿真,再结合约束文件完成综合、实现和比特流生成。对于需要理解测频法、数码管动态显示以及 FPGA 工程完整流程的用户,该设计具有较好的学习和二次开发价值。

运行环境

开发语言:Verilog 开发软件:Vivado / ISE 相关工程文件 工程类型:FPGA 频率计数计设计,包含仿真工程、板级工程、约束文件和实现结果文件。

设计思路

设计采用典型测频法思路:在固定的闸门时间或控制周期内,对待测信号的上升沿或有效脉冲进行累计计数,测量窗口结束后将计数结果锁存,再进入下一轮清零和重新计数。这样可以把输入信号频率转换为单位时间内的脉冲个数,便于在 FPGA 内部用计数器和寄存器完成实现。 系统结构上将频率测量流程拆分为多个功能模块。控制模块产生测量节拍和状态控制信号,计数模块完成待测信号计数,数据存储模块在测量结束时保存稳定结果,显示模块负责将结果送往数码管显示。模块化写法便于单独调试各部分逻辑,也方便根据实际需求调整测量窗口、显示位数或输入信号来源。 测试信号可通过板内分频方式产生,用于完成基本测量验证。该方式不依赖外部信号源即可观察频率计的计数与显示效果,适合实验室和课程设计场景。工程还包含 Vivado 仿真相关文件,可通过测试平台观察计数、锁存和显示数据变化,帮助确认测频流程是否符合预期。

模块结构

主要模块包括: Freq_test:频率计数计顶层相关模块,连接计数、控制、存储和显示逻辑。 counter:计数模块,用于在测量周期内统计待测信号脉冲数量。 Frq_Ctrl:频率测量控制模块,用于产生测量、清零、锁存等控制节拍。 data_store:数据存储模块,用于保存测量结果,避免显示过程中数据抖动。 LED_DISP:数码管显示模块,用于将测量结果输出到数码管显示端。 div_clk:分频模块,可用于产生内部测试或控制所需时钟。 Freq_34_cui_vlg_tst:仿真测试平台,用于对频率计逻辑进行行为仿真。

开发板验证

工程包含开发板管脚约束文件,可用于完成 FPGA 引脚分配、综合实现和板级调试流程。约束内容覆盖时钟、复位、数码管显示及相关外设信号,配合已生成的实现与 bit 文件,可作为上板验证和二次移植时的重要参考。 板级验证重点可放在数码管显示结果是否随待测分频信号变化、复位后系统是否能重新开始测量、计数结果锁存是否稳定等方面。用户可根据实际开发板接口继续调整约束文件中的管脚分配。

演示视频

包含仿真视频,可用于观察频率计数计在仿真环境下的运行过程和波形变化,重点参考测量控制、计数结果更新以及显示数据变化。

演示视频请关注公众号后获取对应资料查看。

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

包含 Vivado 仿真工程、测试平台文件和仿真运行结果文件,可用于查看行为仿真流程。仿真部分适合验证计数窗口、清零锁存时序、结果更新以及数码管显示数据输出是否符合设计逻辑。 设计文档要求包含仿真波形、综合后原理图和开发板调试内容,因此工程可作为从代码编写、仿真验证到综合实现的完整流程参考。

部分代码

以下展示顶层模块at7的部分代码,完整代码可关注下方公众号卡片获取。

module at7( input sys_clk_i, //外部输入100MHz时钟信号 input ext_rst_n, //外部输入复位信号,低电平有效 input chnl_sw , // UART接收数据信号 output rtc_iic_sck, //RTC芯片的IIC时钟信号 inout rtc_iic_sda, //RTC芯片的IIC数据信号 output [7:0] rtc_rdsecd //RTC芯片的IIC时钟信号 ); wire clk_12m5; //PLL输出12.5MHz时钟 wire clk_25m; //PLL输出25MHz时钟 wire clk_50m; //PLL输出50MHz时钟 wire clk_100m; //PLL输出100MHz时钟 wire sys_rst_n; //PLL输出的locked信号,作为FPGA内部的复位信号,低电平复位,高电平正常工作 //PLL例化 clk_wiz_0 u1_clk_wiz_0 ( // Clock in ports .clk_in1(sys_clk_i), // input clk_in1 // Clock out ports .clk_out1(clk_25m), // output clk_out1 // Status and control signals .reset(!ext_rst_n), // input reset .locked(sys_rst_n)); // output locked reg [7:0] clk_cnt; always @(posedge clk_25m or negedge sys_rst_n) if(!sys_rst_n) begin clk_cnt <= 8'd0; end else begin clk_cnt <= clk_cnt+ 1'b1; end // pcf8563 pcf8563( .mclk (clk_cnt[5]), .reset (sys_rst_n), .scl (rtc_iic_sck), .sda (rtc_iic_sda), .s_reg (rtc_rdsecd ), .led (), .seg (), .com ()); endmodule

代码获取:点击下方公众号卡片