本篇结合上篇一起食用,本篇为DS18B20读取ID号。需要注意的是,只能在总线上有一个设备的时候使用。
module ds18b20_dri(
//系统时钟_50M
input clk_n,
input clk_p,
input rst_n , //低电平有效的复位信号
// input clk ,
inout dq // 符号使
);
//单濻线(双向信号)
reg [19:0] temp_data ; // 转换后得到的温度倿
reg sign ;
//------------<参数定义>----------------------------------------------
INBUF_DIFF CLK
(
.PADN (clk_n),
.PADP (clk_p),
.Y (clk)
);
localparam INIT1 = 6'b000001 ,
WR_CMD = 6'b000010 ,
RX_ID = 6'b001000 ;
//时间参数定义
localparam T_INIT = 1000 , //初始化最大时间,单位us
T_WAIT = 780_000 ; //转换等待延时,单位us
//命令定义
localparam WR_CMD_DATA = 16'heecc, //跳过 ROM 及温度转换命令,低位在前
RD_CMD_DATA = 16'hbecc, //跳过 ROM 及读取温度命令,低位在前
READ_ROM=8'h33;
//------------<reg定义>----------------------------------------------
reg [5:0] cur_state ; //现濿
reg [5:0] next_state ; //次濿
reg [6:0] cnt ; //50分频计数器,1Mhz(1us)
reg dq_out ; //双向总线输出
reg dq_en ; //双向总线输出使能_1则输出,0则高阻濿
reg flag_ack ; //从机响应标志信号
reg clk_us ; //us时钟
reg [19:0] cnt_us ; //us计数噿,朿大可表示1048ms
reg [5:0] bit_cnt ; //接收数据计数噿
reg [63:0] data_temp ; //读取的ID数据寄存
reg [63:0] data ; //ID
//------------<wire定义>----------------------------------------------
wire dq_in ; //双向总线输入
//===============================================