全天候温度纪录仪的设计与FPGA实现控温项目方案.docx
- 文档编号:10574465
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:26
- 大小:688.72KB
全天候温度纪录仪的设计与FPGA实现控温项目方案.docx
《全天候温度纪录仪的设计与FPGA实现控温项目方案.docx》由会员分享,可在线阅读,更多相关《全天候温度纪录仪的设计与FPGA实现控温项目方案.docx(26页珍藏版)》请在冰豆网上搜索。
全天候温度纪录仪的设计与FPGA实现控温项目方案
全天候温度纪录仪的设计与FPGA实现控温项目方案
一、设计相关
1.1设计题目
全天候温度纪录仪的设计与FPGA实现
1.2选题背景
当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。
它与传统的电子产品在设计上的显著区别是大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。
FPGA开发技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。
基于VerilogHDL语言的设计开发更是灵活多变,容易上手,方便开发人员开发新产品。
时代在发展,人们的物质生活水平在不断提高,新产品、新技术层出不穷,电子技术的发展更是日新月异。
可以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变我们的生活,改变着我们的世界。
一个方便实用的温度计对于大众来说更是生活中不可或缺的一件产品。
美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上最新的QUARTUS开发环境,更具有高性能,开发周期短等特点,十分方便进行电子产品的开发和设计本节将从FPGA嵌入式应用开发技术与温度计发展的客观实际出发,通过对该技术发展状况的了解,以及课题本身的需要,指出研究基于FPGA的芯片系统与设计——全天候温度记录仪的设计与实现的必要性。
1.3设计要求
本设计要求设计一个温度计,通过温度传感器(DS18B20)周期的测量温度数据,同时将数据存储在EEPROMAT24C02中,在需要读取数据温度纪录时,读出温度纪录至板载LCD(1602)液晶显示器显示。
二、系统设计
2.1系统设计图
图2-1系统设计图
2.2系统设计说明
本设计是基于FPGA的温度记录仪,整体系统设计如下,首先由FPGA控制器驱动DS18B02温度传感器对当前温度进行周期性采集,并且对采集到的数据进行处理,然后存入EEPROMAT24C02只读存储器,最后利用LCD1602液晶显示屏进行显示。
同时本系统通过向用户提供按键,方便用户读取历史温度记录。
三、硬件设计
3.1FPGA简介
3.11FPGA芯片的介绍
FPGA是现场可编程门阵列(FieldProgrammableGateArray)的简称,与之相应的CPLD是复杂可编程逻辑器件(ComplexProgrammableLogicDevice)的简称,两者的功能基本相同,只是实现原理略有不同,所以有时可以忽略这两者的区别,统称为可编程逻辑器件。
3.12FPGA基本结构
FPGA具有可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。
这3种可编程电路是:
可编程逻辑模块、输入/输出模块(IOB--I/OBlock)和互连资源。
可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
(1)CLB是FPGA的主要组成部分。
图3-1是CLB基本结构框图,它主要由逻辑函数发生器、触发器、数据选择器等电路组成。
CLB中3个逻辑函数发生器分别是G、F和H,相应的输出是G’、F’和H’。
G有4个输入变量G1、G2、G3和G4;F也有4个输入变量F1、F2、F3和F4。
这两个函数发生器是完全独立的,均可以实现4输入变量的任意组合逻辑函数。
逻辑函数发生器H有3个输入信号;前两个是函数发生器的输出G’和F’,而另一个输入信号是来自信号变换电路的输出H1。
这个函数发生器能实现3输入变量的各种组合函数。
这3个函数发生器结合起来,可实现多达9变量的逻辑函数。
CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。
这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。
CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。
F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。
另一方面,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。
(2)输入/输出模块IOB。
IOB提供了器件引脚和内部逻辑阵列之间的连接。
它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。
每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。
当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。
缓冲器的输出分成两路:
一路可以直接送到MUX,另一路经延时几纳秒(或者不延时)送到输入通路D触发器,再送到数据选择器。
通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。
图3-1CLB基本结构
当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:
一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。
IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通VCC、地线或者不接通,用以改善输出波形和负载能力。
(3)可编程互连资源IR。
可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。
3.13FPGA一般设计流程
图3-2FPGA设计流程图
3.2LCD1602液晶显示
3.21LCD1602实物显示:
图3-3LCD1602实物图
3.22功能:
用来显示当前的温度值,和显示查询的温度值。
3.23接口信号说明:
表3-1接口信号表
3.24时序图
图3-4时序图
3.25LCD1602指令
1)0X38设置为16*2显示,5*7点阵,8位数据接口
2)0X0C说明这里0C表示的是开显示,不显示光标,光标不显示,完整描述如下:
指令码:
00001DBC
D=1开显示D=0关显示C=1显示光标C=0不显示光标
B=1光标闪烁B=0光标不闪烁
3.3DS18B20温度传感器
3.31DS18B20实物图
图3-5DS18B20实物图
3.32功能:
采集当前周围温度信息值。
3.33DS18B20接口引脚信息
表3-2接口引脚图
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
3.34DS18B20的读写操作
图3-6写操作
写时隙分为写"0"和写"1",时序如图,在写数据时间间隙的前15us总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在15-60us,采样时间内如果控制器将总线拉高则表示写1,如果控制器将总线拉低则表示写0。
每一位的发送都应该有一个至少15us的低电平起始位随后的数据0或1应该在45us内完成。
整个位的发送时间应该保持在60-120us,否则不能保证通信的正常。
3.35DS18B20的读操作
图3-7读操作
读时隙时也是必须先由主机产生至少1us的低电平,表示读时间的起始。
随后在总线被释放后的15us中DS18B20会发送内部数据位。
注意必须要在读间隙开始的15us内读数据为才可以保持通信的正确。
通信时,字节的读或写是从高位开始的,即A7到A0。
控制器释放总线,也相当于将总线置1。
3.4AT24C02读写模块
3.41IIC总线协议简介
IIC总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。
IIC总线在传送数据过程中共有三种类型信号,它们分别是:
开始信号、结束信号和应答信号。
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据;
结束信号:
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据;
应答信号:
接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收
到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
3.42AT24C02简介
AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,该器件通过IIC总线接口进行操作。
通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到IIC总线上。
AT24C02的存储容量为2KB,内容分成32页,每页8B,共256B,操作时有两种寻址方式:
芯片寻址和片内子地址寻址。
芯片寻址:
AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。
其中A2,A1,A0可编程地址选择位。
A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。
R/W为芯片读写控制位,该位为0,表示芯片进行写操作。
片内子地址寻址:
芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。
对AT24C02的基本操作有字节写,连续读。
操作时序如下:
图3-8字节写
图3-9连续读
3.43模块驱动方案:
在主模块里例化了3个子模块,简单说一下各个模块的功能:
串口发送模块:
负责将FPGA通过IIC接口读取AT24C02的数据通过串口发送给PC,这样我们就可以通过串口调试助手查看读到的数据与写入的数据是否一致来调试。
IIC控制命令产生模块:
负责发送控制命令如连续读、随机读、字节写及页写等给IIC发送与接收模块,该模块不与AT24C02直接打交道。
IIC发送与接收模块:
根据接收到IIC控制命令产生模块发送的控制命令来操作AT24C02,该模块与AT24C02直接打交道。
3.5按键模块设计
K1复位键:
按下复位键所有模块进入复位状态。
E2PROMAT24C02不清零。
K2上翻页:
查询上一个计数周期的采集值。
K3下翻页:
查询下一个计数周期的采集值。
以下是按键和复位电路图
图3-10按键图图3-11复位图
四、软件设计
4.1QuartusII软件介绍
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
软件界面如图:
图4-1软件界面图
4.2系统架构图
图4-2系统架构图
4.3系统控制器
4.31作用
主要负责各个模块复位与启动,数据采集与处理以及任务调度等工作。
当出现复位信号时,所有模块进入复位状态,但AT24C02不清零。
针对AT24C02的数据可以采用上翻页和下翻页组合按键,同时按下进行清零。
4.32实现方法
(1)、做出各模块驱动(部分代码见‘代码附录’)。
(2)、制作计数器
当产生周期性信号时,控制器读取DS18B20数据,在控制器内部进行处理,将处理完的结果送入E2PROM进行存储,同时送入LCD1602进行显示。
当按键信号出现时,分为以下两种。
1、复位信号,上面已经解释,不再赘述;
2、K2和K3单个出现信号,若没有周期信号,直接读取E2PROM数据,送入LCD1602显示;若有周期信号,进行等待,固定等待1S,重复上述工作3、当K2或K3同时按下时,无需判断周期性信号,直接清零。
控制器向ROM发送操作指令,进行温度转换,读写操作,周期性数据采集使用计数器产生周期性采集信号,具体周期时间暂定为5分钟。
4.4系统调试
在系统调试时,我们使用的是Altera公司的CycloneIVEP4CE40F23I7。
在本系统中用到复位电路、电源电路、时钟电路、JTAG下载电路、DS18B20传感器电路、1602LCD液晶显示屏和AT24C02存储器等主要电路。
具体的硬件调试过程中,有很多细节时要注意,首先插上JTAG下载线,然后打开系统的电源。
因为系统的时钟频率直接影响本设计的各个模块的正常运行,所以一定要把时钟选正确。
做好准备工作以后,系统上电,使用QuartusII选取EP4CE40F23I7型的FPGA器件,进行编译。
编译之后,将综合生成的配置文件使用JTAG下载到开发板上。
然后进行实物验证:
上电后,各个模块正常工作,LCD1602显示温度值,五分钟更新一次。
按下K1键各个模块复位,此时AT24C02不清零,K2和K3同时按下模块复位和AT24C02清零。
与预期基本相同,符合题目要求。
五、代码附录
5.1顶层模块
moduleTemperate(
CLK,
RST_n,
K1,
K2,
K3,
LCD_DATA,
LCD_RW,
LCD_RS,
LCD_EN,
LCD_B,
one_wire;
Tem,
SCL,
SDA,
LED,
TXD
)
inputCLK;
inputRST_n;
inputK1;
inputK2;
inputK3;
output[7:
0]LCD_DATA;
outputLCD_RW;
outputLCD_RS;
outputLCD_EN;
outputLCD_B;
reg[7:
0]LCD_DATA;
regLCD_RW;
regLCD_RS;
regLCD_EN;
inoutone_wire;
output[15:
0]Tem;
inoutSDA;
outputSCL;
outputLED;
outputTXD;
assignLCD_B=1;
LCD1602U0(
.CLK(CLK),
.RST_n(RST_n),
.LCD_RW(LCD_RW),
.LCD_RS(LCD_RS),
.LCD_EN(LCD_EN),
.LCD_B(LCD_B),
.LCD_DATA(LCD_DATA)
);
DS18B20U1(
.CLK(CLK),
.RST_n(RST_n),
.Tem(Tem)
);
wire[7:
0]wr_data;
wire[7:
0]wr_rd_addr;
wire[7:
0]data_out;
AT24C02_CtrlU2(
.CLK50M(CLK),
.RST_n(RST_n),
.SDA(SDA),
.SCL(SCL),
.LED(LED),
.TXD(TXD)
);
endmodule
5.2LCD驱动部分代码
modulelcm(CLOCK_50,LCD_DATA,LCD_RW,LCD_RS,LCD_EN,LCD_BLON);
inputCLOCK_50;
output[7:
0]LCD_DATA;
outputLCD_RW;
outputLCD_RS;
outputLCD_EN;
outputLCD_BLON;
reg[7:
0]LCD_DATA;
regLCD_RW;
regLCD_RS;
regLCD_EN;
regclk_1k=1'b0;
reg[20:
0]counter=0;
reg[10:
0]counter1=0;
assignLCD_BLON=1;
always@(posedgeCLOCK_50)
if(counter==25000)
begin
clk_1k<=~clk_1k;
counter<=0;
end
elsecounter<=counter+1;
always@(posedgeclk_1k)//
begin
if(counter1<1023)
counter1<=counter1+1;
casex(counter1)
400:
begin
LCD_DATA<=8'b00111000;//0x38设置显示模式
LCD_RW<=1'b0;
LCD_RS<=1'b0;
end
401:
LCD_EN<=1'b1;
410:
//0x0c开显示关光标
begin
LCD_DATA<=8'b00001100;
LCD_RW<=1'b0;
LCD_RS<=1'b0;
end
411:
LCD_EN<=1'b1;
420:
begin//0x01清屏幕
LCD_DATA<=8'b00000001;
LCD_RW<=1'b0;
LCD_RS<=1'b0;
end
421:
LCD_EN<=1'b1;
430:
begin//0x06读或者写后自动加1
LCD_DATA<=8'b00000110;
LCD_RW<=1'b0;
LCD_RS<=1'b0;
end
431:
LCD_EN<=1'b1;
440:
begin//0xc0定位到第二行
LCD_DATA<=8'b11000000;
LCD_RW<=1'b0;
LCD_RS<=1'b0;
end
441:
begin
LCD_EN<=1'b1;
ack<=1;
end
………………//根据数字的ASCII码值显示数据
………………
631:
LCD_EN<=1'b1;
default:
LCD_EN<=1'b0;
endcase
end
endmodule
5.3DS18B20驱动模块
moduleTemperature(
inputclk,//50MHz时钟
inputrst_n,//异步复位
inoutone_wire,//One-Wire总线
output[15:
0]temperature//输出温度值
);
regrst_n;
reg[19:
0]count;
always@(posedgeclk)
begin
if(count<20'h80000)
begin
rst_n<=1;
count<=count+1;
end
elseif(count<20'h8ffff)
begin
rst_n<=0;
count<=count+1;
end
else
rst_n<=1;
end
//++++++++++++++++++++++++++++++++++++++
//分频器50MHz->1MHz开始
//++++++++++++++++++++++++++++++++++++++
…………
//--------------此处省略分频部分的代码-------------
…………
//分频器50MHz->1MHz结束
//--------------------------------------
//延时模块的使用
//++++++++++++++++++++++++++++++++++++++
//延时模块开始
//++++++++++++++++++++++++++++++++++++++
reg[19:
0]cnt_1us;//1us延时计数子
regcnt_1us_clear;//请1us延时计数子
always@(posedgeclk_1us)
if(cnt_1us_clear)
cnt_1us<=0;
else
cnt_1us<=cnt_1us+1'b1;
//--------------------------------------
//延时模块结束
//++++++++++++++++++++++++++++++++++++++
//DS18B20状态机开始
//++++++++++++++++++++++++++++++++++++++
//格雷码
parameterS00=5'h00;
parameterS0=5'h01;
parameterS1=5'h03;
parameterS2=5'h02;
parameterS3=5'h06;
parameterS4=5'h07;
parameterS5=5'h05;
parameterS6=5'h04;
parameterS7=5'h0C;
parameterWRITE0=5'h0D;
parameterWRITE1=5'h0F;
parameterWRITE00=5'h0E;
parameterWRITE01=5'h0A;
parameterREAD0=5'h0B;
parameterREAD1=5'h09;
parameterREAD2=5'h08;
parameterREAD3=5'h18;
reg[4:
0]state;//状态寄存器
regone_wire_buf;//One-Wire总线缓存寄存器
reg[15:
0]temperature_buf;//采集到的温度值缓存器(未处理)
reg[5:
0]step;//子状态寄存器0~50
reg[3:
0]bit_valid;//有效位
always@(posedgeclk_1us,negedgerst_n)
begin
if(!
rst_n)
begin
one_wire_buf<=1'bZ;
step<=0;
state<=S00;
end
else
begin
case(state)
S00:
begin
temperature_buf<=16'h001F;
state<=S0;
end
S0:
begin//初始化
cnt_1us_clear<=1;
one_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全天候 温度 纪录 设计 FPGA 实现 项目 方案