【FPGA】单总线——DS18B20

目录

项目:项目(含quartus工程、仿真文件)

[1. 单总线通信时序详解](#1. 单总线通信时序详解)

[1.1 初始化(复位脉冲 + 存在脉冲)](#1.1 初始化(复位脉冲 + 存在脉冲))

[1.2 写时隙(写"0"和写"1")](#1.2 写时隙(写“0”和写“1”))

[1.3 读时隙](#1.3 读时隙)

[2. DS18B20 暂存器与温度数据格式](#2. DS18B20 暂存器与温度数据格式)

[2.1 暂存器结构](#2.1 暂存器结构)

[2.2 温度数据格式(16位补码)](#2.2 温度数据格式(16位补码))

[2.3 常用 ROM 命令](#2.3 常用 ROM 命令)

[3. 温度读取工作流程](#3. 温度读取工作流程)

[3.1 状态机流程(ds18b20_driver.v)](#3.1 状态机流程(ds18b20_driver.v))

[3.2 数据处理流程(data_process.v)](#3.2 数据处理流程(data_process.v))

[4. 系统框架结构](#4. 系统框架结构)

[4.1 顶层模块(sys_top.v)](#4.1 顶层模块(sys_top.v))

[4.2 模块功能说明](#4.2 模块功能说明)

[4.3 数据流图](#4.3 数据流图)

总结


项目:项目(含quartus工程、仿真文件)

1. 单总线通信时序详解

DS18B20 采用单总线(1-Wire)协议进行通信,所有操作都通过一根数据线(DQ)完成,包括初始化、写时隙和读时隙。

1.1 初始化(复位脉冲 + 存在脉冲)

  • 主机行为:拉低总线至少 480µs,然后释放总线。

  • 从机响应:DS18B20 在接收到复位脉冲后,会在 15~60µs 内拉低总线 60~240µs,作为存在脉冲。

  • 代码实现ds18b20_driver.v):

bash 复制代码
if(cnt_xx < 480) begin
    dq_out <= 1'b0;
    dq_out_en <= 1'b1;
end else begin
    dq_out <= 1'b0;
    dq_out_en <= 1'b0;
end

1.2 写时隙(写"0"和写"1")

  • 写"0":主机拉低总线至少 60µs。

  • 写"1":主机拉低总线 1~15µs,然后释放总线。

  • 代码实现

bash 复制代码
if(wr_data[cnt_bit] == 0) begin
    dq_out <= 1'b0;
    dq_out_en <= (cnt_xx < 61) ? 1'b1 : 1'b0;
end else begin
    dq_out <= 1'b0;
    dq_out_en <= (cnt_xx < 1) ? 1'b1 : 1'b0;
end

1.3 读时隙

  • 主机行为:拉低总线 1µs,然后释放并采样。

  • 从机响应:DS18B20 在时隙内保持输出数据。

  • 代码实现

bash 复制代码
dq_out <= 1'b0;
dq_out_en <= (cnt_xx < 1) ? 1'b1 : 1'b0;
if(cnt_xx == 13)
    rd_data_r[cnt_bit] <= dq_in;

2. DS18B20 暂存器与温度数据格式

2.1 暂存器结构

字节 内容 说明
0-1 温度值 LSB 和 MSB
2-3 TH 和 TL 报警阈值
4 配置寄存器 分辨率设置
5-7 保留
8 CRC 校验码

2.2 温度数据格式(16位补码)

  • 示例0x0550 表示 +85.0°C,0xFC90 表示 -55.0°C。

  • 数据处理data_process.v):

    bash 复制代码
    src_data <= rd_data[15] ? (~rd_data[10:0] + 1'b1) : rd_data[10:0];

2.3 常用 ROM 命令

命令 功能
SKIP_ROM 0xCC 跳过 ROM 寻址
CONVERT_T 0x44 启动温度转换
READ_SCRATCH 0xBE 读取暂存器

3. 温度读取工作流程

3.1 状态机流程(ds18b20_driver.v

  1. INIT:发送复位脉冲,检测存在脉冲。

  2. SKIP_ROM:发送 0xCC 跳过 ROM 寻址。

  3. CONVERT_T:发送 0x44 启动温度转换。

  4. WAIT:等待 750ms 转换完成。

  5. 再次 INIT 和 SKIP_ROM

  6. READ_SCRATCH:发送 0xBE 读取暂存器。

  7. RXDATA:读取 2 字节温度数据。

3.2 数据处理流程(data_process.v

  1. 将补码温度转换为原码。

  2. 将温度值乘以 625(扩大 10000 倍,便于显示小数)。

  3. 使用 binary2bcd 模块将二进制转换为 BCD 码。

  4. 输出到数码管和串口。


4. 系统框架结构

4.1 顶层模块(sys_top.v

  • 实例化各子模块:

    • ds18b20_driver:驱动温度传感器。

    • data_process:处理温度数据。

    • uart_tx:串口发送数据。

    • seg_driver:驱动数码管。

4.2 模块功能说明

模块名 功能
ds18b20_driver 实现单总线协议,读取温度数据
data_process 数据转换与处理
binary2bcd 二进制转 BCD 码
uart_tx 串口发送数据
seg_driver 动态数码管显示

4.3 数据流图

bash 复制代码
DS18B20 → ds18b20_driver → data_process → uart_tx → PC
                               ↓
                         seg_driver → 数码管

总结

本项目实现了一个基于 FPGA 的 DS18B20 温度测量系统,具备以下特点:

  • ✅ 单总线协议完整实现(初始化、读、写)

  • ✅ 温度数据补码转原码、BCD 转换

  • ✅ 数码管实时显示温度

  • ✅ 串口输出温度值(含小数点)

  • ✅ 状态机控制流程清晰,代码可读性强

适用于嵌入式系统、FPGA 学习、温度监控等场景。

相关推荐
自由的好好干活13 小时前
从0开始使用LabVIEW操作数据采集卡-概述和新建新建项目
嵌入式硬件·labview
一枚码农~16 小时前
STM32红外与LED控制实战
单片机·嵌入式硬件
Heavy sea16 小时前
STM32定时器(寄存器与HAL库实现)
stm32·单片机
路过羊圈的狼17 小时前
STM32的HAL库驱动ADS124S08进行PT100温度采集
stm32·嵌入式硬件·mongodb
李永奉18 小时前
51单片机-实现红外遥控模块教程
单片机·嵌入式硬件·51单片机
辛集电子19 小时前
【STM32】位带操作
stm32·单片机·嵌入式硬件
wei-dong-1837975400819 小时前
嵌入式硬件工程师每日提问
嵌入式硬件·电源拓扑结构
MOS管-冠华伟业19 小时前
微硕WSF4012 N+P双沟MOS管,驱动汽车智能座椅“无感”升降气泵
单片机·嵌入式硬件
沐欣工作室_lvyiyi19 小时前
基于单片机的汽车防碰撞刹车系统(论文+源码)
单片机·嵌入式硬件·stm32单片机·汽车·毕业设计
点灯小铭20 小时前
基于51单片机宠物喂食系统设计
单片机·mongodb·毕业设计·51单片机·课程设计·宠物