目录
1. 单总线通信时序详解
DS18B20 采用单总线(1-Wire)协议进行通信,所有操作都通过一根数据线(DQ)完成,包括初始化、写时隙和读时隙。
1.1 初始化(复位脉冲 + 存在脉冲)
主机行为:拉低总线至少 480µs,然后释放总线。
从机响应:DS18B20 在接收到复位脉冲后,会在 15~60µs 内拉低总线 60~240µs,作为存在脉冲。
代码实现(
ds18b20_driver.v
):
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,然后释放总线。
代码实现:
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 在时隙内保持输出数据。
代码实现:
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 学习、温度监控等场景。