【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 学习、温度监控等场景。

相关推荐
shansz20202 分钟前
暂时无法解决的关于STM32F103的RTC日期更新问题
stm32·嵌入式硬件·实时音视频
2501_9277730711 分钟前
嵌入式——时序IIC
单片机·嵌入式硬件
LS_learner3 小时前
针对VMware Workstation虚拟机无法联网问题排查
嵌入式硬件
项目題供诗4 小时前
51单片机入门(七)
单片机·嵌入式硬件·51单片机
来自晴朗的明天4 小时前
1、光耦隔离电路
单片机·嵌入式硬件·硬件工程
国科安芯5 小时前
面向星载芯片原子钟的RISC-V架构MCU抗辐照特性研究及可靠性分析
单片机·嵌入式硬件·架构·制造·risc-v·pcb工艺·安全性测试
三伏5226 小时前
Cortex-M3权威指南Cn第十章——笔记
笔记·单片机·嵌入式硬件·cortex-m3
独处东汉6 小时前
freertos开发空气检测仪之按键输入事件管理系统设计与实现
人工智能·stm32·单片机·嵌入式硬件·unity
小灰灰搞电子6 小时前
STM32/GD32 字节对齐详解
stm32·单片机·嵌入式硬件
我送炭你添花8 小时前
工业触摸屏:PCAP(投影电容式)触摸屏控制器选型推荐(工业级,2025-2026主流)
嵌入式硬件·自动化