EDA洗衣机控制器讲解.docx
- 文档编号:26927190
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:23
- 大小:214.24KB
EDA洗衣机控制器讲解.docx
《EDA洗衣机控制器讲解.docx》由会员分享,可在线阅读,更多相关《EDA洗衣机控制器讲解.docx(23页珍藏版)》请在冰豆网上搜索。
EDA洗衣机控制器讲解
东北石油大学
课程设计
课程EDA技术课程设计
题目洗衣机控制器
院系
专业班级
学生姓名谭伟
学生学号
指导教师
2017年3月3日
东北石油大学课程设计任务书
课程EDA技术课程设计
题目洗衣机控制器
专业姓名谭伟学号
主要内容、基本要求、主要参考资料等
主要内容:
设计一个洗衣机控制器,要求洗衣机有正转、反转、暂停三种状态。
设定洗衣机的工作时间,要洗衣机在工作时间内完成:
定时启动正转20秒暂停10秒反转20秒暂停10秒定时未到回到“正转20秒暂停10秒……”,定时到则停止,同时发出提示音。
基本要求:
1、设计一个电子定时器,控制洗衣机作如下运转:
定时启动正转20秒暂停10秒反转20秒暂停10秒定时未到回到“正转20秒暂停10秒……”,定时到则停止;
2、若定时到,则停机发出音响信号;
3、用两个数码管显示洗涤的预置时间(分钟数),按倒计时方式对洗涤过程作计时显示,直到时间到停机;洗涤过程由“开始”信号开始;
4、三只LED灯表示“正转”、“反转”、“暂停”三个状态。
主要参考资料:
[1]夏宇闻.Verilog数字系统设计(第2版)[M].北京:
北京航空航天大学出版社,2008.
[2]潘松.EDA技术实用教程-VerilogHDL版(第五版)[M].北京:
科学出版社,2010.
[3]阎石.数字电子技术基础(第五版)[M].北京:
高教出版社,2006.
完成期限2017.3.3
指导教师
专业负责人
2017年2月27日
一、设计思想
1.基本原理
(1)本课程设计编程采用模块化的硬件描述语言VerilogHDL进行设计。
(2)洗衣机控制器的设计主要是时序控制和定时器的设计。
(3)使用分频模块输出1Hz方波,给定时器设定秒数每1s自加1的信号。
当开始信号发出后,秒数开始自加,至59时置0,并给分钟进位,由于倒计时显示分钟数,将分钟数减一再显示,过程由定时时间模块完成。
将分钟数显示由数码管显示模块实现。
同时定时器的值输入到时序控制模块由此可以控制洗衣机的正转、反转、暂停工作方式及工作状态灯。
2.设计框图
本课程设计框图由四个部分组成:
开始信号、预置时间、数码管显示、洗衣机工作及时间脉冲。
框图如图1下:
数码管显示
图1洗衣机的设计框图
二、设计步骤和调试过程
1.模块设计及相应模块代码
(1)分频模块
本课程设计选用器件系列Family:
CycloneIVE
芯片选择Avaliabledevices:
EP4CE115F29C7(信号频率固定为50MHz)
分频模块的作用是将50MHz分频为1Hz,即周期为1s,用于计数。
模块代码如下:
modulefp(clk_in,clk_out);//clk_in为芯片输出频率,clk_out为1Hz
inputclk_in;
outputregclk_out;
reg[31:
0]q;
initialq=0;
always@(posedgeclk_in)
if(q==25000000)beginclk_out<=1;q<=q+1;end
elseif(q==50000000)beginclk_out<=0;q<=0;end
elseq<=q+1;
endmodule
(2)定时时间自减部分
写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。
assignclks0=clks&&start;//检测分频信号clks和开始信号start
always@(posedgeclks0)
if(s==59)begins<=0;clkm<=1;end
elseif((m==0)&&(s==0))s<=0;//停机
else
begin
s<=s+1;.
clkm<=0;
end
assignclkm0=clkm||!
sm;//进位信号clkm和输入分钟数sm
always@(posedgeclkm0)
beginm<=m-1;end//定时分钟数自减
用分频模块中的clks信号和开始信号,对计数部分进行控制。
当检测到开始信号为1和时钟信号高电平时,秒数开始累加。
当秒数等于59时,将秒数置0,并且将进位信号置1,用于控制分钟部分。
同时分钟数检测到进位信号为1且预置分钟数不为0,将现有分钟数自减1。
预置分钟数由用户给定,以上则完成定时时间自减模块。
(3)时序控制部分
写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。
always@(posedgeclks0)//检测时钟上升沿
if(start)//检测开始信号
begin
if(((8'h00)<(s+2))&&((s+2)<=8'h14))beginD1=1;D2=0;D3=0;end//0-20s正转
elseif((s+2)<=8'h1e)beginD3=1;D2=0;D1=0;end//20-30s暂停
elseif((s+2)<=8'h32)beginD2=1;D1=0;D3=0;end//30-50s反转
else
beginD3=1;D2=0;D1=0;end//50-59s暂停
end
else
beginD3=0;D2=0;D1=0;end//停机状态
当检测到时钟信号为高电平时,即时间又过1s,判断秒数所属区间确定洗衣机工作方式和工作状态灯。
如果秒数小于20,即洗衣机正转,同时正转状态灯亮;如果秒数大于20并且小于30,即洗衣机暂停,同时暂停状态灯亮;如果秒数大于30小于50,即洗衣机反转,同时反转状态灯亮;如果秒数大于50,即洗衣机暂停,同时暂停状态灯亮。
(4)数码管显示模块
modulem10led(m,s,m1,m0,s0,s1);//将分秒的个位十位分离成两组十六进制数
input[7:
0]m,s;
wire[6:
0]a0,a1,b0,b1;
output[7:
0]s0,s1,m1,m0;
wire[7:
0]seg0,seg1;
assigna0=s%10,a1=s/10;
assign{seg0[7:
4],seg0[3:
0]}={a1[3:
0],a0[3:
0]};
ledm00(.SW(seg0),.HEX1(s1),.HEX0(s0));//秒数显示
assignb0=m%10,b1=m/10;
assign{seg1[7:
4],seg1[3:
0]}={b1[3:
0],b0[3:
0]};
ledm01(.SW(seg1),.HEX1(m1),.HEX0(m0));//显示实时分钟数
endmodule
moduleled(SW,HEX1,HEX0);//将两组十六进制数转码为数码管显示的数值
input[7:
0]SW;
outputreg[6:
0]HEX1,HEX0;
parameterseg0=7'b1000000,
seg1=7'b1111001,
seg2=7'b0100100,
seg3=7'b0110000,
seg4=7'b0011001,
seg5=7'b0010010,
seg6=7'b0000010,
seg7=7'b1111000,
seg8=7'b0000000,
seg9=7'b0010000,
sega=7'b0001000,
segb=7'b0000011,
segc=7'b1000110,
segd=7'b0100001,
sege=7'b0000110,
segf=7'b0001110;
always@(*)
case(SW[3:
0])
4'h0:
HEX0[6:
0]=seg0;
4'h1:
HEX0[6:
0]=seg1;
4'h2:
HEX0[6:
0]=seg2;
4'h3:
HEX0[6:
0]=seg3;
4'h4:
HEX0[6:
0]=seg4;
4'h5:
HEX0[6:
0]=seg5;
4'h6:
HEX0[6:
0]=seg6;
4'h7:
HEX0[6:
0]=seg7;
4'h8:
HEX0[6:
0]=seg8;
4'h9:
HEX0[6:
0]=seg9;
4'ha:
HEX0[6:
0]=sega;
4'hb:
HEX0[6:
0]=segb;
4'hc:
HEX0[6:
0]=segc;
4'hd:
HEX0[6:
0]=segd;
4'he:
HEX0[6:
0]=sege;
default:
HEX0[6:
0]=seg0;
endcase
always@(*)
case(SW[7:
4])
4'h0:
HEX1[6:
0]=seg0;
4'h1:
HEX1[6:
0]=seg1;
4'h2:
HEX1[6:
0]=seg2;
4'h3:
HEX1[6:
0]=seg3;
4'h4:
HEX1[6:
0]=seg4;
4'h5:
HEX1[6:
0]=seg5;
4'h6:
HEX1[6:
0]=seg6;
4'h7:
HEX1[6:
0]=seg7;
4'h8:
HEX1[6:
0]=seg8;
4'h9:
HEX1[6:
0]=seg9;
4'ha:
HEX1[6:
0]=sega;
4'hb:
HEX1[6:
0]=segb;
4'hc:
HEX1[6:
0]=segc;
4'hd:
HEX1[6:
0]=segd;
default:
HEX1[6:
0]=seg0;
endcase
endmodule
数码管显示模块包括将八进制的秒数和分钟数的个位十位分离成两组十六进制数,并将两组十六进制数转码为数码管显示的数值。
模块m10led的作用是分和秒的个位十位分离成两组十六进制数。
模块led将两组十六进制数转码为数码管显示的数值。
可被调用,简化编码。
(5)定时停机音响信号部分
写在顶层文件中,部分代码如下,详见(6)顶层文件源代码。
always@(s,m)
if(m==0&&s==0)
begin
bo=1;
end
elsebo=0;
当检测秒数和分钟数都为0时,即倒计时结束,发出停机音响信号。
(6)顶层文件
moduleWasher(bo,s0,s1,m1,m0,clk,start,sm,D1,D2,D3,m,s);
inputclk,sm,start;
output[6:
0]s0,s1,m1,m0;
outputregbo;
outputregD1,D2,D3;
outputm,s;
wireclks0,clkm0;
regclkm;
reg[7:
0]m,s;
initialbeginm=5;s=0;D1=0;D2=0;D3=0;end
assignclks0=clk&&start;
always@(posedgeclks0)
if(s==59)begins<=0;clkm<=1;end
elseif((m==0)&&(s==0))s<=0;
else
begin
s<=s+1;
clkm<=0;
end
assignclkm0=clkm||!
sm;
always@(posedgeclkm0)
beginm<=m-1;end
always@(posedgeclks0)
begin
if(start)
begin
if(((8'h00)<(s+2))&&((s+2)<=8'h14))beginD1=1;D2=0;D3=0;end
elseif((s+2)<=8'h1e)beginD3=1;D2=0;D1=0;end
elseif((s+2)<=8'h32)beginD2=1;D1=0;D3=0;end
else
beginD3=1;D2=0;D1=0;end
end
else
beginD3=0;D2=0;D1=0;end
end
always@(s,m)
if(m==0&&s==0)
beginbo=1;end
elsebo=0;
m10ledm20(.m(m),.s(s),.m1(m1),.m0(m0),.s0(s0),.s1(s1));
endmodule
顶层文件实现洗衣机控制器的所有功能。
2.仿真及仿真结果分析
(1)分频模块
测试文件代码:
modulefp_vlg_tst();
regclk_in;
wireclk_out;
fpi1(
.clk_in(clk_in),
.clk_out(clk_out)
);
initial
begin
clk_in=0;
end
always
begin
#10000clk_in=~clk_in;
end
endmodule
仿真结果截图如下:
图2分频模块仿真图
结果分析:
将50MHz分频成1Hz,上图可见,实验结果良好。
(2)定时时间自减模块
测试文件代码:
`timescale1us/1ns
modulesettime_vlg_tst();
regclk;
reg[7:
0]sm;
regstart;
wire[7:
0]m;
wire[7:
0]s;
settimei1(
.clk(clk),
.m(m),
.s(s),
.sm(sm),
.start(start)
);
initial
begin
clk=0;
sm=8'h5;
start=1;
end
always
begin
#500000clk=~clk;
end
endmodule
仿真结果截图如下:
图3定时时间自减模块仿真图
结果分析:
预置时间为5min,当秒数进行累加到59时,上图中倒数第二行从8’h05变成8’h04。
即完成自减。
倒数第一行为秒数计数显示;第二行为分钟数计数显示;第二行为时钟信号,即1Hz,用于计数。
第三行为预置时间显示,为8’h05;第四行为开始信号,当开始信号为1时,秒数计数开始。
(3)时序控制模块
测试文件代码:
`timescale1ns/1ps
modulecontrol_vlg_tst();
regeachvec;
reg[7:
0]sec;
regstart;
wireD1;
wireD2;
wireD3;
controli1(
.D1(D1),
.D2(D2),
.D3(D3),
.sec(sec),
.start(start)
);
initial
begin
sec=8'h0;start=1;
end
always
begin
#200sec<=sec+8'h1;
end
endmodule
仿真结果截图如下:
图4时序控制0-20s仿真图
结果分析:
利用秒数大小判断机器工作所属状态。
当秒数在0到20s区间,即洗衣机工作在正转状态,以上截图即为洗衣机正转状态。
第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。
上图中,D1处于高电平,D2和D3处于低电平,此时洗衣机处于正转状态。
图5时序控制20-30s仿真图
结果分析:
利用秒数大小判断机器工作所属状态。
当秒数在20到30s区间,即洗衣机工作在暂停状态,以上截图即为洗衣机暂停状态。
第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。
上图中,D3处于高电平,D1和D2处于低电平,此时洗衣机处于暂停状态。
图6时序控制30-50s仿真图
结果分析:
利用秒数大小判断机器工作所属状态。
当秒数在30到50s区间,即洗衣机工作在反转状态,以上截图即为洗衣机反转状态。
第二行为秒数计数显示;第三行为开始信号,处于高电平状态;第四行为正转状态D1;第五行为反转状态D2;最后一行为暂停状态D3。
上图中,D2处于高电平,D1和D3处于低电平,此时洗衣机处于反转状态。
(5)定时停机音响信号模块
测试文件代码:
`timescale1ns/1ps
modulesound_vlg_tst();
regeachvec;
regm;
regs;
wirebo;
soundi1(
.bo(bo),
.m(m),
.s(s)
);
initial
beginm=1;s=1;end
always
begin
#200m=1;
#200m=0;
#200m=0;
#200m=1;
end
always
begin
#200s=0;
#200s=1;
#200s=0;
#200s=1;
end
endmodule
仿真结果截图如下:
图7定时停机声音信号仿真图
结果分析:
当检测到秒数和分钟数都为0时,停机声音信号触发。
观察上图,第二行为分钟数是否为0信号;第三行为秒数是否为0信号;最后一行为定时停机信号。
当分钟数不为0,并且秒数不为0时,定时停机声音信号不触发;当分钟数不为0,并且秒数为0时,定时停机声音信号不触发;当分钟数不为0,并且秒数为1时,定时停机声音信号不触发;当分钟数为0,并且秒数为0时,定时停机声音信号触发。
3.实验调试结果
以下调试为整体顶层文件调试。
测试文件代码:
`timescale1us/1ns
moduleWasher_vlg_tst();
regeachvec;
regclk;
reg[7:
0]sm;
regstart;
wireD1;
wireD2;
wireD3;
wirebo;
wire[7:
0]m;
wire[6:
0]m0;
wire[6:
0]m1;
wire[7:
0]s;
wire[6:
0]s0;
wire[6:
0]s1;
Washeri1(
.D1(D1),
.D2(D2),
.D3(D3),
.bo(bo),
.clk(clk),
.m(m),
.m0(m0),
.m1(m1),
.s(s),
.s0(s0),
.s1(s1),
.sm(sm),
.start(start)
);
initial
beginclk=0;sm=8'h5;start=1;end
always
begin
#50000clk=~clk;
end
endmodule
仿真结果截图如下:
图8整体仿真初始状态图
图8结果分析:
上图为整体仿真初始状态图。
第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8’h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。
预置时间与剩余分钟数显示相同,都为8’h05;秒数开始在自累加;数码管显示数据时时变化。
由于秒数小于20,即洗衣机正转状态灯D1为高电平,洗衣机运行在正转状态。
图9整体仿真20s处图
图9结果分析:
上图为整体仿真20s处图。
第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8’h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。
当秒数自累加为20时,洗衣机暂停状态灯D3由低电平变为高电平,洗衣机正转状态灯D1由高电平变为低电平,即洗衣机由正转状态转为暂停状态。
图10整体仿真30s处图
图10结果分析:
上图为整体仿真30s处图。
第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8’h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。
当秒数自累加为30时,洗衣机暂停状态灯D3由高电平变低电平,洗衣机反转状态灯D2由低电平变为高电平,即洗衣机由暂停状态转为反转状态。
图11整体仿真59s处图
图11结果分析:
上图为整体仿真59s处图。
第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8’h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。
当秒数自累加为8’h00时,剩余分钟数由8’h05变为8’h04;完成预置分钟数自减。
图12整体仿真停机状态图
图12结果分析:
上图为整体仿真停机处图。
第二行为时钟信号,即1Hz;第三行为预置时间显示,仿真预置时间为8’h05;第四行为开始信号;第五行为洗衣机正转状态灯D1;第六行为洗衣机反转状态灯D2;第七行为洗衣机暂停状态灯D3;第八行为洗衣机停机声音信号BO;第九行为洗衣机分钟数显示;第十行和十一行为洗衣机剩余分钟数数码管显示;第十二行为秒数计数显示;第十三行和十四行为洗衣机剩余秒数数码管显示,可不计。
由于预置时间倒计时完成后,分钟数和秒数都为0,观察上图,可发现BO置高电平,即触发停机声音信号。
剩余分钟数和秒数为8’h00;数码管都显示7’h40;洗衣机状态灯D1、D2和D3都为低电平,即洗衣机不工作。
三、结论
经过这一次的课程设计,自己对FPGA有了更加深入的了解。
在FPGA实践中技能与知识储备都有了更大的提高,也把VerilogHDL语法知识巩固了一下。
同时动手能力也得到了提高。
在做课程设计的过程中,我也遇到了很多问题。
刚开始时,由于对软件不太熟悉和对VerilogHDL语言的生疏,课程设计及编码都进行的很慢。
我就把上课用的《VerilogHDL数字系统设计编程》这本教材看了一遍。
在课程设计中,我遇到了以下问题:
如何给变量输入一个初始值(即洗衣机输入预置时间)、数码管如何显示、利用什么去控制洗衣
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 洗衣机 控制器 讲解