【FPGA】单总线——DS18B20
目录
项目:项目(含quartus工程、仿真文件)
1. 单总线通信时序详解
1.1 初始化(复位脉冲 + 存在脉冲)
1.2 写时隙(写“0”和写“1”)
1.3 读时隙
2. DS18B20 暂存器与温度数据格式
2.1 暂存器结构
2.2 温度数据格式(16位补码)
2.3 常用 ROM 命令
3. 温度读取工作流程
3.1 状态机流程(ds18b20_driver.v)
3.2 数据处理流程(data_process.v)
4. 系统框架结构
4.1 顶层模块(sys_top.v)
4.2 模块功能说明
4.3 数据流图
总结
项目:项目(含quartus工程、仿真文件)
1. 单总线通信时序详解
DS18B20 采用单总线(1-Wire)协议进行通信,所有操作都通过一根数据线(DQ)完成,包括初始化、写时隙和读时隙。
1.1 初始化(复位脉冲 + 存在脉冲)
-
主机行为:拉低总线至少 480µs,然后释放总线。
-
从机响应:DS18B20 在接收到复位脉冲后,会在 15~60µs 内拉低总线 60~240µs,作为存在脉冲。
-
代码实现(
ds18b20_driver.v
):
if(cnt_xx < 480) begindq_out <= 1'b0;dq_out_en <= 1'b1;
end else begindq_out <= 1'b0;dq_out_en <= 1'b0;
end
1.2 写时隙(写“0”和写“1”)
-
写“0”:主机拉低总线至少 60µs。
-
写“1”:主机拉低总线 1~15µs,然后释放总线。
-
代码实现:
if(wr_data[cnt_bit] == 0) begindq_out <= 1'b0;dq_out_en <= (cnt_xx < 61) ? 1'b1 : 1'b0;
end else begindq_out <= 1'b0;dq_out_en <= (cnt_xx < 1) ? 1'b1 : 1'b0;
end
1.3 读时隙
-
主机行为:拉低总线 1µs,然后释放并采样。
-
从机响应:DS18B20 在时隙内保持输出数据。
-
代码实现:
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
):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
)
-
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 数据流图
DS18B20 → ds18b20_driver → data_process → uart_tx → PC↓seg_driver → 数码管
总结
本项目实现了一个基于 FPGA 的 DS18B20 温度测量系统,具备以下特点:
-
✅ 单总线协议完整实现(初始化、读、写)
-
✅ 温度数据补码转原码、BCD 转换
-
✅ 数码管实时显示温度
-
✅ 串口输出温度值(含小数点)
-
✅ 状态机控制流程清晰,代码可读性强
适用于嵌入式系统、FPGA 学习、温度监控等场景。