⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20vddl.txt

📁 传感器ds18b20 与 FPGA 通信 实现方式
💻 TXT
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity temperature is
	port( clk:in std_logic;-------时钟1MHz
		 dq:in std_logic;---------数字温度串行输入端口
		 d:out std_logic;---------控制信号输出端口
		 cont:out std_logic;------三态门控制信号
		 temp:out std_logic_vector(9 downto 0)----10位温度值并行输出端口
		);
end temperature;
architecture behav of temperature is
	signal data:std_logic;
	signal num:std_logic_vector(6 downto 0);-------时隙计数,70个时钟周期为一个时隙
	signal count:std_logic_vector(6 downto 0);-----一次温度转换和输出计数,70个时隙
	signal t:std_logic_vector(9 downto 0);
begin
process(clk,dq,data,t)
begin
	if (clk'event and clk='1') then -----num<=num+'1';
		if num>"1000100" then num<="0000000";
			if count="1001011" then count<="0000000";
				else count<=count+'1';
		    end if;
		else num<=num+'1';
		end if;
		--------------------------------------------------------------------
		if (count>="0000000" and count<="0000110") then data<='0';cont<='1'; -----reset脉冲
		elsif (count>"0000110" and count<="0001101") then cont<='0';		------presenc脉冲
		elsif (count="0001110" or count="0001111" or count="0010010" or count="0010011") then 
			if (num>="0000000" and num<"0111100") then data<='0';cont<='1';
				else cont<='0';
			end if;			                                            --skip '0'时隙
		elsif (count="0010000" or count="0010001" or count="0010100" or count="0010101") then 
			if (num>="0000000" and num<"0001010") then data<='0'; cont<='1';
				else cont<='0';
			end if;			                                                --skip '1'
		elsif (count="0010110" or count="0010111" or count="0011001" or count="0011010" or count="0011011" or count="0011101") then
			if (num>="0000000" and num<"0111100") then data<='0';cont<='1';
				else cont<='0';
			end if;			                                             --convert '0'
		elsif (count="0011000" or count="0011100") then		
			if (num>="0000000" and num<"0001010") then data<='0'; cont<='1';
				else cont<='0';
			end if;			                                              --convert '1'
		elsif (count>="0011110" and count<="0100100") then data<='0';cont<='1';	    --reset
		elsif (count>="0100101" and count<="0101011") then cont<='0';		        --presence
		elsif (count="0101100" or count="0101101" or count="0110000" or count="0110001") then 
			if (num>="0000000" and num<"0111100") then data<='0';cont<='1';
				else cont<='0';
			end if;			                                                --skip '0'
		elsif (count="0101110" or count="0101111" or count="0110010" or count="0110011") then 
		 	if (num>="0000000" and num<"0001010") then data<='0'; cont<='1';
				else cont<='0';
			end if;		                                                   --skip '1'
		elsif (count="0110100" or count="0111010") then
			if (num>="0000000" and num<"0111100") then data<='0';cont<='1';
				else cont<='0';
			end if;			                                               --read '0'
		elsif (count="0110101" or count="0110110" or count="0110111" or count="0111000" or count="0111001" or count="0111011") then
			if (num>="0000000" and num<"0001010") then data<='0'; cont<='1';
				else cont<='0';
			end if;			                                               --read '1'
		elsif count="0111100" then 												  --temp0
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(0)<=dq;
			end if;
		elsif count="0111101" then                                           --temp1
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(1)<=dq;
			end if;
		elsif count="0111110" then                                           --temp2
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(2)<=dq;
			end if;
		elsif count="0111111" then                                           --temp3
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(3)<=dq;
			end if;
		elsif count="1000000" then                                           --temp4
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(4)<=dq;
			end if;
		elsif count="1000001" then                                           --temp5
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(5)<=dq;
			end if;
		elsif count="1000010" then                                           --temp6
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(6)<=dq;
			end if;
		elsif count="1000011" then                                           --temp7
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(7)<=dq;
			end if;
		elsif count="1000100" then                                           --temp8
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(8)<=dq;
			end if;
		elsif count="1000101" then                                           --temp9
			if (num<="0000000" and num<"0001010") then data<='0';cont<='1';
				else cont<='0';
			end if;
			if num="0001110" then t(9)<=dq;
			end if;
		end if;
	end if;
d<=data;
temp<=t;
end process;
end behav;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -