【FPGA】单总线——DS18B20

发布于:2025-09-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

项目:项目(含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) 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

  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 数据流图

DS18B20 → ds18b20_driver → data_process → uart_tx → PC
                               ↓
                         seg_driver → 数码管

总结

本项目实现了一个基于 FPGA 的 DS18B20 温度测量系统,具备以下特点:

  • ✅ 单总线协议完整实现(初始化、读、写)

  • ✅ 温度数据补码转原码、BCD 转换

  • ✅ 数码管实时显示温度

  • ✅ 串口输出温度值(含小数点)

  • ✅ 状态机控制流程清晰,代码可读性强

适用于嵌入式系统、FPGA 学习、温度监控等场景。


网站公告

今日签到

点亮在社区的每一天
去签到