目錄
項目:項目(含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 學習、溫度監控等場景。