DS18B20VHDL.vhd
上传用户:whms_168
上传日期:2022-08-09
资源大小:592k
文件大小:8k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Others

  1. ---------------------------------------------------------------------------------------------------
  2. --*************************************************************************************************
  3. --  CreateDate  :  2007-07-24 
  4. --  ModifData   :  2007-07-26 
  5. --  Description :  DS18B20 ( Asynchronous, Data bits: 16 ) 
  6. --  Author      :  Explorer01 
  7. --  Version     :  V1.0  
  8. --*************************************************************************************************
  9. ---------------------------------------------------------------------------------------------------
  10. -- VHDL library Declarations 
  11. LIBRARY IEEE;
  12. USE IEEE.std_logic_1164.ALL;
  13. USE IEEE.std_logic_unsigned.ALL;
  14. use IEEE.STD_LOGIC_ARITH.ALL;
  15. ---------------------------------------------------------------------------------------------------
  16. ---------------------------------------------------------------------------------------------------
  17. -- The Entity Declarations 
  18. ENTITY DS18B20VHDL IS
  19. PORT 
  20. (
  21. RESET: IN STD_LOGIC;
  22. CLK:   IN STD_LOGIC; 
  23. Fresh: IN STD_LOGIC; 
  24. DQ:    INOUT STD_LOGIC; 
  25. EOC:   OUT STD_LOGIC;
  26. PDATA: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
  27. );
  28. END DS18B20VHDL;
  29. ---------------------------------------------------------------------------------------------------
  30. ---------------------------------------------------------------------------------------------------
  31. -- The Architecture of Entity Declarations 
  32. ARCHITECTURE DS18B20VHDL_arch OF DS18B20VHDL IS
  33. ------------------------------------------------
  34. CONSTANT STATE_RST1  : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000";
  35. CONSTANT STATE_WRITE1 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "001";
  36. CONSTANT STATE_READ : STD_LOGIC_VECTOR(2 DOWNTO 0) := "010";
  37. CONSTANT STATE_RST2  : STD_LOGIC_VECTOR(2 DOWNTO 0) := "011";
  38. CONSTANT STATE_WRITE2 : STD_LOGIC_VECTOR(2 DOWNTO 0) := "100";
  39. CONSTANT STATE_WAIT : STD_LOGIC_VECTOR(2 DOWNTO 0) := "101";
  40. SIGNAL state : STD_LOGIC_VECTOR(2 DOWNTO 0);
  41. ------------------------------------------------
  42. -- Command for DS18B20 : 0xBECC, 0x44CC 
  43. CONSTANT COMMAND1 : STD_LOGIC_VECTOR(15 DOWNTO 0) := B"1011_1110_1100_1100";
  44. CONSTANT COMMAND2 : STD_LOGIC_VECTOR(15 DOWNTO 0) := B"0100_0100_1100_1100";
  45. SIGNAL DATA : STD_LOGIC_VECTOR(15 DOWNTO 0); -- Temperature  
  46. ------------------------------------------------
  47. SIGNAL CLKCNT : STD_LOGIC_VECTOR(5 DOWNTO 0); -- 64uS 
  48. SIGNAL CLKRW, CLKread, CLKwrite0, CLKwrite1  : STD_LOGIC; 
  49. SIGNAL Count : INTEGER RANGE 0 TO 20;
  50. ------------------------------------------------
  51. SIGNAL EOCtemp, VALUE : STD_LOGIC; 
  52. BEGIN
  53. -------------------------------------------------
  54. -- State 
  55. PROCESS( RESET, CLK, CLKCNT, CLKRW, Count, CLKwrite0, CLKwrite1, state, VALUE, Fresh )
  56. BEGIN
  57. -----------------------------------------------
  58. -- The primary period for write and read 
  59. IF( RESET='0' ) THEN 
  60. CLKCNT <= "000000";
  61. ELSIF( CLK'EVENT AND CLK='1' ) THEN 
  62. CLKCNT <= CLKCNT + 1; 
  63. END IF; 
  64. CLKRW <= CLKCNT(5);  -- Period : 64uS 
  65. -----------------------------------------------
  66. -- Write plus 
  67. -- Write "0" 
  68. IF( CLKCNT<61 ) THEN CLKwrite0 <= '0';
  69. ELSE  CLKwrite0 <= '1';
  70. END IF; 
  71. -- Write "1" 
  72. IF( CLKCNT<5  ) THEN CLKwrite1 <= '0';
  73. ELSE  CLKwrite1 <= '1';
  74. END IF; 
  75. -----------------------------------------------
  76. -- Read plus 
  77. IF( CLKCNT<14 ) THEN CLKread <= '0';
  78. ELSE  CLKread <= '1';
  79. END IF; 
  80. --=============================================
  81. -- Update the state 
  82. IF( RESET='0' ) THEN 
  83. state <= STATE_RST1; 
  84. Count <= 0;
  85. ELSIF( CLKRW'EVENT AND CLKRW='0' ) THEN 
  86. CASE state IS 
  87. -----------------------------------
  88. -- RESET 
  89. WHEN STATE_RST1 => 
  90. IF( Count>20 ) THEN Count <= 0; state <= STATE_WRITE1; 
  91. ELSE Count <= Count + 1; 
  92. END IF; 
  93. -----------------------------------
  94. -- Write command to DS18B20 : 0xCC, 0xBE 
  95. WHEN STATE_WRITE1 => 
  96. IF( Count>14 ) THEN Count <= 0; state <= STATE_READ; 
  97. ELSE Count <= Count + 1; 
  98. END IF; 
  99. -----------------------------------
  100. -- Read the temperature from DS18B20 
  101. WHEN STATE_READ => 
  102. IF( Count>14 ) THEN Count <= 0; state <= STATE_RST2; 
  103. ELSE Count <= Count + 1; 
  104. END IF; 
  105. -----------------------------------
  106. -- Interval power 
  107. -----------------------------------
  108. -----------------------------------
  109. -- Start the converter for the next turn 
  110. WHEN STATE_RST2 => 
  111. IF( Count>20 ) THEN Count <= 0; state <= STATE_WRITE2; 
  112. ELSE Count <= Count + 1; 
  113. END IF; 
  114. -----------------------------------
  115. -- Write command to DS18B20 : 0xCC, 0x44 
  116. WHEN STATE_WRITE2 => 
  117. IF( Count>14 ) THEN Count <= 0; state <= STATE_WAIT; 
  118. ELSE Count <= Count + 1; 
  119. END IF; 
  120. -----------------------------------
  121. -----------------------------------
  122. -- Wait for the next turn ... ( Update rate : 1S ) 
  123. WHEN STATE_WAIT => 
  124. Count <= 0; 
  125. IF( Fresh='0' ) THEN state <= STATE_RST1; 
  126. END IF; 
  127. -----------------------------------
  128. WHEN OTHERS => Count <= 0; 
  129. END CASE; 
  130. END IF; 
  131. END PROCESS; 
  132. --==============================================
  133. ------------------------------------------------
  134. -- End of getting temperature 
  135. PROCESS( state, Count, CLKwrite0, CLKwrite1 )
  136. BEGIN
  137. CASE state IS 
  138. -----------------------------------
  139. -- RESET 
  140. WHEN STATE_RST1 => 
  141. -- RESET PLUS 
  142. IF( Count<11 ) THEN VALUE <= '0'; -- 0 
  143. ELSE VALUE <= '1'; -- 1 
  144. END IF; 
  145. -----------------------------------
  146. -- Write command to DS18B20 : 0xCC, 0xBE 
  147. WHEN STATE_WRITE1 => 
  148. IF( COMMAND1(Count)='0' ) THEN  VALUE <= CLKwrite0;
  149. ELSE VALUE <= CLKwrite1;
  150. END IF; 
  151. -----------------------------------
  152. -- Read the temperature from DS18B20 
  153. WHEN STATE_READ => 
  154. VALUE <= CLKwrite1;
  155. -----------------------------------
  156. -- Interval power 
  157. -----------------------------------
  158. -----------------------------------
  159. -- RESET 
  160. WHEN STATE_RST2 => 
  161. -- RESET PLUS 
  162. IF( Count<11 ) THEN VALUE <= '0'; -- 0 
  163. ELSE VALUE <= '1'; -- 1 
  164. END IF; 
  165. -----------------------------------
  166. -- Write command to DS18B20 : 0xCC, 0xBE 
  167. WHEN STATE_WRITE2 => 
  168. IF( COMMAND2(Count)='0' ) THEN  VALUE <= CLKwrite0;
  169. ELSE VALUE <= CLKwrite1;
  170. END IF; 
  171. -----------------------------------
  172. WHEN OTHERS => VALUE <= '1'; 
  173. END CASE; 
  174. END PROCESS; 
  175. --==============================================
  176. ------------------------------------------------
  177. -- Getting the temperature 
  178. -- Read datum from DS18B20 
  179. PROCESS( RESET, DQ, VALUE, state, Count, CLKread, EOCtemp )
  180. VARIABLE Receive : STD_LOGIC; 
  181. BEGIN 
  182. IF( RESET='0' ) THEN 
  183. DATA <= "0000000000000000";
  184. ELSIF( state=STATE_READ ) THEN 
  185. IF( CLKread'EVENT AND CLKread='1' ) THEN 
  186. IF( Receive='0' ) THEN  DATA(Count) <= '0';
  187. ELSE DATA(Count) <= '1';
  188. END IF; 
  189. END IF; 
  190. EOCtemp <= '0';
  191. ELSE
  192. EOCtemp <= '1';
  193. END IF; 
  194. -----------------------------------------------
  195. IF( VALUE='0' ) THEN DQ <= '0'; Receive := '1'; -- Output 
  196. ELSE  DQ <= 'Z'; Receive := DQ;  -- Input 
  197. END IF;
  198. END PROCESS; 
  199. --==============================================
  200. ------------------------------------------------
  201. -- End of getting temperature 
  202. PROCESS( RESET, EOCtemp )
  203. VARIABLE FIGURE : INTEGER RANGE 0 TO 255; 
  204. VARIABLE VLOW, VHIGH : INTEGER RANGE 0 TO 15; 
  205. BEGIN
  206. IF( RESET='0' ) THEN 
  207. PDATA <= "00000000";
  208. ELSIF( EOCtemp'EVENT AND EOCtemp='1' ) THEN 
  209. -- BCD Code 
  210. PDATA <= CONV_STD_LOGIC_VECTOR(VHIGH, 4) & CONV_STD_LOGIC_VECTOR(VLOW, 4); 
  211. -- HEX Code 
  212. -- PDATA <= CONV_STD_LOGIC_VECTOR(FIGURE, 8);
  213. END IF; 
  214. FIGURE := CONV_INTEGER( DATA(11 DOWNTO 4) ); 
  215. -- HEX TO BCD 
  216. VHIGH := FIGURE /   10; 
  217. VLOW  := FIGURE REM 10; 
  218. EOC <= EOCtemp; 
  219. END PROCESS; 
  220. -------------------------------------------------
  221. -------------------------------------------------
  222. END DS18B20VHDL_arch;