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

相关推荐
hexiaoyan8276 小时前
光纤加速的板卡设计原理图:基于6U VPX XCVU9P+XCZU7EV的双FMC信号处理板卡
嵌入式硬件·fpga开发·光纤加速板卡·国产化板卡·xcvu9p板卡·xcvu9p
CC呢8 小时前
基于单片机智能家居语音控制系统
单片机·嵌入式硬件·智能家居·单片机设计
MingYue_SSS8 小时前
键盘上面有F3,四,R,F,V,按下没有反应,维修记录
嵌入式硬件·计算机外设·解决办法
Wallace Zhang9 小时前
STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验码
stm32·gcc·eide
Vae_Mars9 小时前
C语言中的运算符
数据库·单片机·mongodb
北冥电磁电子智能9 小时前
江协科技STM32学习笔记补充之004 基于XC6206P332MR(Torex)的5V到3.3V的电压转换电路分析
科技·stm32·学习
金色光环9 小时前
野火STM32Modbus主机读取寄存器/线圈失败(三)-尝试将存贮事件的地方改成数组(非必要解决方案)(附源码)
stm32·单片机·嵌入式硬件
♞沉寂11 小时前
51单片机:发光二极管与动态数码管控制
单片机·嵌入式硬件·51单片机
jianqiang.xue11 小时前
Proteus8 + STM32CubeMX 实现 STM32F103R6 串口通信教程
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·proteus