基于FPGA的远程温度检测系统.docx

上传人:b****5 文档编号:28666388 上传时间:2023-07-19 格式:DOCX 页数:17 大小:53.68KB
下载 相关 举报
基于FPGA的远程温度检测系统.docx_第1页
第1页 / 共17页
基于FPGA的远程温度检测系统.docx_第2页
第2页 / 共17页
基于FPGA的远程温度检测系统.docx_第3页
第3页 / 共17页
基于FPGA的远程温度检测系统.docx_第4页
第4页 / 共17页
基于FPGA的远程温度检测系统.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于FPGA的远程温度检测系统.docx

《基于FPGA的远程温度检测系统.docx》由会员分享,可在线阅读,更多相关《基于FPGA的远程温度检测系统.docx(17页珍藏版)》请在冰豆网上搜索。

基于FPGA的远程温度检测系统.docx

基于FPGA的远程温度检测系统

评阅老师

分数

 

数字系统课程设计

班级13级信息进程1班

组长麦锐杰

组员刘清斌、方加鹏

一、题目要求

基于FPGA和ZigBee的远程温度检测系统:

终端进行环境温度的检测,数据返回至操纵端,实时显示检测到的温度。

假设温度超过阀值,LED灯闪烁报警。

二、设计方案

系统整体思路:

温度传感器检测获取温度信息,通过ZigBee协议与FPGA操纵板进行数据传输。

ZigBee模块1+温度传感器

ZigBee模块2

串行接口

FPGA

图1系统整体框图

三、模块实现

(一)ZigBee模块实现

1.zigbee介绍:

Zigbee是基于标准的低功耗局域网协议,又称为紫蜂协议,其特点是近距离、低复杂度、自组织、低功耗、低数据速度。

Zigbee协议从下到上别离分为物理层PHY、媒体访问操纵层MAC、传输层TL、网络层NWK与应用层APL。

本课程设计中zigbee模块采纳的是TI公司生产的CC2530F256芯片,符合应用。

协议栈利用的是TI公司搭建的Zstack,这是当前业界领先、应用面很广的协议栈,结合OSAL操作系统,使得用户在搭建系统、进行多任务分派方面有专门大的便利性。

其他协议栈还有freakz、msstatePan等。

 

2.DS18B20温度传感器:

DS18B20是当前市场要紧的温度传感器之一,要紧特性有以下几点:

1)适应电压范围广,电压范围在~,是多数单片机的供电电压,因此大多数在单片机上利用。

2)它具有一线总线的特点,在于微处置器连接时仅需要一条口线即可实现微处置器与DS18B20之间的双向通信。

3)DS18B20在利用中不需要任何外围元件,全数传感元件及转换电路集成在形如一只三极管的集成电路类。

4)温度测量范围在-55℃~125℃,精度约为±℃。

DS18B20温度搜集部份:

概念DS18B20在CC2530上的输入脚为:

P0DIR&=0x7f;

温度读取主函数如下:

unsignedcharReadDs18B20(void)

{

unsignedcharV1,V2;=NULL;

}

}

AF_DataRequest中DstAddr、epDesc为目标地址的属性,SAMPLEAPP_P2P_CLUSTERID为发送任务的ID,触发此ID那么进行发送死令。

str为咱们要发送的数据,咱们在此设计中发送的是八位二进制数的温度,因此长度设定为1,str寄存的是温度值。

图3温度数据发送框图

实验进程中,设置数据发送的周期SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT为300ms,即秒更新一次温度值。

3.ZigBee与FPGA的物理连接

zigbee底板通过PL2303芯片与电脑串口进行连接,PL2303芯片是将数字电平信号进行打包,转化成usb协议包,由电脑进行解包。

而FPGA底板那么是通过MAX232进行连接,max232直接将数字信号转化为RS232模拟电平。

因此无法通过USB线将zigbee模块与FPGA开发板直接相连

解决方法是在zigbee底板拉出异步传输线TX与RX,直接与cycloneii芯片上的RX和TX对应连接。

(二)基于FPGA的串行接口模块

1.模块概述

该串行接口电路用于实现cc2530F256芯片与FPGA的通信,把收到的串行数据转换成并行数据进行输出。

由于FPGA只需接收数据,不需要向cc2530F256芯片发送数据,故该接口只由波特率发生器和接收模块组成。

2.波特率发生器

图4波特率发生器引脚图

波特率发生器即分频器。

clk:

FPGA提供的系统时钟接入

resetb:

复位

bclk:

时钟信号输出,接收模块的时钟输入

波特率发生器的VHDL代码:

LIBRARYIEEE;

USEbaudis

Port(clk,resetb:

instd_logic;

bclk:

outstd_logic);

endbaud;

architecturebehaveofbaudis

begin

process(clk,resetb)

variablecnt:

integer;

begin

ifresetb='1'then

cnt:

=0;

bclk<='0';--复位

elsifrising_edge(clk)then

ifcnt>=330then

cnt:

=0;

bclk<='1';--设置分频系数

else

cnt:

=cnt+1;

bclk<='0';

endif;

endif;

endprocess;

endbehave;

3.接收模块

1)接收模块的作用是把收到的串行数据转换成并行数据进行输出

图5接收器引脚图

resetr(输入):

复位信号;

bclkr(输入):

输入时钟;

rxdr(输入):

串行数据输入信号;

rbuf[7..0](输出):

并行数据输出总线;

r_ready(输出):

数据接收完毕信号。

串行接收模块框图如图6,程序在检测到起始位后(rxdr由‘1’跳变到‘0’),计数持续8个接收时钟采样仍然是低电平后,开始接收串行数据,当采样计数器计数终止后,因此数据已移位输入RSR。

最后对高电平进行检测,检测到正确的停止位后说明本帧数据接收完毕。

将数据转存在数据寄放器RBR中,串/并转换后,输出8位并行数据rbuf[7..0]。

其中,RBR的状态可通过引脚r_ready来表示。

r_ready输出高电平‘1’表示数据接收有效。

图6接收模块工作框图

2)接收模块状态机

接收状态机一共有5个状态:

等待起始位R_START、求中点R_CENTER、等待采样R_WAIT、采样R_SAMPLE、停止位接收R_STOP。

Rxd_sync=0

r_start

rxd_sync=0

xd_sync

r_center

r_stop

Count=“1110”

rcnt=framlenr

Count=“0100”

r_sample

r_wait

count=“1110”

rcnt≠framlenr

 

图7接收器状态机ASM图

 

3)接收模块VHDL代码:

LIBRARYIEEE;

USErecieveris

Generic(framlenr:

integer:

=8);

port(

rxdr:

instd_logic;

bclkr:

instd_logic;

resetr:

instd_logic;

r_ready:

outstd_logic;

rbuf:

outstd_logic_vector(7downto0)

);

endentity;

architectureBehavioralofrecieveris

typestatesis(r_start,r_center,r_wait,r_sample,r_stop);--概念各子状态

signalstate:

states:

=r_start;

signalrxd_sync:

std_logic;

begin

pro1:

process(rxdr)

begin

ifrxdr='0'thenrxd_sync<='0';

elserxd_sync<='1';

endif;

endprocess;

pro2:

process(bclkr,resetr,rxd_sync)--主控时序、组合进程

variablecount:

std_logic_vector(3downto0);--概念中间变量

variablercnt:

integer:

=0;

variablerbufs:

std_logic_vector(7downto0);

begin

ifresetr='1'thenstate<=r_start;count:

="0000";--复位

elsifrising_edge(bclkr)then

casestateis

whenr_start=>--状态1,等待起始位

ifrxd_sync='0'then

state<=r_center;

r_ready<='0';

rcnt:

=0;

else

state<=r_start;

r_ready<='0';

endif;

whenr_center=>--状态2,求出每位的中点

ifrxd_sync='0'then

ifcount="0100"then

state<=r_wait;count:

="0000";

else

count:

=count+1;

state<=r_center;

endif;

else

state<=r_start;

endif;

whenr_wait=>--状态3,等待状态

ifcount>="1110"then

count:

="0000";

ifrcnt=framlenrthen

state<=r_stop;

else

state<=r_sample;

endif;

else

count:

=count+1;

state<=r_wait;

endif;

whenr_sample=>--状态4,数据位采样检测

rbufs(rcnt):

=rxd_sync;

rcnt:

=rcnt+1;

state<=r_wait;

whenr_stop=>--状态5,输出帧接收完毕信号

r_ready<='1';

rbuf<=rbufs;--并行输出

state<=r_start;

whenothers=>state<=r_start;

endcase;

endif;

endprocess;

endBehavioral;

(三)数码管显示模块

1.

图8数码管显示模块引脚图

chuankou_in[7..0]:

并行输入8位数据

led1:

连接led灯,当温度超过阀值(设置为30摄氏度)时点亮

shcp:

数据传输操纵,上升沿到来时ser_data向数码管发送一名数据

stcp:

ser_data:

串行发送chuankou_in[]输入的数据

 

ser_data向数码管发送16位数据,高8位是数码管选通段,低8位操纵数码管显示的数字。

2.数码管显示模块代码

libraryieee;

use;

useshumaguanis

port(clk:

instd_logic;

chuankou_in:

instd_logic_vector(7downto0);

led1:

outstd_logic;--temperature>30thenlightled1

stcp:

outstd_logic;

shcp:

outstd_logic;

ser_data:

outstd_logic);

endentity;

architecturebehavofshumaguanis

signalscore11:

std_logic_vector(7downto0);

signalscore12:

std_logic_vector(7downto0);

signalh:

integerrange1to17:

=1;

signalm:

integerrange0to1:

=0;--fourtube

signaln:

integerrange0to2:

=0;

signaldata:

std_logic_vector(15downto0);

signalcnt1:

integerrange0to3:

=0;

signalchoose:

std_logic_vector(7downto0);

signaltemp:

integer;

signalshiwei:

integer;

signalgewei:

integer;

begin

-----------------数码管译码模块------------------------------

process(clk)

begin

if(rising_edge(clk))then

choose<=chuankou_in;

temp<=conv_integer(choose);--温度值

if(temp>30)then

led1<='1';

endif;

shiwei<=temp/10;

gewei<=temprem10;

caseshiweiis

when0=>score11<="00000011";----数码管显示0

when1=>score11<="";----数码管显示1

when2=>score11<="00100101";----数码管显示2

when3=>score11<="00001101";----数码管显示3

when4=>score11<="";----数码管显示4

when5=>score11<="01001001";----数码管显示5

when6=>score11<="01000001";----数码管显示6

when7=>score11<="00011111";----数码管显示7

when8=>score11<="00000001";----数码管显示8

when9=>score11<="00001001";----数码管显示9

when10=>score11<="00010001";---A

when11=>score11<="00000000";----B.

when12=>score11<="01100011";----C

when13=>score11<="00000010";----D.

when14=>score11<="01100001";----E

when15=>score11<="01110001";----F

whenothers=>score11<="00000000";----数码管显示all

endcase;

casegeweiis

when0=>score12<="00000011";----数码管显示0

when1=>score12<="";----数码管显示1

when2=>score12<="00100101";----数码管显示2

when3=>score12<="00001101";----数码管显示3

when4=>score12<="";----数码管显示4

when5=>score12<="01001001";----数码管显示5

when6=>score12<="01000001";----数码管显示6

when7=>score12<="00011111";----数码管显示7

when8=>score12<="00000001";----数码管显示8

when9=>score12<="00001001";----数码管显示9

when10=>score11<="00010001";---A

when11=>score11<="00000000";----B.

when12=>score11<="01100011";----C

when13=>score11<="00000010";----D.

when14=>score11<="01100001";----E

when15=>score11<="01110001";----F

whenothers=>score12<="00000000";----数码管显示all

endcase;

endif;

endprocess;

---------------数码管动态显示模块--------------------------------

process(clk,score11,score12)

begin

if(rising_edge(clk))then

casemis--m从0到1别离表示选通第1到2个数码管

when0=>

if(n=0)then

data(15downto8)<="";--data的高8位是数码管选通段,选通第三个数码管

data(7downto0)<=score11(7downto0);--data的低8位是记录比分

n<=n+1;

elsif(n=1)then

stcp<='0';--stcp是并行输出时钟

shcp<='0';--shcp是移位时钟

ser_data<=data(0);

n<=n+1;

else

shcp<='1';--移位时钟上升沿到了,那么输入一个数据

data<=data(0)&data(15downto1);--data右移一名

ifh=16then--h是移位次数

h<=h+1;

elsifh=17then

stcp<='1';--并行输出时钟上升沿到了,把16位数据导入完毕

cnt1<=cnt1+1;

ifcnt1=3then

m<=m+1;

cnt1<=0;

n<=0;

h<=1;

endif;

else

n<=n-1;

h<=h+1;

stcp<='0';

endif;

endif;

when1=>

ifn=0then

data(15downto8)<="";--data的高8位是数码管选通段,选通第4个数码管

data(7downto0)<=score12(7downto0);--data的低8位是记录比分

n<=n+1;

elsifn=1then

stcp<='0';--stcp是并行输出时钟

shcp<='0';--shcp是移位时钟

ser_data<=data(0);

n<=n+1;

else

shcp<='1';

data<=data(0)&data(15downto1);--data右移一名

ifh=16then--h是移位次数

h<=h+1;

elsifh=17then

stcp<='1';

cnt1<=cnt1+1;

ifcnt1=3then

m<=0;--m<=m+1;

cnt1<=0;

n<=0;

h<=1;

endif;

else

n<=n-1;

h<=h+1;

stcp<='0';

endif;

endif;

endcase;

endif;

endprocess;

四、仿真分析

1.波特率发生器仿真:

系统时钟周期设为20ns,分频系数设为10,取得的仿真结果如图9。

图9波特率发生器仿真波形图

由仿真波形图能够取得,每过十个时钟周期就输出一个完整的波特率周期,仿真结果与设计预期相符合

2.接收模块仿真

五、实物展现

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

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1