always @ (posedge clk_1us) //可设定时N ns if (cnt_1us_clear) cnt_1us <= 0; else
cnt_1us <= cnt_1us + 1'b1; //加一次1us //-------------------------------------- // 延时模块 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++ // DS18B20状态机 开始
//++++++++++++++++++++++++++++++++++++++ //++++++++++++++++++++++++++++++++++++++ // 格雷码
parameter S00 = 5'h00; //步数 parameter S0 = 5'h01; parameter S1 = 5'h03; parameter S2 = 5'h02; parameter S3 = 5'h06; parameter S4 = 5'h07; parameter S5 = 5'h05; parameter S6 = 5'h04; parameter S7 = 5'h0C; parameter WRITE0 = 5'h0D; parameter WRITE1 = 5'h0F; parameter WRITE00 = 5'h0E; parameter WRITE01 = 5'h0A; parameter READ0 = 5'h0B;
parameter READ1 = 5'h09; parameter READ2 = 5'h08; parameter READ3 = 5'h18;
reg [4:0] state; // 状态寄存器 //-------------------------------------
reg one_wire_buf; // One-Wire总线 缓存寄存器
reg [15:0] temperature_buf; // 采集到的温度值缓存器(未处理) reg [5:0] step; // 子状态寄存器 0~50 reg [3:0] bit_valid; // 有效位
always @(posedge clk_1us, negedge rst_n) //clk_1us即每1us执行一次 begin if (!rst_n) begin
one_wire_buf <= 1'bZ; step <= 0;
state <= S00; //s00为变量名 end else begin case (state)
S00 : begin
temperature_buf <= 16'h001F; state <= S0; end
S0 : begin // 初始化
cnt_1us_clear <= 1;
one_wire_buf <= 0; state <= S1; end S1 : begin
cnt_1us_clear <= 0;
if (cnt_1us == 500) // 延时500us begin
cnt_1us_clear <= 1;
one_wire_buf <= 1'bZ; // 释放总线 state <= S2; end end S2 : begin
cnt_1us_clear <= 0; //cnt_1us_clear有效时cnt_1us清零 if (cnt_1us == 100) // 等待100us begin
cnt_1us_clear <= 1; state <= S3; end end
S3 : if (~one_wire) // 若18b20拉低总线,初始化成功 one_wire输入 state <= S4;
else if (one_wire) // 否则,初始化不成功,返回S0 state <= S0; S4 : begin
cnt_1us_clear <= 0;
if (cnt_1us == 400) // 再延时400us begin
cnt_1us_clear <= 1; state <= S5; end end
S5 : begin // 写数据
if (step == 0) // 0xCC begin
step <= step + 1'b1; state <= WRITE0; end
else if (step == 1) begin
step <= step + 1'b1; state <= WRITE0; end
else if (step == 2) begin one_wire_buf <= 0;
step <= step + 1'b1; state <= WRITE01; end
else if (step == 3) begin
one_wire_buf <= 0; step <= step + 1'b1;
state <= WRITE01; end
跳过ROM //
else if (step == 4) begin
step <= step + 1'b1; state <= WRITE0; end
else if (step == 5) begin
step <= step + 1'b1; state <= WRITE0; end
else if (step == 6) begin
one_wire_buf <= 0;
step <= step + 1'b1; state <= WRITE01; end
else if (step == 7) begin
one_wire_buf <= 0;
step <= step + 1'b1; state <= WRITE01; end
else if (step == 8) // 0x44 begin
step <= step + 1'b1; state <= WRITE0; end
else if (step == 9)
启动转换