Verilog实现ZYBO板搭载ds18b20所测温度的收集和超温时报警

硬件信息

所用开发板为zybo z720
ds18b20测温元件介绍
报警装置由蜂鸣器构成,选用最简单的蜂鸣器,输入高电平蜂鸣器报警,低电平无响应

硬件连接

ds18b20温控模块连接图
在这里插入图片描述蜂鸣器连接图
在这里插入图片描述

模块详解

温度传感器模块

在这里插入图片描述clk为系统时钟输入引脚,输入为125mhz时钟,模块内部写有分频器;
rst引脚为复位引脚;
one_wire为数据总线,从温度传感器接收温度数据,
Led和buzzer为自己定义的管脚,如果温度高于某个值,则点亮led并且启动buzzer(蜂鸣器)。
Temp_control为自己添加的使能开关,开关闭合时,温度传感器不工作,可删去。

蜂鸣器模块

在这里插入图片描述蜂鸣器模块,接收一个寄存器的值,如果为高电平,则输出1个高电平,使蜂鸣器发出警报声。

代码实现

蜂鸣器模块

module DS18B20(
  input         clk,                    // 50MHz时钟
//  input         rst_n,                  // 异步复位
  inout         one_wire,               // One-Wire总线
  output [15:0] temperature            // 输出温度值

);

 reg rst_n;
 reg [19:0]count;
 always@(posedge clk)
 begin
    if(count<20'h80000)
       begin
       rst_n<=1;
       count<=count+1;
       end
    else if(count<20'h8ffff) 
       begin
       rst_n<=0;
       count<=count+1;
       end
    else
       rst_n<=1;
 end

//++++++++++++++++++++++++++++++++++++++
// 分频器125MHz->1MHz 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] cnt;                         // 计数器

always @ (posedge clk, negedge rst_n)
  if (!rst_n)
    cnt <= 0;
  else
    if (cnt == 125)
      cnt <= 0;
    else
      cnt <= cnt + 1'b1;

reg clk_1us;                            // 1MHz 时钟

always @ (posedge clk, negedge rst_n)
  if (!rst_n)
    clk_1us <= 0;
  else
    if (cnt <= 62)                      // 24 = 50/2 - 1
      clk_1us <= 0;
    else
      clk_1us <= 1;      

//--------------------------------------
// 分频器50MHz->1MHz 结束
//--------------------------------------

//延时模块的使用
//++++++++++++++++++++++++++++++++++++++
// 延时模块 开始
//++++++++++++++++++++++++++++++++++++++
reg [19:0] cnt_1us;                      // 1us延时计数器
reg cnt_1us_clear;                       // 请1us延时计数器

always @ (posedge clk_1us)
  if (cnt_1us_clear)
    cnt_1us <= 0;
  else
    cnt_1us <= cnt_1us + 1'b1;
//--------------------------------------
// 延时模块 结束
//--------------------------------------


//++++++++++++++++++++++++++++++++++++++
// DS18B20状态机 开始
//++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++
// 格雷码
parameter S00     = 5'h00;
parameter S0      = 5'h01;
parameter S1      = 5'h03;
parameter S2      = 5'h02;
parameter S3      = 5'h06;
parameter S4      = 5'h07;
parameter S5      = 5'h05;
parameter S6      = 5'h04;
parameter S7      = 5'h0C;
parameter WRITE0  = 5'h0D;
parameter WRITE1  = 5'h0F;
parameter WRITE00 = 5'h0E;
parameter WRITE01 = 5'h0A;
parameter READ0   = 5'h0B;
parameter READ1   = 5'h09;
parameter READ2   = 5'h08;
parameter READ3   = 5'h18;

reg [4:0] state;                       // 状态寄存器
//-------------------------------------

reg one_wire_buf;                      // One-Wire总线 缓存寄存器

reg [15:0] temperature_buf;            // 采集到的温度值缓存器(未处理)
reg [5:0] step;                        // 子状态寄存器 0~50
reg [3:0] bit_valid;                   // 有效位  
  
always @(posedge clk_1us, negedge rst_n)
begin
  if (!rst_n)
  begin
    one_wire_buf <= 1'bZ;
    step         <= 0;
    state        <= S00;
  end
  else
  begin
    case (state)
      S00 : begin              
              temperature_buf <= 16'h001F;
              state           <= S0;
            end
      S0 :  begin                       // 初始化
              cnt_1us_clear <= 1;
              one_wire_buf  <= 0;              
              state         <= S1;
            end
      S1 :  begin
              cnt_1us_clear <= 0;
              if (cnt_1us == 500)         // 延时500us
              begin
                cnt_1us_clear <= 1;
                one_wire_buf  
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
首先,需要了解DS18B20温度传感器的工作原理和Verilog HDL语言的基础知识。 DS18B20温度传感器是一种数字温度传感器,使用1-Wire总线协议进行通信。其工作原理是通过测量温度对内部的晶体管进行电阻的变化,从而将温度转换为数字信号输出。温度传感器的数据线(DQ)连接到单个GPIO引脚上,通过1-Wire协议发送和接收数据。 Verilog HDL语言是一种硬件描述语言,用于描述数字电路的行为和结构。它可以将硬件电路转换为代码,并且可以在FPGA或ASIC上实现。在本例中,我们将使用Verilog HDL语言来设计一个DS18B20温度报警系统。 以下是Verilog HDL代码的示例: ``` module DS18B20_temp_alert( input clk, //钟信号 input rst, //重置信号 input dq, // DQ数据线 output reg alert // 报警信号 ); // 定义状态机的状态 parameter IDLE = 2'b00; parameter READ = 2'b01; parameter ALERT = 2'b10; // 定义状态机的状态转换条件 reg [1:0] state, next_state; always @ (posedge clk or posedge rst) begin if (rst) begin state <= IDLE; end else begin state <= next_state; end end // 定义温度传感器数据读取的状态机 always @ (state, dq) begin case (state) IDLE: begin next_state = READ; end READ: begin next_state = ALERT; end ALERT: begin if (dq == 1'b0) begin alert <= 1'b1; end else begin alert <= 1'b0; end next_state = IDLE; end default: begin next_state = IDLE; end endcase end endmodule ``` 在这个Verilog HDL代码中,我们定义了一个有限状态机,用于控制DS18B20温度传感器的读取和报警功能。该模块具有四个状态:IDLE,READ,ALERT和default。其中,IDLE状态表示模块处于空闲状态,READ状态表示模块正在读取温度传感器的数据,ALERT状态表示模块正在检查温度传感器的数据是否超过了设定的报警,default状态表示状态机出现错误。 我们还定义了一个钟信号(clk)、重置信号(rst)、数据线(dq)和报警信号(alert)。钟信号用于同步模块的操作,重置信号用于将模块恢复到初始状态,数据线用于接收温度传感器的数据,报警信号用于指示是否需要触发报警。 在状态机的状态转换条件中,我们将模块初始化为IDLE状态,并在IDLE状态下转换到READ状态。在READ状态下,模块将从温度传感器读取数据,并在ALERT状态下检查是否需要触发报警。如果需要触发报警报警信号将设置为1,否则为0。最后,模块将返回到IDLE状态,等待下一次读取。 这就是一个简单的DS18B20温度报警系统的Verilog HDL代码示例。要实际使用此代码,需要将其编译成比特流,然后将其加载到FPGA或ASIC中运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值