FPGA课程设计论文学生姓名周悦学号20091321018院系电子与信息工程学院专业电子科学与技术指导教师李敏二O一二年5月28日基于FPGA的温度传感器系统设计1引言温度是一种最基本的环境参数,人们的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:传统的分立式温度传感器;模拟集成温度传感器;智能集成温度传感器。目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。本文将介绍采用智能集成温度传感器DS18B20,并以FPGA为控制器的温度测量装置的硬件组成和软件设计,用液晶来实现温度显示。2电路分析系统框图如下:第一部分:DS18B20温度传感器美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持一线总线接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新一代的DS18B20体积更小、更经济、更灵活。使你可以充分发挥“一线总线”的优点。DS18B20的主要特性:(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测(4)DS18B20在使用中不需要任何外DS18B20温度传感器FPGALCD1602液晶显示器围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快(8)测量结果直接输出数字温度信号,以一线总线串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。第二部分EPM240系列芯片基本参数:CPLD类型:闪存宏单元数:192输入/输出线数:80传播延迟时间:5.9ns整体时钟设定时间:2.7ns频率:201.1MHz电源电压范围:2.375Vto2.625V,3Vto3.6V工作温度范围:0°Cto+85°C针脚数:100封装类型:TQFP工作温度最低:0°C工作温度最高:85°C逻辑芯片功能:CPLD逻辑芯片基本号:EPM240T可编程逻辑类型:CPLD输入/输出接口标准:LVTTL,LVCMOS,PCI第三部分:LCD1602液晶显示屏液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:高电平时为8位总线,低电平时为4位总线)指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据指令11:读数据电路连接如图所示~2.2软件设计1、18b20驱动时序程序采用C语言进行编写,主要完成LCD1602初始化、DS18B20的初始化、从DS18B20读取数据、向DS18B20写数据及温度转化等子程序的编写,此外在进行程序的编写时一定要严格保证读写时序的正确性,否则无法读取测温结果,其初始化时序和写时序的程序分别如下:初始化时序包括一个主机发出的复位脉冲以及从机的应答脉冲这一过程,如图所示复位脉冲是一个480~960us的低电平然后释放总线,将总线拉至高电平,时间持续15~60us之后从机开始向总线发出一个应答脉冲,该脉冲是一个60~240us的低电平信号,表示从机已准备好,在初始化过程中主机接收脉冲的时间最少为480us。DSl8820的访问步骤为:先进行初始化(Ini—tialization),然后发送ROM命令,最后发送Func—tion功能命令.对DSl8820访问必须通过上述步骤完成.初始化命令使主设备知道从设备是在总线上并可以进行访问.ROM命令可以使主设备知道有多少和什么类型的从设备连接在总线上并且判断是否超过温度报警值.共有5种ROM命令,分别是READROM(33H)、MATCHROM(55H)、SEARCHROM(FOH)、SKIPROM(CCH)、ALARMSEARCH命令(ECH).主设备可以通过功能命令来对DSl8820内部存储器进行读写.有6种功能命令,分别是CONVERT(44H)、WRITESCRATCHPAD(BEH)、READSCRATCHPAD(4EH)、COPYSCRATCHPAD(48H)、RECALLE2(B8H)、读电源供电方式(B4H).DSl8820的单线通信功能是分时完成的,它有严格的时隙要求.LibraryIEEE;UseIEEE.Std_Logic_1164.All;EntitywenduisPort(led:outstd_logic_vector(0to16);wireout:inoutstd_logic;clk:instd_logic;rst:instd_logic);Endentityb;Architectureinitofwenduistypeinit_statesis(s00,s0,s1,s2,s3,s4,s5,s6,s7,w0,w1,w00,w01,read0,read1,read2,read3);signalstate:init_states;signali:integerRange0to1000000;signalreset:std_logic;beginprocess(rst,wireout,clk)--variablei:IntegerRange0to1000;variableflag:IntegerRange0to200;variablelight:IntegerRange0to16;beginifrst='0'thenstate=s00;wireout='Z';flag:=0;elsifrising_edge(clk)thencasestateiswhens00=flag:=0;state=s0;whens0=--初始化18b20wireout='0';--主机拉底总线reset='1';state=s1;whens1=reset='0';if(i=500)then--延时500uswireout='Z';--释放总线reset='1';state=s2;endif;whens2=reset='0';if(i=100)then--等待100usreset='1';state=s3;endif;whens3=if(wireout='0')then--若18b20拉低总线,初始化成功state=s4;led(16)='1';--led16灯亮elsif(wireout='1')then--否则,初始化不成功,返回S0state=s0;endif;whens4=reset='0';if(i=400)then--再延时400usreset='1';state=s5;endif;whens5=--写数据if(flag=0)thenflag:=1;state=w0;--cchelsif(flag=1)thenflag:=2;state=w0;elsif(flag=2)thenflag:=3;state=w01;wireout='0';elsif(flag=3)thenflag:=4;state=w01;wireout='0';elsif(flag=4)thenflag:=5;state=w0;elsif(flag=5)thenflag:=6;state=w0;elsif(flag=6)thenflag:=7;state=w01;wireout='0';elsif(flag=7)thenflag:=8;state=w01;wireout='0';--第一次写完,750ms后,跳回s0elsif(flag=16)thenflag:=20;state=s6;wireout='Z';--再次置数cch和behelsif(flag=20)thenflag:=21;state=w0;--cchelsif(flag=21)thenflag:=22;state=w0;elsif(flag=22)thenflag:=23;state=w01;wireout='0';elsif(flag=23)thenflag:=24;state=w01;wireout='0';elsif(flag=24)thenflag:=25;state=w0;elsif(flag=25)thenflag:=26;state=w0;elsif(flag=26)thenflag:=27;state=w01;wireout='0';elsif(flag=27)thenflag:=28;state=w01;wireo