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

相关推荐
btzhy4 小时前
STM32单片机:基本定时器应用:单脉冲模式(STM32L4xx)
stm32·单片机·嵌入式硬件·基本定时器应用:单脉冲模式
文sir.6 小时前
温湿度采集系统(stm32+mqtt+Onenet云平台+esp8266)
stm32·单片机·嵌入式硬件·mqtt·onenet·云平台·esp8266
DIY机器人工房6 小时前
嵌入式面试题:你有没有用过直接基于TCP协议,不借助HTTP、MQTT这类上层协议的项目经历?
stm32·单片机·嵌入式硬件·面试题·diy机器人工房
zhmc8 小时前
Cortex M0单片机指令执行周期
单片机·嵌入式硬件
编程小白菜1238 小时前
STM32L051单片机485Ymode升级后程序不能正常运行问题
stm32·嵌入式硬件
NEU-UUN10 小时前
5.1.STM32-EXTI外部中断——全程手敲板书
stm32·单片机·嵌入式硬件
TangDuoduo000511 小时前
【常见传感器原理及应用】
单片机·嵌入式硬件
q***064721 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
洋九八1 天前
电路基础和 PCB 制作
单片机·嵌入式硬件·pcb工艺
qq_401700411 天前
RS485基本原理,电路、防雷、layout及设计要点
stm32·单片机