`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Engineer: Yangshenbo // version:V1.0 // Create Date: 2026/04/05 ////////////////////////////////////////////////////////////////////////////////// module digital_thermometer( input clk, input rst_n, input sig_in, input [23:0]win_us, input [1:0]out_mode, //0输出对应温度, 1输出对应的频率,2单位窗口输出脉冲的个数 input [15:0]temp_85_fre_k, //85°对应的频率,默认为600khz input [15:0]temp_neg_40_fre_k , //-40对应的频率,默认为160khz,单位khz input report_en, //主动上报使能 input [23:0]rep_gap_us, //最小位win_us output reg [23:0]therm_out, output reg therm_vld ); wire [23:0] wd_cnt_out; wire wd_cnt_vld; reg [23:0] gap_cnt; // 上报间隔计数器 wire [23:0] cur_freq_khz; reg signed [23:0] temp_scaled; assign cur_freq_khz = (wd_cnt_out * 1000) / win_us; //我们将温度结果放大100倍 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin temp_scaled <= 0; end else if (wd_cnt_vld) begin // 如果当前频率低于或等于 -40度对应的标定频率,直接输出 -4000 if (cur_freq_khz <= temp_neg_40_fre_k) begin temp_scaled <= -32'sd4000; end else begin // 只有在频率大于下限时,才进行插值计算,避免减法溢出 temp_scaled <= ((cur_freq_khz - temp_neg_40_fre_k) * 12500) / (temp_85_fre_k - temp_neg_40_fre_k) - 4000; end end end // 上报逻辑与输出选择 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin gap_cnt <= 0; therm_vld <= 0; therm_out <= 0; end else if (wd_cnt_vld) begin if (report_en) begin if (gap_cnt >= (rep_gap_us / win_us) - 1) begin gap_cnt <= 0; therm_vld <= 1'b1; end else begin gap_cnt <= gap_cnt + 1'b1; therm_vld <= 1'b0; end end else begin gap_cnt <= 0; therm_vld <= 1'b0; end // 模式切换输出 case (out_mode) 2'd0: therm_out <= temp_scaled; // 输出放大100倍的温度 2'd1: therm_out <= cur_freq_khz; // 输出频率(kHz) 2'd2: therm_out <= wd_cnt_out; // 输出原始脉冲计数值 default: therm_out <= temp_scaled; endcase end else begin therm_vld <= 1'b0; end end // 实例化被测模块 pulse_cnt #( .CLK_FREQ(50_000_000) ) pulse_cnt_inst ( .clk (clk), .rst_n (rst_n), .sig_in (sig_in), .win_us (win_us), .cnt_out(wd_cnt_out), .vld_out(wd_cnt_vld) ); endmodule