3531|6

2804

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

【我给XILINX资源中心做贡献】 FPGA控制DS18B20代码 [复制链接]

FPGA控制DS18B20代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ds1820 is
port(clk : in std_logic;  
               dq  : inout std_logic;
    temp_h : out std_logic_vector(7 downto 0);
    temp_l : out std_logic_vector(7 downto 0));
end ds1820;

architecture Behavioral of ds1820 is

TYPE STATE_TYPE is (RESET,CMD_CC,WRITE_BYTE,WRITE_LOW,WRITE_HIGH,READ_BIT,CMD_44,WAIT800MS,CMD_BE,GET_TMP,WAIT4MS);
signal STATE: STATE_TYPE:=RESET;

signal clk_temp : std_logic:='0';
signal clk1m : std_logic;

signal write_temp : std_logic_vector(7 downto 0):="00000000";

signal TMP : std_logic_vector(11 downto 0);
signal tmp_bit : std_logic;

signal WRITE_BYTE_CNT : integer range 0 to 8:=0;
signal WRITE_LOW_CNT : integer range 0 to 2:=0;
signal WRITE_HIGH_CNT : integer range 0 to 2:=0;
signal READ_BIT_CNT : integer range 0 to 3:=0;
signal GET_TMP_CNT : integer range 0 to 12:=0;

signal cnt : integer range 0 to 100001:=0;
signal count : integer range 0 to 25:=0;

signal WRITE_BYTE_FLAG : integer range 0 to 4:=0;

begin

ClkDivider:process (clk)
begin
if rising_edge(clk) then
   if (count = 24) then
      count <= 0;
      clk_temp<= not clk_temp;
   else
      count <= count +1;
   end if;
end if; 
   clk1m<=clk_temp;
end Process;


STATE_TRANSITION:process(STATE,clk1m)
begin
   if rising_edge(clk1m) then
      case STATE is
         when RESET=>
            if (cnt>=0 and cnt<500) then
               dq<='0';
    cnt<=cnt+1;
    STATE<=RESET;
           elsif (cnt>=500 and cnt<1000) then
    dq<='Z';
    cnt<=cnt+1;
    STATE<=RESET;
elsif (cnt>=1000) then
    cnt<=0;
    STATE<=CMD_CC;
end if;
        when CMD_CC=>
write_temp<="11001100";
STATE<=WRITE_BYTE;
        when WRITE_BYTE=>
case WRITE_BYTE_CNT is
when 0 to 7=>
   if (write_temp(WRITE_BYTE_CNT)='0') then
      STATE<=WRITE_LOW;
   else
      STATE<=WRITE_HIGH;
   end if;
      WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;
when 8=>
   if (WRITE_BYTE_FLAG=0) then -- 第一次写0XCC完毕
      STATE<=CMD_44;
      WRITE_BYTE_FLAG<=1;
   elsif (WRITE_BYTE_FLAG=1) then --写0X44完毕
      STATE<=RESET;
      WRITE_BYTE_FLAG<=2;
   elsif (WRITE_BYTE_FLAG=2) then --第二次写0XCC完毕
      STATE<=CMD_BE;
      WRITE_BYTE_FLAG<=3;
   elsif (WRITE_BYTE_FLAG=3) then --写0XBE完毕
      STATE<=GET_TMP;
      WRITE_BYTE_FLAG<=0;
   end if;
   WRITE_BYTE_CNT<=0;
end case;
        when WRITE_LOW=>
case WRITE_LOW_CNT is
   when 0=>
      dq<='0';
      if (cnt=78) then
         cnt<=0;
         WRITE_LOW_CNT<=1;
      else
         cnt<=cnt+1;
      end if;
   when 1=>
      dq<='Z';
      if (cnt=2) then
         cnt<=0;
         WRITE_LOW_CNT<=2;
      else
         cnt<=cnt+1;
      end if;
   when 2=>
      STATE<=WRITE_BYTE;
      WRITE_LOW_CNT<=0;
   when others=>WRITE_LOW_CNT<=0;
end case;
        when WRITE_HIGH=>
 case WRITE_HIGH_CNT is
    when 0=>
       dq<='0';
       if (cnt=8) then
          cnt<=0;
          WRITE_HIGH_CNT<=1;
       else
          cnt<=cnt+1;
       end if;
    when 1=>
       dq<='Z';
       if (cnt=72) then
          cnt<=0;
          WRITE_HIGH_CNT<=2;
       else
          cnt<=cnt+1;
       end if;
    when 2=>
       STATE<=WRITE_BYTE;
       WRITE_HIGH_CNT<=0;
    when others=>WRITE_HIGH_CNT<=0;
 end case;
         when READ_BIT=>
 case READ_BIT_CNT is
    when 0=>
       dq<='0';
       if (cnt=4) then
READ_BIT_CNT<=1;
cnt<=0;
       else
          cnt<=cnt+1;
       end if;
    when 1=>
       dq<='Z';
       if (cnt=4) then
          READ_BIT_CNT<=2;
          cnt<=0;
       else
          cnt<=cnt+1;
       end if;
    when 2=>
       TMP_BIT<=dq;
       if (cnt=1) then
          READ_BIT_CNT<=3;
          cnt<=0;
       else
          cnt<=cnt+1;
       end if;
    when 3=>
       if (cnt=45) then
          cnt<=0;
          READ_BIT_CNT<=0;
          STATE<=GET_TMP;
       else
          cnt<=cnt+1;
       end if;
    when others=>READ_BIT_CNT<=0;
 end case;
         when CMD_44=>
 write_temp<="01000100";
 STATE<=WRITE_BYTE;
         when WAIT800MS=>
 if (cnt>=100000) then
    STATE<=RESET;
    cnt<=0;
 else
    cnt<=cnt+1;
    STATE<=WAIT800MS;
 end if;
         when CMD_BE=>
 write_temp<="10111110";
 STATE<=WRITE_BYTE;
         when GET_TMP=>
 case GET_TMP_CNT is
    when 0 to 11=>
       STATE<=READ_BIT;
       TMP(GET_TMP_CNT)<=TMP_BIT;
       GET_TMP_CNT<=GET_TMP_CNT+1;
    when 12=>
       GET_TMP_CNT<=0;
       STATE<=WAIT4MS;
 end case;
         when WAIT4MS=>
 if (cnt>=4000) then
    STATE<=RESET;
    cnt<=0;
 else
    cnt<=cnt+1;
    STATE<=WAIT4MS;
 end if;
         when others=>STATE<=RESET;
      end case;
   end if;
end process;

temp_h<='0'&TMP(11 downto 5);
temp_l<="0000"&TMP(4 downto 1);

end Behavioral;

在XILINX SPARTAN3 STARTER KIT 上测试能正常显示温度
此帖出自FPGA/CPLD论坛

最新回复

5楼,急用啊,能分享下你的代码吗  详情 回复 发表于 2012-5-22 13:49
点赞 关注
个人签名QQ:1625345502
 

回复
举报

6892

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

强顶

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
楼主V5
此帖出自FPGA/CPLD论坛
 
 
 

回复

155

帖子

0

TA的资源

一粒金砂(中级)

4
 
这么多呀 都看不过来!
此帖出自FPGA/CPLD论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

5
 
我用Verilog写的,工作也非常正常,还在8位LED上显示了数据。
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

6
 
5楼也把你的代码分享一下啊,最好能给些比较详细的说明最好的!
此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复 5楼 mgjacky 的帖子

5楼,急用啊,能分享下你的代码吗
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表