📄 ds18b20_.vhd
字号:
S_State<=T_Write0;
else
S_State<=T_Write1;
end if;
V_WR_BitCNT := V_WR_BitCNT+1;
when 8 =>
if (V_WRByteCNT=0) then -- 第一次写0XCC完毕
S_State<=T_CMD_44;
V_WRByteCNT:=1;
elsif (V_WRByteCNT=1) then -- 写0X44完毕
S_State<=T_ConvWait; -- 等待转换完成
V_WRByteCNT:=2;
elsif (V_WRByteCNT=2) then --第二次写0XCC完毕
S_State<=T_CMD_BE;
V_WRByteCNT:=3;
elsif (V_WRByteCNT=3) then -- 写0XBE完毕
S_State<=T_GetTemp;
V_WRByteCNT:=0;
else
V_WRByteCNT:=0;
end if;
V_WR_BitCNT := 0;
when others =>
V_WR_BitCNT := 0;
end case;
when T_Write0=>
case V_Write0_CNT is
when 0=>
P_dq<='0';
if (V_Counter>=78) then
V_Counter := 0;
V_Write0_CNT:=1;
else
V_Counter := V_Counter+1;
end if;
when 1=>
P_dq<='Z';
if (V_Counter>=2) then
V_Counter := 0;
V_Write0_CNT:=2;
else
V_Counter := V_Counter+1;
end if;
when 2=>
S_State<=T_WriteByte;
V_Write0_CNT:=0;
when others=>V_Write0_CNT:=0;
end case;
when T_Write1=>
case V_Write1_CNT is
when 0=>
P_dq<='0';
if (V_Counter=8) then
V_Counter := 0;
V_Write1_CNT:=1;
else
V_Counter := V_Counter+1;
end if;
when 1=>
P_dq<='Z';
if (V_Counter=72) then
V_Counter := 0;
V_Write1_CNT:=2;
else
V_Counter := V_Counter+1;
end if;
when 2=>
S_State<=T_WriteByte;
V_Write1_CNT:=0;
when others=>
V_Write1_CNT:=0;
end case;
when T_GetTemp=> -- 好像只接受了12位
case V_RD_BitCNT is
when 0 to 11=>
S_State<=T_Read_Bit;
V_ReadTemp(V_RD_BitCNT):=S_RD_Bit;
V_RD_BitCNT:=V_RD_BitCNT+1;
when 12=>
P_RD_Temp <= V_ReadTemp;
V_RD_BitCNT:=0;
S_State<=T_DS_Rest;
when others =>
V_RD_BitCNT:=0;
end case;
when T_Read_Bit=>
case V_DS_Read_st is
when 0=>
P_dq<='0';
if (V_Counter=4) then
V_DS_Read_st:=1;
V_Counter := 0;
else
V_Counter := V_Counter+1;
end if;
when 1=>
P_dq<='Z';
if (V_Counter>4) then
V_DS_Read_st:=2;
V_Counter := 0;
else
V_Counter := V_Counter+1;
end if;
when 2=>
S_RD_Bit<=P_dq;
V_DS_Read_st:=3;
when 3=>
if (V_Counter=45) then
V_Counter := 0;
V_DS_Read_st:=0;
S_State<=T_GetTemp;
else
V_Counter := V_Counter+1;
end if;
when others=>V_DS_Read_st:=0;
end case;
when T_DS_Rest=>
if V_ms_Counter = 100 then -- 休息100ms
S_State<=T_Reset_st;
V_ms_Counter := 0;
else
if V_Counter>=1000 then
V_ms_Counter := V_ms_Counter+1;
V_Counter := 0;
else
V_Counter := V_Counter+1;
end if;
end if;
when others =>
S_State <= T_Reset_st;
V_Counter := 0;
end case;
end if;
end if;
end process;
end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -