基于VHDL的单总线从机读写控制器_第1页
基于VHDL的单总线从机读写控制器_第2页
基于VHDL的单总线从机读写控制器_第3页
基于VHDL的单总线从机读写控制器_第4页
基于VHDL的单总线从机读写控制器_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录前 言1第1章 单总线技术2第1.1节 单总线技术简介2 单总线技术的原理与硬件结构2 单总线技术的信号方式3 单总线技术的器件4第2章DS18B20简介5第2.1节DS18B20的封装与管脚5第2.2节DS18B20内部结构5第2.3节DS1820时序及工作方式8第3章 控制器设计11第3.1节 控制器结构11第3.2节 读写时序的实现11第4章 仿真与结论19课堂感悟与致谢20前言是美国达拉斯公司生产的一种单总线数字温度传感器,采用总线通信协议。具有独特的单总线通信方式以及较高的测量精度,目前在实际生活中获得了广泛应用。本文介绍了的基本原理和通信时序,并用软件模拟单总线时序,实现与的通

2、信。作为电子硬件设计的主流描述语言,采用层次化的设计方式,具有电路行为描述能力强、灵活、通用及运算仿真速度快等特点,能够较容易地实现时序逻辑控制。本文以数字温度传感器为例,设计一个基于的单总线控制器,并对通信程序进行了仿真测试。本文介绍的单总线控制器,有较强的可扩展性,可以连接多种单总线器件,且微处理器可以不用被迫关闭中断,满足各类对实时性具有严格要求的应用。第1章单总线技术第节单总线技术简介单总线技术是达拉斯半导体公司推出的一项特有技术。它采用单根信号线,既可传输时钟,又能传输数据,而且数据可以双向传输。由于这种单总线技术线路简单,硬件开销少,所以其具有成本低廉,便于总线扩展和易于维护等优点

3、。单总线适用于单主机系统,能够控制一个或多个从机设备。主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。第节 单总线技术的原理与硬件结构单总线只有一根数据线,系统中的数据交换、控制都在这根线上完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,这样便可允许设备在不发送数据时释放总线,以便其他设备使用总线,其内部等效电路如图所示。图1.1 单总线硬件接口示意图单总线要外接一个约的上拉电阻,这样当总线闲置时,状态为高电平。主机和从机之间的通信通过以下三个步骤完成:初始化

4、器件,识别器件,交换数据。由于二者是主从结构,只有主机呼叫从机时,从机才能答应,因此主机访问器件必须严格遵循单总线命令序列:初始化、命令、功能命令。如果出现序列混乱,器件则不会响应主机(搜索命令,报警搜索命令除外)。根据以上原理,可以画出单总线硬件接口原理图所示。图1.2 单总线硬件接口原理图单总线端口为漏极开路,在本文中令单总线外接一个约的上拉电阻,这样,不管什么原因单总线的闲置状态为高电平。如果传输过程需要暂时挂起,且要求传输过程还能够继续的话,总线必须处于空闲状态。位传输之间的恢复时间没有限制,只要总线在恢复期间处于空闲状态(即高电平)即可。如果总线保持低电平超过则将总线上的所有器件将复

5、位。此外,在使用寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间、写入等)具有足够的电源电流,必须在总线上提供强上拉源,如图所示的。第1.3节 单总线技术的信号方式所有单总线器件要求遵循严格的通信协议,以保证数据的完整性。协议定义了几种信号类型:复位脉冲、答应脉冲、写、写、读和读时序。所有的单总线命令序列(初始化、命令、功能命令)都是由这些基本的信号类型组成。这些信号,除了应答脉冲外都是由主机发出同步信号,并且发出的所有命令和数据都是字节的低位在前。初始化时序包括主机发送的复位脉冲和从机发出的应答脉冲,主机通过拉低单总线以上,产生复位脉冲,然后主机释放总线,并进入接收模式。当

6、主机释放总线时,总线由低电平跳变为高电平时产生一上升沿,单总线器件检测到这上升沿后,延时,接着单总线器件通过拉低总线产生应答脉冲。当主机接收到从机应答脉冲后,说明此时有单总线器件在线,然后主机就开始对从机进行命令和功能命令的操作。在每一个写、写或读时序中,总线只能传输一位数据。所有的读写时序至少需要,且每两个独立的时序之间至少需要的恢复时间。读写时序均起始于主机拉低总线。在写时序中,主机拉低总线后保持至少的低电平则向单总线器件写。单总线器件在主机发出读时序时才向主机传送数据,所以当主机向单总线器件发出数据命令后,必须马上产生读时序,以便单总线能传输数据。在主机发出读时序之后,单总线器件才开始在

7、总线上发送或,若单总线器件发送,则保持总线高电平;若发送,则拉低总线。单总线器件发送数据之后,需保持有效的时间,因而,主机在读时序期间必须释放总线,并且必须在之内对总线状态进行采样,接收从机发送的数据。第1.4节 单总线技术的器件为了区分不同的单总线器件,厂家在生产单总线器件时要刻录一个位的二进制代码,用于标明单总线器件的号。目前,单总线器件的主要有数字温度传感器(如)、/转换器(如)门禁、身份识别器(如)、单总线控制器(如)等等。其中数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式等。其型号多种多样,有,等等,主要根据应用场合的不同而改变其外观。封

8、装后的可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。由于其耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域,目前有着广泛的应用,故我们选择芯片来进行下面的设计。第2章DS18B20简介第2.1节DS18B20的封装与管脚芯片的常见封装为,如图,也就是普通直插三极管的样子封装以及封装。各种封装的图示及引脚图。图2.1TO-92封装图2.2 SO封装图2.3SOP封装第2.2节DS18B20内部结构主要由部分组成:光刻、温度敏感器件、高速暂存存储器和温度报警触发器、。光刻中的序列号是出厂前被光刻好的

9、,它可以看作是该的地址序列码。光刻的排列是:开始位是产品类型标号,接着的位是该自身的序列号,最后位是前面位的循环冗余校验码,可由下式得到:。光刻的作用是使每一个都各不相同,这样就可以实现一根总线上挂接多个的目的。光刻保存芯片的唯一的编码。高速暂存存储器高速暂存存储器由个字节组成。高速暂存存储器包含个连续的字节,存放测得的温度的补码、和的拷贝数据、计数器余值和校验等数据,其结构如图所示。其中所有数据均以最低有效位在前的方式读写。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第和第个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。对应的温度计算规则为

10、: 当符号位时,直接将二进制位转换为十进制;当时,先将补码变为原码,再计算十进制值。表 2是对应的一部分温度值。第九个字节是冗余检验字节。图2.4存储器由于芯片可以工作在寄生电源模式下工作,该模式允许工作在无外部电源的状态。当总线为高电平时,寄生电源由单总线通过引脚,此时可以从总线得到能量,并将得到的能量储存到寄生电源储能电容中,当总线为低电平时释放能量供给器件工作使用。简单的说就是在信号线为高电平的时间周期内,把能量储存在内部的电容器中;在信号线为低电平期间,由存储在电容器内的电荷供电。所以,当工作在寄生电源模式时,引脚必须接地。工作时信号线须接的上拉电阻,以保证信号线有足够的驱动能力。一个

11、典型的硬件原理图如图2.5所示。图2.5硬件原理图如上图所示,芯片通过达拉斯公司的单总线协议依靠一个单线端口通讯,当全部器件经由一个三态端口或者漏极开路端口与总线连接时,控制线需要连接一个弱上拉电阻。在多只连接时,每个都拥有一个全球唯一的位序列号,在这个总线系统中,微处理器依靠每个器件独有的位片序列号辨认总线上的器件并记录总线上的器件地址,从而允许多只同时连接在一条单线总线上。因此,可以很轻松地利用一个微处理器去控制很多分布在不同区域的,这一特性在环境控制、探测建筑物、仪器等温度以及过程监测和控制等方面都非常有用。对于的电路连接,除了上面所说的传统的外部电源供电时的电路连接图,也可以工作在上文

12、所述的寄生电源模式中。图表示了工作在寄生电源模式下的硬件原理图。这样可以使工作在寄生电源模式下,不用额外的电源就可以实时采集位于多个地点的温度信息。图2.6寄生电源模式硬件原理图第2.3节DS1820时序及工作方式时序如图2.7所示,时序波形的电平分为种类型:主机作用的高低电平、由输出的高低电平和由上拉电阻拉起的高电平(后种情况主机释放信号线)。闲置时信号线保持高电平,对的任何操作(如读、写、复位等)都是由主机对信号线的电平由逻辑高电平拉至低电平开始。图2.7 复位时序复位时序是工作的基础。任何设备与间的通讯都需要以初始化序列开始。一个复位脉冲跟着一个存在脉冲表明已经准备好发送和接收数据。在初

13、始化序列期间,总线控制器拉低总线并保持以发出一个复位脉冲,然后释放总线,进入接受状态。单总线由上拉电阻拉倒高电平。当探测到/引脚上的上升沿后,等待,然后发出一个由的低电平信号构成的存在脉冲。初始化时序见图2.7。图2.8 写时序的数据读写是通过时序处理位来确认信息交换的。有两种写时序:写时序和写时序。总线控制器通过写时序写逻辑到,写时序写逻辑到。所有写时序必须最少持续,包括两个写周期之间至少的恢复时间。当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始。总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的释放总线。当总线被释放的时候,上拉电阻将拉高总线。总控制

14、器要生成一个写时序,必须把数据线拉到低电平并持续保持至少。总线控制器初始化写时序后,在一个到的窗口内对/线采样。如果线上是高电平,就是写;如果线上是低电平,就是写。写时序见图2.8。图2.9 读时序当总线控制器发起读时序时,仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令或读电源模式指令后必须立刻开始读时序,可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令或召回指令之后读时序。所有读时序必须最少,包括两个读周期间至少的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持,然后总线被释放。在总线控制器发出读时序后,通过拉高或拉低总线上来传输或

15、。当传输逻辑结束后,总线将被释放,通过上拉电阻回到上升沿状态。从输出的数据在读时序的下降沿出现后内有效。因此,总线控制器在读时序开始后必须停止把/脚驱动为低电平,以读取/脚状态。读时序见图2.9。由时序图可知,单总线的通信协议由种信号类别组成:复位脉冲、存在脉冲、写、写、读、读。这些信号除了存在脉冲之外,均由总线主机产生。主机通过单总线对的操作必须首先由操作命令其中之一开始。现以单总线只挂接一个读取其中的温度数据为例,说明其工作过程如下:(1)、主机产生复位脉冲,返回响应脉冲;(2)、主机写入(,跳过)命令,该命令为种操作命令之一;(3)、主机写入温度转换命令;(4)、主机再次产生复位脉冲,返

16、回响应脉冲;(5)、主机写入(,跳过)命令;(6)、主机写入读暂存存储器命令;(7)、读暂存存储器的温度数据。第3章控制器设计第3.1节控制器结构控制器结构如图3.1所示,控制器由部分组成,分别是逻辑控制部分、单总线时序控制部分、数据缓存部分以及计数器部分。逻辑控制部分用于实现与的通信,其中为位双向数据线,为启动信号,下降沿有效。与为地址信号,其不同组合决定控制器的工作状态。当时,控制器对执行复位操作;当时,控制器执行写入操作;当时,控制器执行读出操作。控制器由外部提供的时钟信号,用来产生的计数周期,控制器以为一个时间片形成的读写时序。读写周期则由计数器的计数输出值控制。单总线时序控制部分的主

17、要功能是产生单总线的读写时序,并向输出控制命令,读出测得的数字温度值及其他输出信息。图3.1 控制器结构第3.2节读写时序的实现要求引脚驱动必须是漏极开路引脚,控制器用三态门与连接,如图所示。其中为三态门控制信号,当时输出信号,时输入信号。控制器采用作为基本计时单位,可以保证的时序关系留有一定的缓冲余地。图3.2 输出引脚连接示意图下面采用语言进行程序设计,实现以下功能:(1)、当从机模块检测到主机发送的复位信号时,相应复位信号;(2)、从机接收主机发送的命令;(3)、从机接收主机发送的信号;(4)、从机接收主机发送的命令和/数据;1. library IEEE; 

18、0;  2. use IEEE.STD_LOGIC_1164.ALL;    3. use IEEE.STD_LOGIC_ARITH.ALL;    4. use IEEE.STD_LOGIC_UNSIGNED.ALL;    5.   6. entity ds18B20 is    7. port(clk : in 

19、std_logic;   -50MHz   8.      dq  : inout std_logic;  -DQ数据输出输入端  9.      rst: in std_logic;   10.        11. LED :

20、 out std_logic;    -指示标志,用来显示程序进行到哪一步  12. LED2 : out std_logic;   13. LED3 : out std_logic;    14.       15. dataout1,dataout2,dataout3 : out std_log

21、ic_vector(6 downto 0 );  -数据输出端  16. end ds18B20; 1. architecture Behavioral of ds18B20 is    2.   3. TYPE  STATE_TYPE  is (RESET,CMD_CC,WRITE_BYTE,WRITE_LOW,WRITE_HIGH,READ_BIT,&#

22、160;  4. <span style="white-space:pre">                </span>CMD_44,CMD_BE,WAIT800MS,GET_TMP,WAIT4MS);   -状态机    5. signal STATE: STATE_T

23、YPE:=RESET;   -初始化状态机 6. signal clk_temp : std_logic:='0'  -监测总线上的数据  7. signal clk1m : std_logic; -分频后得到的1M时钟 8. signal cp: std_logic;  - 为时序而产生的1ms时钟  1. begin  

24、0; 2. -分频程序,分到1MHz-  3. ClkDivider:process (clk,clk_temp)    4. begin    5. if rising_edge(clk) then    6.    if (count = 24) then    7.    

25、   count <= 0;    8.       clk_temp<= not clk_temp;    9.    else    10.       count <= count +1; 

26、60;  11.    end if;    12. end if;     13.    clk1m<=clk_temp;    14. end Process;    15. -为时序产生1ms时钟-  16.   17. process (clk1m)

27、60;   18. variable n: integer range 0 to 12000:=0;  19. begin             -cp 1ms   20. if rising_edge(clk1m) then    21.  &#

28、160; n:=n+1;  22.    if (n>12000) then n:=0;  cp<=not cp;  end if;  23.     end if;    24. end Process;    1. STATE_TRANSITION:process(STAT

29、E,clk1m)    -主程序  2. begin   3. if rising_edge(clk1m) then    4.   if(rst='0') then    5.     STATE<=RESET;   6.   else  

30、60;7.     case STATE is    8.      when RESET=>  -如果处在复位状态  9.      LED2<='0'   10.      LED3<='0'  

31、 11.      if (cnt>=0 and cnt<500) then - 500s的复位低电平  12.        dq<='0'   -dq作为输出  13.        cnt<=cnt+1; 

32、0;  14.        STATE<=RESET;  -在一定时序内保持复位状态    15.      elsif (cnt>=500 and cnt<510) then   16.        dq<='Z'

33、  -高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样,高阻态可以应用在inout端口里面,这样在inout没有输出的时候就弄个高阻态,这样就其电平就可以由外面的输入信号决定了  17.        cnt<=cnt+1;   18.        STATE<=RESET;  -拉高dq  19.   

34、;   elsif (cnt>=510 and cnt<750) then   - 240s  20.        temp<=dq;  -dq作为输入(对于控制器来说是输入,对于DS18b20来说是输出)  21.        if(cnt=580) th

35、en   22.          temp<=dq;   23.          if(temp='1') then  -如果temp为1说明DS18B20存在(因为检测到了存在脉冲)  24.        &#

36、160;   LED<='0'   25.          else   26.  LED<='1'   27.          end if;   28.    

37、0;   end if;   1.        cnt<=cnt+1;    2.        STATE<=RESET;    3.      elsif (cnt>=750) then  -初始

38、化时序结束  4.        cnt<=0; -计数器清零   5.        STATE<=CMD_CC;  -复位过程伴随着忽略rom指令“CC”  6.      end if;    7.    

39、60; when CMD_CC=>  -忽略rom指令“CC”  8.        LED2<='1'   9.        LED3<='0'   10.        write_temp<="1

40、1001100"  -将write_temp设为“11001100”  11.        STATE<=WRITE_BYTE;   12.      when WRITE_BYTE=>   13.        case WRITE_BYTE_CNT i

41、s    14.          when 0 to 7=>    15.            if (write_temp(WRITE_BYTE_CNT)='0') then  -判断当前write_temp第WRITE_

42、BYTE_CNT上是否为'0'  16.              STATE<=WRITE_LOW;  -如果当前write_temp第WRITE_BYTE_CNT上是'0',进入WRITE_LOW状态(即对DS18b20写低)  17.            

43、;  LED3<='1'        18.            else   19.              STATE<=WRITE_HIGH;  -如果当前write_t

44、emp第WRITE_BYTE_CNT上是'1',进入WRITE_HIGH状态(即对DS18b20写高)  20.            end if;    21.            WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;  -判断wr

45、ite_temp的下一位  22.          when 8=>   23.            if (WRITE_BYTE_FLAG=0) then - 第一次写0XCC完毕    24.     &#

46、160;        STATE<=CMD_44;  -25.              WRITE_BYTE_FLAG<=1;    26.            elsif (WRITE_BY

47、TE_FLAG=1) then -写0X44完毕 27.              STATE<=RESET;    28.              WRITE_BYTE_FLAG<=2;    29.  

48、          elsif (WRITE_BYTE_FLAG=2) then -第二次写0XCC完毕    30.              STATE<=CMD_BE;    31.      &#

49、160;       WRITE_BYTE_FLAG<=3;    32.            elsif (WRITE_BYTE_FLAG=3) then -写0XBE完毕    33.          &#

50、160;   STATE<=GET_TMP;    34.              WRITE_BYTE_FLAG<=0;    35.            end if;    36

51、.            WRITE_BYTE_CNT<=0;   37.          when others=>STATE<=RESET;   38.        end case;   &#

52、160;39.      when WRITE_LOW=>  -进入写0时序,参看前面  40.        LED3<='1'   41.        case WRITE_LOW_CNT is    42.   &

53、#160;      when 0=>    43.            dq<='0'    44.            if (cnt=70) then  

54、;-等待时序  45.              cnt<=0;    46.              WRITE_LOW_CNT<=1;    47.       

55、     else    48.              cnt<=cnt+1;    49.            end if;    50.   

56、       when 1=>    51.            dq<='Z'    52.            if (cnt=5) then  

57、;  53.              cnt<=0;    54.              WRITE_LOW_CNT<=2;    55.        

58、;    else    56.              cnt<=cnt+1;    57.            end if;    58.    

59、;      when 2=>    59.            STATE<=WRITE_BYTE;    60.            WRITE_LOW_CNT<=0;   

60、 61.          when others=>WRITE_LOW_CNT<=0;    62.        end case;    63.      when WRITE_HIGH=>    -进入写

61、1时序,参看前面  64.        case WRITE_HIGH_CNT is    65.          when 0=>    66.            dq<=

62、9;0'    67.            if (cnt=8) then    68.              cnt<=0;    69.      

63、;        WRITE_HIGH_CNT<=1;    70.            else    71.              cnt<=cnt+1;  

64、  72.            end if;    73.          when 1=>    74.            dq<='Z&

65、#39;    75.            if (cnt=72) then    76.              cnt<=0;    77.      &#

66、160;       WRITE_HIGH_CNT<=2;    78.            else    79.              cnt<=cnt+1;  

67、60; 80.            end if;    81.          when 2=>    82.            STATE<=WRITE_B

68、YTE;    83.            WRITE_HIGH_CNT<=0;    84.         when others=>WRITE_HIGH_CNT<=0;    85.       

69、;end case;    86.      when CMD_44=>    87.        write_temp<="01000100"  -写指令44h  88.        STATE<=WRITE_BYTE;

70、60;   89.      when CMD_BE=>    90.        write_temp<="10111110"  -写指令BEh  91.        STATE<=WRITE_BYTE;  92.  

71、;    when READ_BIT=>    93.        case READ_BIT_CNT is    94.          when 0=>    95.     &#

72、160;      dq<='0'  -4s的低电平  96.            if (cnt=4) then    97.              READ_BIT_C

73、NT<=1;    98.              cnt<=0;    99.            else    100.         

74、     cnt<=cnt+1;    101.            end if;    102.          when 1=>    103.    

75、60;       dq<='Z' -4s的高电平   104.            if (cnt=4) then   105.              READ_BIT_

76、CNT<=2;    106.              cnt<=0;    107.            else    108.        

77、60;     cnt<=cnt+1;    109.            end if;    110.          when 2=>    111.    

78、        dq<='Z'   112.            TMP_BIT<=dq; -12s读出数据 ,就是最后一次赋值的结果。  113.            if (cnt=4

79、) then    114.              READ_BIT_CNT<=3;    115.              cnt<=0;    116.    

80、;        else    117.              cnt<=cnt+1;    118.            end if;   &

81、#160;119.          when 3=>     120.            dq<='Z'    -控制器拉高总线   121.        

82、0;   if (cnt=50) then -读出数据后,等待50us   122.              cnt<=0;    123.              READ_BIT_CNT<=

83、0;    124.              STATE<=GET_TMP;    125.            else    126.        

84、60;     cnt<=cnt+1;    127.            end if;    128.          when others=>READ_BIT_CNT<=0;    

85、;129.        end case;    130.   131.      when GET_TMP=>  -读数据  132.        case GET_TMP_CNT is    133.          when 0 =>   134.       

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论