Verilog HDL 空调温度控制器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计题目:家用空调温度控制器
一设计题目的要求:
家用空调温度控制器的功能为:
1、室内温度可由按键设置,温度的设置范围为20度至39度。
2、有加热和制冷两种工作模式。
当空调工作在加热模式时,如果室温低于设定温度,空调加热,反之,不加热;当空调工作于制冷模式时,如果室温高于设定温度,空调制冷,反之空调不制冷。
3、对室内温度用两位数码管进行实时显示。
二设计方案及其工作原理:
总的设计框图如下:
本电路由控制核心cpu、按键、4位锁存器、数码管7位译码器电路组成。
cpu:负责数据接收;室温和设定温度的比较;工作模式选择;显示数据的输出;加热制冷信号的控制;报警信号的输出等。
按键:负责设定标准温度,设置温度的升高与降低。
锁存器:将cpu输出的显示信号锁存,防止干扰,将信号送给译码器。
译码器:将BCD码译成数码管显示用的高低电平。
工作原理
在reset信号作用下,设定温度寄存器赋初值,初值为26度,通过add (温度升)和down(温度减)来步进调整设定温度(步进为一)。
按键(key)模块通过seta和setb输出端口将设定温度传给cpu。
cpu接收到设定温度后将其与由温度传感器传来的室温xy比较,将比较结果标志存在寄存器(flag)中。
读取用户工作模式(mod=1时为加热,mod=0时为制冷)。
在加热模式状态下,根据flag的值给出加热控制寄存器heat
赋值;在制冷模式状态下,根据flag的值给制冷状态寄存器cool赋值。
cpu还将设置温度与设置温度范围比较,将比较结果标志存在报警寄存器flag_high(超上界寄存器)和flag_low(超下界寄存器)。
cpu还将室温和设定温度分别存放在室温寄存器和设定温度寄存器中。
最后,cpu将寄存器的值通过各端口输出。
各锁存器将数据锁存后在时钟信号的作用下将锁存信号输出给译码器,译码器再把BCD码转换成数码管显示的高低电平,数码管显示出室温和设置温度。
Led灯接到有效信号后点亮,指示设定温度是否越界(led_settoohigh 表示设置温度过高;led_settoolow表示设置温度过低)。
三各单元电路设计:
1、cpu设计
cpu框图如下:
disp_outx:室温十位输出显示
disp_outy:室温个位输出显示
disp_outa:设置十位输出显示
disp_outb:设置个位输出显示
cool:制冷输出信号
heat:加热输出信号
led_settoohigh:设定温度超越上限报警
led_settoolow:设定温度超越下限报警
x:室温十位输入
y:室温个位输入
a:设定温度十位输入
b:设定温度个位输入
mod:用户加热制冷模式选择
clk:时钟脉冲
flag:室温和设置温度比较标志位寄存器
flag_high:设置温度超越上界标志位寄存器
flag_low:设置温度超越下界标志位寄存器
2、按键(key)设计
按键(key)框图如下:
seta 输出温度设定十位
setb 输出温度设定个位
add 设定温度加一
down 设定温度减一
clk 时钟信号
reset复位信号(用于寄存器赋初值)
3、锁存器设计
锁存器框图如下:
data:锁存数据输入
qout:锁存数据输出
clk:时钟信号
4、译码器设计
译码器框图如下:
D4:译码器BCD码输入信号
a,b,c,d,e,f,g:译码器输出信号(输入给数码管)
四模拟仿真验证及结果分析:
因整体仿真验证结果不易说明效果,故将各模块仿真结果予以分析。
1、cpu仿真结果
cpu仿真结果如图:
分析:前两个周期,用户模式为加热模式(mod=1)室温<设定温度,加热(heat=1);5~6周期用户模式为制冷(mod=0),室温>设定温度,制冷(cool=1);第7~9周期设置温度<20度,超越下界报警(led_settoolow=1);第10~12周期,设置温度>39度,超越上界报警(led_settoohigh=1)。
2、键盘仿真结果
键盘仿真结果如图:
分析:前2周期,reset=1,设置温度被设为26度,第5~10周期,add=1,设置温度每周期递增一;第12~20周期down=1,设置温度每周期递减一,21~27周期,没有增加和减少信号,温度稳定在24度。
3、锁存器仿真结果
锁存器仿真结果如图:
分析:如图,在每个时钟的上升沿将data中数据从qout输出。
4、译码器仿真结果
译码器仿真结果如图:
分析:D4输入8时,abcdefg为:1111111,D4输入为7时,abcdefg为:1110000,符合数码管显示规则。
下图为整个顶层结果仿真图(部分),仅供参考:
五总结体会:
在这次课程设计的过程中,遇到了很多的问题;但也学习到了很多平时上课不曾接触到的东西、不懂的知识。
了解到了具体的大工程是如何生成的、进一步掌握并熟悉了verilog HDL语言,同时也学会了同学之间相互的团结和协作。
通过本次课程设计,我懂得一个工程,必须先要有一个总体的方案,心中要明确设计的目的,如何才能达到这个目的;然后划分模块,将复杂抽象的问题具体简单化;接着逐个设计每个模块,调试,分析,再调试,直到完成各个模块的要求为止;最终,将各个模块整合起来,完成整体模块,完成工程设计。
可谓受益匪浅……。
附录:程序源代码
/*温度控制cpu*/
//disp_outx 室温十位输出显示
//disp_outy 室温个位输出显示
//disp_outa 设置十位输出显示
//disp_outb 设置个位输出显示
//cool 制冷输出信号
//heat 加热输出信号
//led_settoohigh 设定温度超越上限报警
//led_settoolow 设定温度超越下限报警
//x 室温十位输入
//y 室温个位输入
//a 设定温度十位输入
//b 设定温度个位输入
//mod 用户加热制冷模式选择
//clk 时钟脉冲
//flag 室温和设置温度比较标志位寄存器
//flag_high 设置温度超越上界标志位寄存器
//flag_low 设置温度超越下界标志位寄存器
module cpu(disp_outx, disp_outy, disp_outa, disp_outb, cool, heat, led_settoohigh, led_settoolow,x,y,a,b,mod,clk);
output[3:0] disp_outx, disp_outy, disp_outa, disp_outb;
output cool, heat, led_settoohigh, led_settoolow;
input[3:0] x,y,a,b;
input mod,clk;
reg[3:0] disp_outx, disp_outy, disp_outa, disp_outb;
reg[1:0] flag;
reg flag_high,flag_low, cool, heat, led_settoohigh, led_settoolow;
always@(posedge clk)
begin
begin /*设定温度上下界标志位判断*/
if(a>=4)
begin
flag_high =1;
flag_low=0; //flag_high=1 设定温度超出上界
end
else if(a<2)
begin
flag_low=1; //flag_low=1 设定温度超出下界
flag_high =0;
end
else
begin
flag_low =0;
flag_high=0; // flag_low =0 flag_high=0 设定温度在正常范围内
end
end
begin /*室温与设置温度比较标志位判断*/
if(x>a)
flag=2'b01; //flag=01 室温高于设定温度else if(x<a) //flag=10 室温低于设定温度
flag=2'b10;
else
begin
if(y>b)
flag=2'b01;
else if(y<b)
flag=2'b10;
else
flag=2'b11; //flag=11 室温等于设定温度
end
end
begin /*制冷、加热输出寄存器赋值*/
if(mod)
begin //mod=1 加热模式下
if((flag==2'b01) || (flag==2'b11))
begin
heat=0; //停止加热
cool=0;
end
else if(flag==2'b10)
begin //加热
heat=1;
cool=0;
end
end
else //mod=0 制冷模式下
begin
if((flag==2'b10) || (flag==2'b11))
begin
cool=0; //停止制冷
heat=0;
end
else if(flag==2'b01)
begin
cool=1; //制冷
heat=0;
end
end
end
begin /*显示、报警输出寄存器赋值*/
if(!flag_high&&!flag_low) //室温和设定温度显示寄存器赋值
begin
disp_outx=x;
disp_outy=y;
disp_outa=a;
disp_outb=b;
led_settoohigh =0;//led_settoohigh =0 led_settoolow=0 设定温度在正常范围
led_settoolow=0;
end
else if(flag_high&&!flag_low) //设定温度超越上界报警寄存器赋值
begin
led_settoohigh =1; // led_settoohigh =1 设定温度超越上界
led_settoolow=0;
end
else if(!flag_high&&flag_low) //设定温度超越下界报警寄存器赋值
begin
led_settoohigh =0;
led_settoolow=1; //led_settoolow=1 设定温度超越下界
end
end
end
endmodule
/*按键输入设定温度*/
//seta 输出温度设定十位
//setb 输出温度设定个位
//add 设定温度加一
//down 设定温度减一
//clk 时钟信号
//reset复位信号(用于寄存器赋初值)module key(seta,setb,add,down,clk,reset); output[3:0] seta,setb;
input add,down,clk,reset;
reg[3:0] seta,setb;
always@(posedge clk or posedge reset) begin
if(reset) /*寄存器赋初值*/ begin
seta=2;
setb=6;
end
if(add) /*寄存器加一*/
begin
if(setb==9)
begin
setb=0;
seta=seta+1;
end
else
setb=setb+1;
end
else if(down) /*寄存器减一*/ begin
if(setb==0)
begin
setb=9;
seta=seta-1;
end
else
setb=setb-1;
end
end
endmodule
/*4位锁存器*/
//qout 输出信号
//data 输入信号
//clk 时钟信号
module suocunqi(qout,data,clk);
output[3:0]qout;
input[3:0]data;
input clk;
reg[3:0] qout;
always@(clk or data)
begin
if(clk)
qout=data; //在时钟信号作用下输出信号
end
endmodule
/*7位数码管译码器*/
//a,b,c,d,e,f,g, 数据输出
//D4 输出数据
module yimaqi(a,b,c,d,e,f,g,D4);
output a,b,c,d,e,f,g;
input[3:0]D4;
reg a,b,c,d,e,f,g;
always@(D4)
begin
case(D4)
4'd0:{a,b,c,d,e,f,g}=7'b1111110;
4'd1:{a,b,c,d,e,f,g}=7'b0110000;
4'd2:{a,b,c,d,e,f,g}=7'b1101101;
4'd3:{a,b,c,d,e,f,g}=7'b1111001;
4'd4:{a,b,c,d,e,f,g}=7'b0110011;
4'd5:{a,b,c,d,e,f,g}=7'b1011011;
4'd6:{a,b,c,d,e,f,g}=7'b1011111;
4'd7:{a,b,c,d,e,f,g}=7'b1110000;
4'd8:{a,b,c,d,e,f,g}=7'b1111111;
4'd9:{a,b,c,d,e,f,g}=7'b1111011;
default:{a,b,c,d,e,f,g}=7'bx; //输出任意态
endcase
end
endmodule。