module temperature_threshold(
    input clk, // 时钟信号
    input rst, // 复位信号
    input temp_up, // 温度上调
    input temp_down, // 温度下调
    input temp_mode, // 温度模式切换
    input [11:0] temp_data, // 12位温度数据寄存器
    output reg led_ctrl, // LED灯控制信号
    output reg buzzer_ctrl, // 蜂鸣控制信号
    output reg [13:0] seg_display // 14位二进制数码管显示信号
);

parameter THRESHOLD_MODE = 1'b0; // 阈值设置模式
parameter NORMAL_MODE = 1'b1; // 正常模式

reg mode; // 模式状态,0为阈值设置模式,1为正常模式
reg [11:0] temp_threshold_high; // 温度上限阈值
reg [11:0] temp_threshold_low; // 温度下限阈值
reg [3:0] counter; // 切换模式计数器

always @(posedge clk or posedge rst) begin
    if (rst) begin
        mode <= THRESHOLD_MODE; // 复位时默认进入阈值设置模式
        temp_threshold_high <= 12'h000;
        temp_threshold_low <= 12'hFFF;
        counter <= 4'b0000;
        led_ctrl <= 1'b0;
        buzzer_ctrl <= 1'b0;
        seg_display <= 14'b00000000000000;
    end else begin
        // 阈值设置模式
        if (mode == THRESHOLD_MODE) begin
            if (temp_mode == 1'b0) begin // 切换进入正常模式
                mode <= NORMAL_MODE;
                counter <= 4'b0000;
            end else begin // 阈值设置模式下,第一次接收到切换信号时设置温度上限阈值
                case({temp_up, temp_down})
                    2'b01: begin // 温度上调
                        temp_threshold_high <= temp_threshold_high + 1;
                    end
                    2'b10: begin // 温度下调
                        temp_threshold_high <= temp_threshold_high - 1;
                    end
                    default: begin // 不进行任何操作
                    end
                endcase
            end
        end
        // 正常模式
        else begin
            if (temp_mode == 1'b0) begin // 切换进入阈值设置模式
                mode <= THRESHOLD_MODE;
                counter <= 4'b0000;
            end else begin
                if (temp_data >= temp_threshold_low && temp_data <= temp_threshold_high) begin
                    // 温度在阈值范围内,保持LED灯闪烁和蜂鸣器响铃
                    led_ctrl <= counter[2];
                    buzzer_ctrl <= 1'b1;
                    seg_display <= temp_data;
                    counter <= counter + 1;
                end else begin
                    // 温度超出阈值范围,LED灯持续亮起,蜂鸣器鸣响
                    led_ctrl <= 1'b0;
                    buzzer_ctrl <= 1'b0;
                    seg_display <= temp_data;
                end
            end
        end
    end
end

endmodule

该模块通过接收实时温度数据并与预设的温度阈值进行比较,实现以下功能:

  1. 温度阈值设置: 通过系统按键控制模块的输入信号,在阈值设置模式下设定温度上限和下限阈值。
  2. 温度数据比较: 在正常模式下,将实时温度数据与预设的阈值进行比较。
  3. LED 编码输出: 根据温度数据是否超出阈值范围,控制 LED 灯的闪烁或持续亮起,以进行报警提示。
  4. 蜂鸣器控制: 当温度数据超出阈值范围时,控制蜂鸣器鸣响,发出警报信号。
  5. 数码管显示: 将实时温度数据显示在数码管上。

本模块的输入端口包括:时钟信号、复位信号、温度上调信号、温度下调信号、温度模式切换信号和 12 位温度数据寄存器。输出端口包括:LED 灯控制信号、蜂鸣控制信号和 14 位二进制数码管显示信号。

该模块使用状态机来实现两种工作模式:阈值设置模式和正常模式。在阈值设置模式下,用户可以通过按键设置温度阈值。在正常模式下,模块会持续比较温度数据和阈值,并根据比较结果输出相应的控制信号。

Verilog HDL 温度阈值处理模块代码实现

原文地址: https://www.cveoy.top/t/topic/nYyb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录