目录
[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 数据流图)
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
):bashsrc_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
)
-
INIT:发送复位脉冲,检测存在脉冲。
-
SKIP_ROM:发送 0xCC 跳过 ROM 寻址。
-
CONVERT_T:发送 0x44 启动温度转换。
-
WAIT:等待 750ms 转换完成。
-
再次 INIT 和 SKIP_ROM。
-
READ_SCRATCH:发送 0xBE 读取暂存器。
-
RXDATA:读取 2 字节温度数据。
3.2 数据处理流程(data_process.v
)
-
将补码温度转换为原码。
-
将温度值乘以 625(扩大 10000 倍,便于显示小数)。
-
使用
binary2bcd
模块将二进制转换为 BCD 码。 -
输出到数码管和串口。
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 学习、温度监控等场景。