79 lines
2.0 KiB
Verilog
79 lines
2.0 KiB
Verilog
`timescale 1ns / 1ps
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
// Engineer: Yangshenbo
|
||
//
|
||
// Create Date: 2026/03/22
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
|
||
module digital_thermometer(
|
||
input clk,
|
||
input rst_n,
|
||
input vin,
|
||
input mode,
|
||
output reg [19:0]freq_x100hz,
|
||
output reg [15:0]temp_out,
|
||
output reg temp_valid
|
||
);
|
||
|
||
wire [19:0] freq;
|
||
wire freq_valid;
|
||
|
||
|
||
//映射表:
|
||
reg [15:0] temp_lut [0:800];
|
||
integer i;
|
||
initial begin
|
||
for (i = 0; i <= 800; i = i + 1) begin
|
||
// 50.0kHz->-40°C, 130.0kHz->85°C
|
||
// temp = -400 + (1250 * i) / 800
|
||
temp_lut[i] = -400 + (1250 * i + 400) / 800;
|
||
end
|
||
end
|
||
|
||
|
||
always @(posedge clk or negedge rst_n) begin
|
||
if (!rst_n) begin
|
||
freq_x100hz <= 0;
|
||
temp_out <= 0;
|
||
temp_valid <= 0;
|
||
end
|
||
else begin
|
||
temp_valid <= freq_valid;
|
||
|
||
if (freq_valid) begin
|
||
freq_x100hz <= freq;
|
||
|
||
if (mode == 0) begin
|
||
// 模式0:线性输出
|
||
// 频率范围:500~1300(50.0kHz~130.0kHz)
|
||
if (freq < 500)
|
||
temp_out <= -400;
|
||
else if (freq > 1300)
|
||
temp_out <= 850;
|
||
else
|
||
temp_out <= -400 + ((freq - 500) * 1250) / 800;
|
||
end else begin
|
||
// 模式1:查表输出
|
||
if (freq < 500)
|
||
temp_out <= temp_lut[0];
|
||
else if (freq > 1300)
|
||
temp_out <= temp_lut[800];
|
||
else
|
||
temp_out <= temp_lut[freq - 500];
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
pulse_freq_10ms u_freq_measure (
|
||
.clk (clk),
|
||
.rst_n (rst_n),
|
||
.vin (vin),
|
||
.freq (freq), //1302 ->130.2KHz
|
||
.valid (freq_valid)
|
||
);
|
||
|
||
endmodule
|