thermometer_digital/rtl/pulse_freq_10ms.v

71 lines
2.1 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2026/03/22 18:53:43
// Design Name:
// Module Name: pulse_freq_10ms
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
module pulse_freq_10ms #(
parameter CLK_FREQ = 50_000_000, // 系统时钟频率Hz默认50MHz
parameter WINDOW_MS = 10 // 测量时间窗口ms默认10ms
) (
input clk, // 系统时钟
input rst_n, // 异步复位,低有效
input vin, // 输入方波
output reg [19:0] freq, // 时间窗口内脉冲计数如果为1302就是130.2k
output reg valid // 测量完成有效脉冲
);
// 计算窗口计数最大值
localparam WINDOW_CNT = (CLK_FREQ / 1000) * WINDOW_MS - 1;
reg [31:0] cnt_window; // 窗口计时器使用32位以防大数值
reg [19:0] pulse_cnt; // 脉冲计数器
reg vin_sync1, vin_sync2;
wire vin_rise;
// 边沿检测
always @(posedge clk) begin
vin_sync1 <= vin;
vin_sync2 <= vin_sync1;
end
assign vin_rise = vin_sync1 & ~vin_sync2;
// 核心逻辑:窗口计数 + 脉冲计数 + 锁存输出
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_window <= 0;
pulse_cnt <= 0;
valid <= 0;
end else begin
valid <= 0; // 默认无效
if (cnt_window == WINDOW_CNT) begin // 窗口时间到
freq <= pulse_cnt; // 输出计数值
valid <= 1;
cnt_window <= 0;
pulse_cnt <= 0;
end else begin
cnt_window <= cnt_window + 1;
if (vin_rise) pulse_cnt <= pulse_cnt + 1;
end
end
end
endmodule