基于VHDL的单总线从机读写控制器.doc

上传人:wj 文档编号:1243630 上传时间:2023-04-30 格式:DOC 页数:22 大小:1.04MB
下载 相关 举报
基于VHDL的单总线从机读写控制器.doc_第1页
第1页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第2页
第2页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第3页
第3页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第4页
第4页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第5页
第5页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第6页
第6页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第7页
第7页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第8页
第8页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第9页
第9页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第10页
第10页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第11页
第11页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第12页
第12页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第13页
第13页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第14页
第14页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第15页
第15页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第16页
第16页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第17页
第17页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第18页
第18页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第19页
第19页 / 共22页
基于VHDL的单总线从机读写控制器.doc_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于VHDL的单总线从机读写控制器.doc

《基于VHDL的单总线从机读写控制器.doc》由会员分享,可在线阅读,更多相关《基于VHDL的单总线从机读写控制器.doc(22页珍藏版)》请在冰点文库上搜索。

基于VHDL的单总线从机读写控制器.doc

现代电子技术(作业)

设计基于VHDL的单总线从机读写控制器

目录

前言 1

第1章单总线技术 2

第1.1节单总线技术简介 2

第1.2节单总线技术的原理与硬件结构 2

第1.3节单总线技术的信号方式 3

第1.4节单总线技术的器件 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

20

前言

是美国达拉斯公司生产的一种单总线数字温度传感器,采用总线通信协议。

具有独特的单总线通信方式以及较高的测量精度,目前在实际生活中获得了广泛应用。

本文介绍了的基本原理和通信时序,并用软件模拟单总线时序,实现与的通信。

作为电子硬件设计的主流描述语言,采用层次化的设计方式,具有电路行为描述能力强、灵活、通用及运算仿真速度快等特点,能够较容易地实现时序逻辑控制。

本文以数字温度传感器为例,设计一个基于的单总线控制器,并对通信程序进行了仿真测试。

本文介绍的单总线控制器,有较强的可扩展性,可以连接多种单总线器件,且微处理器可以不用被迫关闭中断,满足各类对实时性具有严格要求的应用。

第1章单总线技术

第1.1节单总线技术简介

单总线技术是达拉斯半导体公司推出的一项特有技术。

它采用单根信号线,既可传输时钟,又能传输数据,而且数据可以双向传输。

由于这种单总线技术线路简单,硬件开销少,所以其具有成本低廉,便于总线扩展和易于维护等优点。

单总线适用于单主机系统,能够控制一个或多个从机设备。

主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。

当只有一个从机设备时,系统可按单节点系统操作;当有多个从机设备时,系统则按多节点系统操作。

第1.2节单总线技术的原理与硬件结构

单总线只有一根数据线,系统中的数据交换、控制都在这根线上完成。

设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,这样便可允许设备在不发送数据时释放总线,以便其他设备使用总线,其内部等效电路如图1.1所示。

图1.1单总线硬件接口示意图

单总线要外接一个约的上拉电阻,这样当总线闲置时,状态为高电平。

主机和从机之间的通信通过以下三个步骤完成:

初始化器件,识别器件,交换数据。

由于二者是主从结构,只有主机呼叫从机时,从机才能答应,因此主机访问器件必须严格遵循单总线命令序列:

初始化、命令、功能命令。

如果出现序列混乱,器件则不会响应主机(搜索命令,报警搜索命令除外)。

根据以上原理,可以画出单总线硬件接口原理图,如图1.2所示。

图1.2单总线硬件接口原理图

单总线端口为漏极开路,在本文中令单总线外接一个约的上拉电阻,这样,不管什么原因单总线的闲置状态为高电平。

如果传输过程需要暂时挂起,且要求传输过程还能够继续的话,总线必须处于空闲状态。

位传输之间的恢复时间没有限制,只要总线在恢复期间处于空闲状态(即高电平)即可。

如果总线保持低电平超过则将总线上的所有器件将复位。

此外,在使用寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间、写入等)具有足够的电源电流,必须在总线上提供强上拉源,如图1.2中所示的。

第1.3节单总线技术的信号方式

所有单总线器件要求遵循严格的通信协议,以保证数据的完整性。

协议定义了几种信号类型:

复位脉冲、答应脉冲、写、写、读和读时序。

所有的单总线命令序列(初始化、命令、功能命令)都是由这些基本的信号类型组成。

这些信号,除了应答脉冲外都是由主机发出同步信号,并且发出的所有命令和数据都是字节的低位在前。

初始化时序包括主机发送的复位脉冲和从机发出的应答脉冲,主机通过拉低单总线以上,产生复位脉冲,然后主机释放总线,并进入接收模式。

当主机释放总线时,总线由低电平跳变为高电平时产生一上升沿,单总线器件检测到这上升沿后,延时,接着单总线器件通过拉低总线产生应答脉冲。

当主机接收到从机应答脉冲后,说明此时有单总线器件在线,然后主机就开始对从机进行命令和功能命令的操作。

在每一个写、写或读时序中,总线只能传输一位数据。

所有的读写时序至少需要,且每两个独立的时序之间至少需要的恢复时间。

读写时序均起始于主机拉低总线。

在写时序中,主机拉低总线后保持至少的低电平则向单总线器件写。

单总线器件在主机发出读时序时才向主机传送数据,所以当主机向单总线器件发出数据命令后,必须马上产生读时序,以便单总线能传输数据。

在主机发出读时序之后,单总线器件才开始在总线上发送或,若单总线器件发送,则保持总线高电平;若发送,则拉低总线。

单总线器件发送数据之后,需保持有效的时间,因而,主机在读时序期间必须释放总线,并且必须在之内对总线状态进行采样,接收从机发送的数据。

第1.4节单总线技术的器件

为了区分不同的单总线器件,厂家在生产单总线器件时要刻录一个位的二进制代码,用于标明单总线器件的号。

目前,单总线器件的主要有数字温度传感器(如)、/转换器(如)门禁、身份识别器(如)、单总线控制器(如)等等。

其中数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式等。

其型号多种多样,有,等等,主要根据应用场合的不同而改变其外观。

封装后的可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。

由于其耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域,目前有着广泛的应用,故我们选择芯片来进行下面的设计。

第2章DS18B20简介

第2.1节DS18B20的封装与管脚

芯片的常见封装为,如图2.1所示,也就是普通直插三极管的样子。

也有其他形式的封装,如图2.2所示的封装以及图2.3所示的封装。

各种封装的图示及引脚图如图2.12.3所示。

图2.1TO-92封装

图2.2SO封装

图2.3μSOP封装

第2.2节DS18B20内部结构

主要由部分组成:

光刻、温度敏感器件、高速暂存存储器和温度报警触发器、。

光刻中的序列号是出厂前被光刻好的,它可以看作是该的地址序列码。

光刻的排列是:

开始位是产品类型标号,接着的位是该自身的序列号,最后位是前面位的循环冗余校验码,可由下式得到:

光刻的作用是使每一个都各不相同,这样就可以实现一根总线上挂接多个的目的。

光刻保存芯片的唯一的编码。

高速暂存存储器高速暂存存储器由个字节组成。

高速暂存存储器包含个连续的字节,存放测得的温度的补码、和的拷贝数据、计数器余值和校验等数据,其结构如图2.4所示。

其中所有数据均以最低有效位在前的方式读写。

当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第和第个字节。

单片机可通过单线接口读到该数据,读取时低位在前,高位在后。

对应的温度计算规则为:

当符号位时,直接将二进制位转换为十进制;当时,先将补码变为原码,再计算十进制值。

表2是对应的一部分温度值。

第九个字节是冗余检验字节。

图2.4存储器

由于芯片可以工作在寄生电源模式下工作,该模式允许工作在无外部电源的状态。

当总线为高电平时,寄生电源由单总线通过引脚,此时可以从总线得到能量,并将得到的能量储存到寄生电源储能电容中,当总线为低电平时释放能量供给器件工作使用。

简单的说就是在信号线为高电平的时间周期内,把能量储存在内部的电容器中;在信号线为低电平期间,由存储在电容器内的电荷供电。

所以,当工作在寄生电源模式时,引脚必须接地。

工作时信号线须接的上拉电阻,以保证信号线有足够的驱动能力。

一个典型的硬件原理图如图2.5所示。

图2.5硬件原理图

如上图所示,芯片通过达拉斯公司的单总线协议依靠一个单线端口通讯,当全部器件经由一个三态端口或者漏极开路端口与总线连接时,控制线需要连接一个弱上拉电阻。

在多只连接时,每个都拥有一个全球唯一的位序列号,在这个总线系统中,微处理器依靠每个器件独有的位片序列号辨认总线上的器件并记录总线上的器件地址,从而允许多只同时连接在一条单线总线上。

因此,可以很轻松地利用一个微处理器去控制很多分布在不同区域的,这一特性在环境控制、探测建筑物、仪器等温度以及过程监测和控制等方面都非常有用。

对于的电路连接,除了上面所说的传统的外部电源供电时的电路连接图,也可以工作在上文所述的寄生电源模式中。

图2.6表示了工作在寄生电源模式下的硬件原理图。

这样可以使工作在寄生电源模式下,不用额外的电源就可以实时采集位于多个地点的温度信息。

图2.6寄生电源模式硬件原理图

第2.3节DS1820时序及工作方式

时序如图2.72.9所示,时序波形的电平分为种类型:

主机作用的高低电平、由输出的高低电平和由上拉电阻拉起的高电平(后种情况主机释放信号线)。

闲置时信号线保持高电平,对的任何操作(如读、写、复位等)都是由主机对信号线的电平由逻辑高电平拉至低电平开始。

图2.7复位时序

复位时序是工作的基础。

任何设备与间的通讯都需要以初始化序列开始。

一个复位脉冲跟着一个存在脉冲表明已经准备好发送和接收数据。

在初始化序列期间,总线控制器拉低总线并保持以发出一个复位脉冲,然后释放总线,进入接受状态。

单总线由上拉电阻拉倒高电平。

当探测到/引脚上的上升沿后,等待,然后发出一个由的低电平信号构成的存在脉冲。

初始化时序见图2.7。

图2.8写时序

的数据读写是通过时序处理位来确认信息交换的。

有两种写时序:

写时序和写时序。

总线控制器通过写时序写逻辑到,写时序写逻辑到。

所有写时序必须最少持续,包括两个写周期之间至少的恢复时间。

当总线控制器把数据线从逻辑高电平拉到低电平的时候,写时序开始。

总线控制器要生产一个写时序,必须把数据线拉到低电平然后释放,在写时序开始后的释放总线。

当总线被释放的时候,上拉电阻将拉高总线。

总控制器要生成一个写时序,必须把数据线拉到低电平并持续保持至少。

总线控制器初始化写时序后,在一个到的窗口内对/线采样。

如果线上是高电平,就是写;如果线上是低电平,就是写。

写时序见图2.8。

图2.9读时序

当总线控制器发起读时序时,仅被用来传输数据给控制器。

因此,总线控制器在发出读暂存器指令或读电源模式指令后必须立刻开始读时序,可以提供请求信息。

除此之外,总线控制器在发出发送温度转换指令或召回指令之后读时序。

所有读时序必须最少,包括两个读周期间至少的恢复时间。

当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持,然后总线被释放。

在总线控制器发出读时序后,通过拉高或拉低总线上来传输或。

当传输逻辑结束后,总线将被释放,通过上拉电阻回到上升沿状态。

从输出的数据在读时序的下降沿出现后内有效。

因此,总线控制器在读时序开始后必须停止把/脚驱动为低电平,以读取/脚状态。

读时序见图2.9。

由时序图可知,单总线的通信协议由种信号类别组成:

复位脉冲、存在脉冲、写、写、读、读。

这些信号除了存在脉冲之外,均由总线主机产生。

主机通过单总线对的操作必须首先由操作命令其中之一开始。

现以单总线只挂接一个读取其中的温度数据为例,说明其工作过程如下:

(1)、主机产生复位脉冲,返回响应脉冲;

(2)、主机写入(,跳过)命令,该命令为种操作命令之一;

(3)、主机写入温度转换命令;

(4)、主机再次产生复位脉冲,返回响应脉冲;

(5)、主机写入(,跳过)命令;

(6)、主机写入读暂存存储器命令;

(7)、读暂存存储器的温度数据。

第3章控制器设计

第3.1节控制器结构

控制器结构如图3.1所示,控制器由部分组成,分别是逻辑控制部分、单总线时序控制部分、数据缓存部分以及计数器部分。

逻辑控制部分用于实现与的通信,其中为位双向数据线,为启动信号,下降沿有效。

与为地址信号,其不同组合决定控制器的工作状态。

当时,控制器对执行复位操作;当时,控制器执行写入操作;当时,控制器执行读出操作。

控制器由外部提供的时钟信号,用来产生的计数周期,控制器以为一个时间片形成的读写时序。

读写周期则由计数器的计数输出值控制。

单总线时序控制部分的主要功能是产生单总线的读写时序,并向输出控制命令,读出测得的数字温度值及其他输出信息。

图3.1控制器结构

第3.2节读写时序的实现

要求引脚驱动必须是漏极开路引脚,控制器用三态门与连接,如图3.2所示。

其中为三态门控制信号,当时输出信号,时输入信号。

控制器采用作为基本计时单位,可以保证的时序关系留有一定的缓冲余地。

图3.2输出引脚连接示意图

下面采用语言进行程序设计,实现以下功能:

(1)、当从机模块检测到主机发送的复位信号时,相应复位信号;

(2)、从机接收主机发送的命令;

(3)、从机接收主机发送的信号;

(4)、从机接收主机发送的命令和/数据;

1.library IEEE;    

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 std_logic;   ---50MHz   

8.     dq  :

 inout std_logic;  --DQ数据输出输入端  

9.     rst:

 in std_logic;   

10.       

11.LED :

 out std_logic;    --指示标志,用来显示程序进行到哪一步  

12.LED2 :

 out std_logic;   

13.LED3 :

 out std_logic;    

14.      

15.dataout1,dataout2,dataout3 :

 out std_logic_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,   

4.

pre">                CMD_44,CMD_BE,WAIT800MS,GET_TMP,WAIT4MS);   --状态机    

5.signal STATE:

 STATE_TYPE:

=RESET;   --初始化状态机 

6.signal clk_temp :

 std_logic:

='0';  --监测总线上的数据  

7.signal clk1m :

 std_logic; --分频后得到的1M时钟 

8.signal cp:

 std_logic;  -- 为时序而产生的1ms时钟  

1.begin    

2.----------分频程序,分到1MHz----------------  

3.ClkDivider:

process (clk,clk_temp)    

4.begin    

5.if rising_edge(clk) then    

6.   if (count = 24) then    

7.      count <= 0;    

8.      clk_temp<= not clk_temp;    

9.   else    

10.      count <= count +1;    

11.   end if;    

12.end if;     

13.   clk1m<=clk_temp;    

14.end Process;    

15.----------为时序产生1ms时钟----------------  

16.  

17.process (clk1m)    

18.variable n:

 integer range 0 to 12000:

=0;  

19.begin             -----cp 1ms   

20.if rising_edge(clk1m) then    

21.   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(STATE,clk1m)    --主程序  

2.begin   

3.if rising_edge(clk1m) then    

4.  if(rst='0') then    

5.    STATE<=RESET;   

6.  else   

7.    case STATE is    

8.     when RESET=>  --如果处在复位状态  

9.     LED2<='0';   

10.     LED3<='0';   

11.     if (cnt>=0 and cnt<500) then -- 500μs的复位低电平  

12.       dq<='0';   --dq作为输出  

13.       cnt<=cnt+1;    

14.       STATE<=RESET;  --在一定时序内保持复位状态    

15.     elsif (cnt>=500 and cnt<510) then   

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

17.       cnt<=cnt+1;   

18.       STATE<=RESET;  --拉高dq  

19.     elsif (cnt>=510 and cnt<750) then   -- 240μs  

20.       temp<=dq;  --dq作为输入(对于控制器来说是输入,对于DS18b20来说是输出)  

21.       if(cnt=580) then   

22.         temp<=dq;   

23.         if(temp='1') then  --如果temp为1说明DS18B20存在(因为检测到了存在脉冲)  

24.           LED<='0';   

25.         else   

26. LED<='1';   

27.         end if;   

28.       end if;   

1.       cnt<=cnt+1;    

2.       STATE<=RESET;    

3.     elsif (cnt>=750) then  --初始化时序结束  

4.       cnt<=0; --计数器清零   

5.       STATE<=CMD_CC;  --复位过程伴随着忽略rom指令“CC”  

6.     end if;    

7.     when CMD_CC=>  --忽略rom指令“CC”  

8.       LED2<='1';   

9.       LED3<='0';   

10.       write_temp<="11001100";  --将write_temp设为“11001100”  

11.       STATE<=WRITE_BYTE;   

12.     when WRITE_BYTE=>   

13.       case WRITE_BYTE_CNT is    

14.         when 0 to 7=>    

15.           if (write_temp(WRITE_BYTE_CNT)='0') then  --判断当前write_temp第WRITE_BYTE_CNT上是否为'0'  

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

17.             LED3<='1';        

18.           else   

19.             STATE<=WRITE_HIGH;  --如果当前write_temp第WRITE_BYTE_CNT上是'1',进入WRITE_HIGH状态(即对DS18b20写高)  

20.           end if;    

21.           WRITE_BYTE_CNT<=WRITE_BYTE_CNT+1;  --判断write_temp的下一位  

22.         when 8=>   

23.           if (WRITE_BYTE_FLAG=0) then -- 第一次写0XCC完毕    

24.             STATE<=CMD_44;  --

25.             WRITE_BYTE_FLAG<=1;    

26.           elsif (WRITE_BYTE_FLAG=1) then --写0X44完毕 

27.             STATE<=RESET;    

28.             WRITE_BYTE_FLAG<=2;    

29.           elsif (WRITE_BYTE_FLAG=2) then --第二次写0XCC完毕    

30.             STATE<=CMD_BE;    

31.             WRITE_BYTE_FLAG<=3;    

32.           elsif (WRITE_BYTE_FLAG=3) then --写0XBE完毕    

33.             STATE<=GET_TMP;    

34.             WRITE_BYTE_FLAG<=0;    

35.           end if;    

36.           WRITE_BYTE_CNT<=0;   

37.         when others=>STATE<=RESET;   

38.       end case;    

39.     when WRITE_LOW=>  --进入写0时序,参看前面  

40.       LED3<='1';   

41.       case WRITE_LOW_CNT is    

42.         when 0=>    

43

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2