基于FPGA的远程温度检测系统.docx
- 文档编号:28666388
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:17
- 大小:53.68KB
基于FPGA的远程温度检测系统.docx
《基于FPGA的远程温度检测系统.docx》由会员分享,可在线阅读,更多相关《基于FPGA的远程温度检测系统.docx(17页珍藏版)》请在冰豆网上搜索。
基于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.接收模块仿真
五、实物展现
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 远程 温度 检测 系统