基于FPGA的温度检测系统设计

  • 格式:docx
  • 大小:29.18 KB
  • 文档页数:15

基于FPGA的温度检测系统设计

Prepared on 24 November 2020 湖北民族学院科技学院信息工程学院

数字系统与Verilog设计报告

题 目: 基于FPGA的温度检测系统设计

姓 名:

学 号:

指导老师:

2014/6/23摘 要

本文利用数字温度传感器DS18B20的数据接口和特点,阐述了一种基于现场可编程门阵列( FPGA)控制DS18B20的方法。使用FPGA作为控制器,严格控制DS18B20 的时序,在单总线上实现读写功能,完成测量数字温度的功能。将测量的二进制数转换为BCD码,并通过数码管显示。系统设计使用

Verilog 语言。

关键字:数字温度传感器,数字温度检测,FPGA,Verilog语言 目 录

1 引 言

温度是工业控制中主要的被控参数之一,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用。随着电子技术和微型计算机的迅速发展,微机测量和控制技术得到了迅速的发展和广泛的应用。单片机具有处理能强、运行速度快、功耗低等优点,应用在温度测量与控制方面,控制简单方便,测量范围广,精度较高。

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

随着温度检测理论和技术的不断更新, 温度传感器的种类也越来越多,在微机系统中使用的传感器,必须是能够将非电量转换成电量的传感器,目前常用的有热电偶传感器、热电阻传感器和半导体集成传感器等,每种传感器根据其自身特性,都有它自己的应用领域。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计利用数字温度传感器DS18B20的数据接口和特点。使用FPGA作为控制器,严格控制DS18B20 的时序,在单总线上实现读写功能,完成测量数字温度的功能。将测量的二进制数转换为BCD码,并通过数码管显示。

随着人们生活水平的不断提高,FPGA控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。

21世纪科学技术的发展日新月异,科技的进步带动了测量技术的发展,现代控制设备的性能和结构发生了巨大的变化,我们已经进入了高速发展的信息时代,测量技术也成为当今科技的主流之一,被广泛的应用于生产的各个领域。 2 设计实现

FPGA简介

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

特点介绍:

1) 采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。

2) FPGA可做其它全定制或半定制ASIC电路的中试样片。

3) FPGA内部有丰富的触发器和I/O引脚。

4) FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5) FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。

可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。

FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。

加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。

DS18B20的通讯协议

根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。

由于 DS18B20 是采用一根 I/ O 总线读写数据,因此DS18B20 对读写数据位有严格的时序要求。DS18B20 遵循相应的通信协议从而保证数据传输的正确性和完整性。该通信协议定义了多种信号时序:初始化时序、 写时序、 读时序。

初始化时序

初始化时序中,控制器发送一个480us-960us的低电平的复位信号,然后释放总线,也就是总线为高电平,此时,控制器准备接收DS18B20的反应信号,当总线释放后,如果存在DS18B20,那么DS18B20将在15-60us内发送一个持续60-240us的反应信号。

写时序

因为本设计总线上只挂了一个DS18B20,所以不用读取64位序列号,直接发送rom命令写时序有写1和写2时序首先将总线拉低电平拉低后15us之内必须把所要向DS18B20写的数据传到总线上DS18B20将在15us-60us内采样总线上的数据,如果为高则写1,为低则写0,写完一次后释放总线。每两次写数据之间时隙要大于1us。

读时序

读时序时总线拉低电平大于1us后然后释放总线准备接收DS18B20传来的数据,DS18B20将在总线拉低后15us之内将数据传到总线上,因此控制器必须在拉低电平然后释放总线15us之内采样总线上的数据。每次读取一位数据不小于60us。 DS18B20程序流程图

FPGA 控制DS18B20 实现温度转换的程序流程如下图所示。

程序流程图

电源连接

DS18B20可使用寄生电源,可以在 I/ O 引脚处于高电平时 “偷” 些能量,储存在电容中供正常使用,但进行精确转换时需要 I/ O 引脚保持大电流供电,这样对 FPGA 芯片引脚造成很大压力,所以使用 VDD 引脚接外部电源。

DS18B20电源连接图

DS18B20 进行温度转换需要很大电流,工作最大电流可达 1 mA。使用

VDD 引脚接外部电源供电的优点在于I/ O 线上不需要在温度变换期间保持高电平。这样就可以有效的保护FPGA 芯片,也可在单总线上放置多数目的DS18B20。使用外部电源,通过发出 Skip ROM 跳过命令,然后发出 Convert T变换命令,可以完成温度变换。 3 模块设计

DS18b20驱动模块

DSl820数字温度计提供12位(二进制)温度读数指示器件的温度信息经过单线接口送 入DSl820或从DSl820送出因此从主机CPU到DSl820仅需一条线(和地线)DSl820的电源可以由数据线本身提供而不需要外部电源因为每一个DSl820在出厂时已经给定了唯一的序号因此任意多个DSl820可以存放在同一条单线总线上这允许在许多不同的地方放置温度敏感器件DSl820的测量范围从-55度到+125度增量值为度可在1 s(典型值)内把温度变换成数字量。Verilog程序如下:module ds18b20(iCLK, iRESET,

oWIRE, oFLAG, oDATA );

input iCLK,iRESET;

output reg[11:0] oDATA;

output reg oFLAG;

inout reg oWIRE;

parameter do_reset = 6'b000001,

release_bus = 6'b000010,

wait_presence = 6'b000100;

parameter write = 6'b001000,

wait_conver = 6'b010000, read =

6'b100000;

Tconvert_Word = 8'b01000100,

reg[63:0] counter;

reg[7:0] byte_counter;

reg[5:0] nstate;

reg[7:0] temp_word;

reg[7:0] addr;

reg[15:0] Temp_buffer;

always @(posedge iCLK) begin

if(~iRESET) begin nstate <=

do_reset;

byte_counter <= 0;

counter <= 0; oFLAG <= 0;

oDATA <= 0;

temp_word <= Skip_Word;

addr <= 1;

Temp_buffer<=0;

oWIRE <=0;

end else case(nstate)

do_reset : begin

oFLAG <= 0;

if(counter == 499) begin

nstate <= wait_presence;

counter <= 0;

oWIRE <=1;

end

else begin

counter <= counter + 1;

oWIRE <=0;

end

end

wait_presence: begin

if(counter == 400) begin

nstate <= release_bus;

counter <= 0;

oWIRE <=1;