re: DS18B20温度传感器FPGA芯片设计
资源交流
DS18B20温度传感器FPGA芯片设计
--------------------------------------------------------------------------------
Friddy 2007-07-10, 4:21 下午
此FPGA芯片的设计完成于2007年6月,同月使用Cyclone EP1C3T144C8芯片测试通过,显示温度正常。
此芯片在一周的课外时间内设计完成,时间仓促,如有疏漏之处,还请大家指正。
VHDL代码如下:
--Author: 杨谦
--Department:东南大学 电气工程学院
--Email: yangqiannj@163.com
--Mobile: 13915997062
--Date: 2007.6.3
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY Project1 IS
PORT
( CLK:IN STD_LOGIC;--外接12MHz时钟
DQ:INOUT std_logic;--IO to DS18B20
TEMP_OUT0:OUT std_logic_vector(3 downto 0);--小数后一位的输出
TEMP_OUT1:OUT std_logic_vector(7 downto 0);--十位和个位温度显示
TEMP_OUT2:OUT std_logic --符号
);
END Project1;
ARCHITECTURE block_name_architecture OF Project1 IS
SIGNAL count_int : std_logic_vector(7 downto 0);
SIGNAL fen : std_logic_vector(5 downto 0);
SIGNAL num : std_logic_vector(13 downto 0);
SIGNAL T1 : std_logic_vector(7 downto 0);--个位和十位
SIGNAL T0 : std_logic_vector(3 downto 0);--小数点后的
SIGNAL SIGN0 : std_logic;--符号
BEGIN
PROCESS(CLK)--7 Digital Counter
BEGIN
--WAIT UNTIL rising_edge(CLK);
IF rising_edge(CLK) THEN
fen<=fen+1;
IF (fen>=20 OR fen<0) THEN
count_int <= count_int+1;
fen<="000000";
END IF;
--D<=count_int;
IF (num>=11200 OR num<=0) THEN--11000
num<="00000000000000";
END IF;
IF (count_int>=70 OR count_int<0) THEN
count_int<="00000000";
num<=num+1;
--S<=num;
END IF;
IF (num>=0 AND num<=6) THEN--Reset
DQ<='0';
END IF;
IF (num>=7 AND num<=13) THEN--Present
DQ<='Z';
END IF;
--Start OF SKIP 1100 1100 Start at 14
IF (num=16 OR num=17 OR num=20 OR num=21) THEN--SKip Write 1
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
IF (num=14 OR num=15 OR num=18 OR num=19) THEN--SKip Write 0
IF (count_int>=0 AND count_int<=60) THEN
DQ<='0';
END IF;
IF (count_int>=61 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
--Stop OF SKIP
--Start OF Convert--0100 0100 Start at 22
-- 22,23,25,26,27,29
IF (num=22 OR num=23 OR num=25 OR num=26 OR num=27 OR num=29) THEN--Convert Write 0
IF (count_int>=0 AND count_int<=60) THEN
DQ<='0';
END IF;
IF (count_int>=61 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
IF (num=24 OR num=28) THEN--Convert Write 1
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
--End OF Convert
IF (num>=11100 AND num<=11106) THEN--Reset
DQ<='0';
END IF;
IF (num>=11108 AND num<=11113) THEN--Present
DQ<='Z';
END IF;
--Start OF SKIP 1100 1100 Start at 114
IF (num=11116 OR num=11117 OR num=11120 OR num=11121) THEN--SKip Write 1
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
IF (num=11114 OR num=11115 OR num=11118 OR num=11119) THEN--SKip Write 0
IF (count_int>=0 AND count_int<=60) THEN
DQ<='0';
END IF;
IF (count_int>=61 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
--Stop OF SKIP
--Start OF READ SCRATCHPAD--1011 1110 Start at 22
-- 22,28
IF (num=11122 OR num=11128) THEN--Convert Write 0
IF (count_int>=0 AND count_int<=60) THEN
DQ<='0';
END IF;
IF (count_int>=61 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
IF (num=11123 OR num=11124 OR num=11125 OR num=11126 OR num=11127 OR num=11129) THEN--Convert Write 1
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
END IF;
--End OF READ SCRATCHPAD
--Start OF Read Temperature
IF (num=11131) THEN --1
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T0(0)<='0';
END IF;
IF (DQ='1') THEN
T0(0)<='1';
END IF;
END IF;
END IF;
IF (num=11132) THEN --2
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T0(1)<='0';
END IF;
IF (DQ='1') THEN
T0(1)<='1';
END IF;
END IF;
END IF;
IF (num=11133) THEN --3
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T0(2)<='0';
END IF;
IF (DQ='1') THEN
T0(2)<='1';
END IF;
END IF;
END IF;
IF (num=11134) THEN --4
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T0(3)<='0';
END IF;
IF (DQ='1') THEN
T0(3)<='1';
END IF;
END IF;
END IF;
IF (num=11135) THEN --5
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T1(0)<='0';
END IF;
IF (DQ='1') THEN
T1(0)<='1';
END IF;
END IF;
END IF;
IF (num=11136) THEN --6
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T1(1)<='0';
END IF;
IF (DQ='1') THEN
T1(1)<='1';
END IF;
END IF;
END IF;
IF (num=11137) THEN --7
IF (count_int>=0 AND count_int<=6) THEN
DQ<='0';
END IF;
IF (count_int>=7 AND count_int<=70) THEN
DQ<='Z';
END IF;
IF (count_int=12) THEN
IF (DQ='0') THEN
T1(2)<='0';
END IF;
IF (DQ='1') THEN
T1(2)<='1';
评论0