基于FPGA的VHDL语言温度控制Word文件下载.docx
《基于FPGA的VHDL语言温度控制Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于FPGA的VHDL语言温度控制Word文件下载.docx(25页珍藏版)》请在冰点文库上搜索。
键盘模块的脉冲输入来自分频模块。
其中,输入端口为两位二进制数,分别接两个按键,来对预设温度进行加减调控。
输出有两个端口,xianshi端口作为保留端口,存储着当前预设温度的数值,可外接显示设备。
zhi端口为信息传送端口,其存储值为当前预设温度值经由采集电路温度—电压公式换算后的十进制数值。
换算公式如下:
例:
38摄氏度对应的ADC0809输出数据为5*38*256/100/5,得到十进制值为97;
图
(1)
图
(2)
图中,shuru
(1)为温度减按键,shuru(0)为温度加按键,相应的预设温度对应相应的ADC0809输出值,由图2得,当预设温度为38摄氏度时,对应换算后的ADC0809输出数据为97,与计算相符。
键盘输入模块工作正常。
键盘模块的VHDL文件见附录2.
ADC0809控制模块:
经查阅资料,DAC0832需采用直通式,故,将DAC0832的控制语句直接写在了ADC0809的控制语句块。
ile为输出到ADC0832的输入锁存允许信号,cont为ADC0832WR1,WR2,CS等引脚。
Wendu为预设温度的输入引脚。
din为ADC0809转换后的输出信号,dout为受FPGA控制的输出到DAC0832的控制信号。
clk8为来自为频器的时钟信号。
根据ADC0809的时序图,总结出相应的状态转移图,一次来编写控制ADC0809的VHDL语言文件,状态转移图如下:
具体波形仿真图如下:
波形仿真建立在预设温度为38摄氏度的条件下。
前面提到,38摄氏度对应的ADC0809输出值为97,VHDL程序中设定,当ADC0809输入值大于或等于97时(当前温度大于或等于预设温度),FPGA输出到DAC0832的控制信号为0,即停止加热。
当ADC0809输入值小于92(即36摄氏度,与设定温度相差大于两度)时,FPGA输出到DAC0832的控制信号为255,即以最大功率加热。
当ADC0809输入值小于92时,将会细分为5个阶段,即以逐次递减的功率加热。
由图可知,ADC0809工作正常。
ADC0809模块的VHDL仿真文件见附录3.
最后,将三个模块运用元件例化语句连接在一块,并进行电路观察,生成相应的逻辑电路,如下图:
总体波形仿真如下图
波形分析:
刚开始,FPGAjia置1,预设温度逐渐增加,如下图
当温度到达38摄氏度后停止增加,即将38摄氏度作为预设温度,随后,观察FPGAin与FPGAout。
当预设温度为38摄氏度时,输入为97时,对应输出为0,当为92时,对应输出为5,当为96时,对应输出为1,当输入不在92-97之间,输入大于97时,输出为0,输入小与92时,输出为255.观察上图波形仿真,完全符合程序设计。
后面给FPGAjian置1,预设温度会随之降低。
总体的VHDL程序见附录4.
附录1:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfenpinis
port(clk:
instd_logic;
--外部输入时钟源
clk1:
outstd_logic);
endfenpin;
--分频后的时钟源
architectureboffenpinis
signalcount:
std_logic_vector(7downto0);
--信号定义
signalclk2:
std_logic;
begin
process(clk)
begin
if(clk'
eventandclk='
1'
)then--计数脉冲上升沿
if(count="
01000000"
)then
count<
=(others=>
'
0'
);
clk2<
=notclk2;
--当达到64个脉冲时count置0,clk2取反
else
count<
=count+1;
--未达到64脉冲时继续计数;
endif;
endif;
clk1<
=clk2;
——将产生的分频信号给输出端口
endprocess;
endb;
附录2:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityjianpanis
port(clk:
--分频后的时钟输入
shuru:
instd_logic_vector(1downto0);
--输入端,按键加0位,按键减1位
zhi:
outinteger;
--预设温度转化为ADC0809输出值
xianshi:
outinteger);
--当前预设温度
endentity;
architecturebehaofjianpanis
signalx:
integerrange0to200;
--定义信号
process(clk)
begin
caseshuruis--检测是否有输入
when"
01"
=>
x<
=x+1;
--按键加按下,温度+1
10"
if(x=0)thenx<
=0;
--按键减按下,判断温度是否为0
elsex<
=x-1;
--若为0,则依旧为0,否则,温度-1
whenothers=>
=x;
--其他按键情况,温度不变
endcase;
xianshi<
--将温度赋给显示输出端
zhi<
=x*5*256/100/5;
--将温度转化后赋给输出端
endbeha;
附录3:
libraryieee;
entityADC0809is
port(din:
instd_logic_vector(7downto0);
--ADC0809输出的采样数据
clk8:
--时钟信号
eoc:
--ADC0809转换结束指示,高电平有效
ale:
outstd_logic;
--ADC0809地址锁存次信号
ile:
outstd_logic;
--DAC0832数据锁存允许
cont:
--DAC0832控制信号(WR1,WR2,CS,Xfer)
start:
--ADC0809转换启动信号
oe:
--ADC0809数据输出允许信号
wendu:
ininteger;
--温度显示
adda:
--ADC0809信号通道控制位
addb:
addc:
lock0:
--ADC0809观察数据锁存时钟
dout:
outstd_logic_vector(7downto0));
--输出到DAC0832的8位数据
endADC0809;
architecturebehaofADC0809is
typestatesis(st0,st1,st2,st3,st4);
--定义ADC0809工作状态
signalcurrent_state,next_state:
states:
=st0;
signalregl:
std_logic_vector(7downto0);
signalshuchu:
signallock:
std_logic;
adda<
='
;
--地址输入001,选择IN1
addb<
addc<
dout<
=shuchu;
-将处理后的数据传输到输出端口
lock0<
=lock;
--数据传输
ile<
--DAC0832的控制信号
cont<
:
process(current_state,eoc)--状态转移
casecurrent_stateis
whenst0=>
ale<
start<
lock<
oe<
next_state<
=st1;
whenst1=>
=st2;
whenst2=>
if(eoc='
)thennext_state<
=st3;
elsenext_state<
whenst3=>
=st4;
whenst4=>
endprocess;
reg:
process(clk8)
if(clk8'
eventandclk8='
)
thencurrent_state<
=next_state;
--在时钟上升沿改变状态
endprocessreg;
latch1:
process(lock)
iflock='
andlock'
eventthenregl<
=din;
--将输入数据赋给中间变量
endprocesslatch1;
kongzhi:
process(regl)
if(regl<
wendu)then--判断输入数据与预设温度的大小
casewendu-reglis--判断输入数据与预设温度的
00000101"
shuchu<
="
--差值为5时输出控制信号5
00000100"
--差值为4时输出控制信号4
00000011"
--差值为3时输出控制信号3
00000010"
--差值为2时输出控制信号2
00000001"
--差值为1时输出控制信号1
11111111"
--差值大于5时输出255
elseshuchu<
00000000"
--当前温度大于预设温度,输出0
endprocesskongzhi;
附录4:
entityFPGAis
port(clkin:
--定义外部时钟端口
FPGAeoc:
FPGAin:
FPGAout:
outstd_logic_vector(7downto0);
FPGAale:
FPGAjia:
FPGAjian:
FPGAwendu:
FPGAile:
FPGAcont:
FPGAstart:
FPGAoe:
FPGAadda:
FPGAaddb:
FPGAaddc:
outstd_logic);
architecturebehaofFPGAis
componentADC0809is--元件例化声明
endcomponent;
componentfenpinis--元件例化声明
port(clk:
componentjianpanis
port(clk:
xianshi:
signalc:
--定义中间变量
signaln:
integer;
U0:
fenpinportmap(clk=>
clkin,clk1=>
c);
--元件例化
U1:
ADC0809portmap(clk8=>
c,wendu=>
n,din=>
FPGAin,eoc=>
FPGAeoc,dout=>
FPGAout,ale=>
FPGAale,ile=>
FPGAile,
cont=>
FPGAcont,start=>
FPGAstart,oe=>
FPGAoe,adda=>
FPGAadda,addb=>
FPGAaddb,addc=>
FPGAaddc);
U2:
jianpanportmap(clk=>
c,shuru
(1)=>
FPGAjian,shuru(0)=>
FPGAjia,zhi=>
n,xianshi=>
FPGAwendu);
-当达到64个脉冲时count置0,clk2取反
out