数电课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数电课程设计报告 Document number【SA80SAB-SAA9SYT-SAATC-SA6UT-SA18】
《基于FPGA的洗衣机电机正反转控制
器》
学院:信息与控制工程学院
专业:电子信息工程
班级:
姓名:
学号:
2014年7月
目录
1.设计任务与要求........................................................ . (1)
2.设计思路........................................................ (1)
3.设计原理及方案....................................................................... (2)
4.总结与讨论........................................................................... (14)
一、设计任务及要求:
1.控制洗衣机的电机作如下周期性运转,正转4S――暂停2S――反转4S――暂停2S,用8位七段数码管显示自己学号的后四位(显示在从左边数第一个到第四个数码管上)、定时时间(两位,单位:分钟,显示在第五个和第六个数码管上),剩余时间(两位,单位:分钟,显示在第七个和第八个数码管上
2.洗衣机控制器的工作过程为:
(1)上电后显示自己学号的后四位,在运行中不变;初始洗涤时间为10分钟,在开始前可用S1和S2按键设置总的工作时间,确定洗衣机控制器定时工作时间。
(按下并松开S1定时时间增加一分钟,按下并松开S2定时时间减少一分钟,时间范围为:00~30分钟)
(2)设定好定时时间后,按下并松开S3(按下时S3=0,松开时S3=1),启动控制器,整个系统开始运行;再次按下并松开S3,停止运行;再次按下并松开S3继续运行;按下并松开S4则回到上电初始状态。
其他两个按键不起作用。
到达定时时间后,停止运行,按下并松开S4则回到初始状态,在运行中要显示定时时间和剩余工作时间,当剩余时间为0时,要显示“End”。
在工作过程中用三个LED指示灯指示电机工作状态,正转D1灯亮,反转D2灯亮,暂停D3灯亮,如此反复直至工作时间为0停止(三个LED灯都不亮)。
系统总体框图如下:
二、设计思路
为了便于计时,首先把1000Hz的外部时钟分频为1Hz。
正转时间设为4s,反转设为4s,暂停设为2s,令洗衣机按照正转4s、暂停2s、反转4s、暂停2s 的顺序进行旋转,周期恰好为10秒,而定时时间单位为分钟,因此需要设计分钟计数器和秒计数器。
开发板提供的时钟信号CP频率为1000Hz,应该设计一分频器得到1Hz的时钟信号作为时间计数脉冲。
设计中七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用1000HZ。
为了得到1000Hz信号,必须对输入的时钟信号
50MHZ进行分频。
显示模块共用10个管脚,其中7个用于连接8个数码管的七段LED,还有3个管脚用于选择点亮哪个数码管,每隔很短的一段时间8个数码管交替点亮,依次循环,动态显示,由于人眼的视觉残留,可以观察到连续的测量计数器的计数值。
其原理框图如图所示:
本系统采用层次化、模块化的设计方法,设计顺序为自下向上。
首先实现系统框图中的各子模块,然后由顶层模块调用各子模块(既可以采用原理图,也可以采用Verilog HDL语言)来完成整个系统。
三、设计原理及方案
1.洗衣机点击正反转控制器的设计由由分频模块,模八计数器模块,s1s2s3s4控制电路模块,32位信号产生模块,数据选择器模块,数码管显示模块组成。
FPGA接收命令,控制洗衣机的正转、反转、停机和定时时间为0时显示End的工作状态。
对FPGA芯片的编程采用模块化的Verilog HDL (硬件描述语言)进行设计。
顶层使用原理图实现,底层由Verilog HDL语句实现。
(1)总体框图
(2)功能实现
2.分频器50MHz到1KHz
本模块实现对50MHz到1KHz的分频,1KHz的信号为模八计数器提供时钟信号。
(1)源程序
module lrfenpinqi50M(clk_50M,clk_1000);
input clk_50M;
output clk_1000;
reg clk_1000;
reg [15:0]cnt;
always@(posedge clk_50M)
begin
if(cnt==16'd24999)
begin
clk_1000<=~clk_1000;
cnt<=0;
end
else
cnt<=cnt+1;
end
endmoduleendmodule
(2)元器件
(3)功能仿真
3.分频器1KHz到1Hz
本模块实现对1KHz到1Hz的分频,1KHz的信号为s1s2s3s4控制电路提供时钟信号。
(1)源程序
module lrfenpinqi1000(clk_1000,clk_1);
input clk_1000;
output clk_1;
reg clk_1;
reg [15:0]cnt;
always@(posedge clk_1000)
begin
if(cnt==16'd499)
begin
clk_1<=~clk_1;
cnt<=0;
end
else
cnt<=cnt+1;
end
endmodule
(2)元器件
(3)功能仿真
4.模八计数器
本模块实现显示数码管的动态扫描。
如果采用静态显示,则需要56根线实现,动态则只需要10根。
其输出还作为数据选择器的SEL端输入。
(1)源程序
module lrjishuqi(cp,q);
input cp;
output q;
reg [2:0]q;
always@(posedge cp)
begin
if(q==3'd7)
q<=0;
else if(q==0||q>0)
q<=q+1;
end
endmodule
(2)元器件
(3)功能仿真
控制电路
本模块实现时间加减,开始和复位的功能并且通过本模块来控制D1,D2,D3三个灯的循环产生,本模块还输出8位信号作为下一模块设置时间和剩余时间的输入。
(1)源程序
module s1s2s3s4(clk,s1,s2,s3,s4,m_settime,m_left,d1,d2,d3);
input clk;
input s1,s2,s3,s4;
output [4:0]m_left;
output [4:0]m_settime;
output d1,d2,d3;
reg [5:0]s_out;
reg [4:0]m_out;
reg [4:0]m_left;
reg [4:0]m_up;
reg [4:0]m_down;
reg [4:0]m_settime;
reg str;
reg d1,d2,d3;
reg [3:0]i;
reg stop;
always@(posedge clk or negedge s4) begin
if(!s4)
begin
s_out<=0;
m_out<=0;
i<=0;
d1<=0;
d2<=0;
d3<=0;
stop<=0;
end
else if(m_left==0)
begin
i<=14;
d1<=0;
d2<=0;
d3<=0;
stop<=1;
end
else if(str&&!stop)
begin
if(i<4&&i>=0)
begin
i<=i+1;
d1<=1;
d3<=0;
end
if(i<6&&i>=4)
begin
i<=i+1;
d1<=0;
d3<=1;
end
if(i<10&&i>=6)
begin
i<=i+1;
d3<=0;
d2<=1;
end
if(i==10)
begin
i<=i+1;
d2<=0;
d3<=1;
end
if(i==11)
i<=0;
if(i>12)
d1<=0;
if(s_out!=6'd59)
s_out<=s_out+1;
else
begin
s_out<=0;
m_out<=m_out+1;
end
end
end
always@(posedge s1 or negedge s4) begin
if(!s4)
m_up<=0;
else if(!str)
m_up<=m_up+5'd1;
end
always@(posedge s2 or negedge s4) begin
if(!s4)
m_down<=0;
else if(!str)
m_down<=m_down-5'd1;
end
always@(posedge s3 or negedge s4) begin
if(!s4)
str<=0;
else if(str==1)
str<=0;
else if(str==0)
str<=1;
end
always@( s1 or s2 or s4) begin
m_settime<=5'd10+m_up+m_down;
end
always@(clk or s3 or s4)
begin
m_left=m_settime-m_out;
end
endmodule
(2)元器件
(3)功能仿真
5. 32位信号产生电路
本模块长生32位信号实现显示学号和设置时间、剩余时间的功能。
(1)源程序
module xinhao32(settime,lefttime,s1,s2,s3,s4,s5,s6,s7,s8); output [3:0]s1,s2,s3,s4,s5,s6,s7,s8;
input [4:0]lefttime,settime;
reg [3:0]s1,s2,s3,s4,s5,s6,s7,s8;
always@(settime or lefttime)begin
s1=4'h2;
s2=4'h2;
s3=4'h0;
s4=4'h3;
if(lefttime==0)begin
s5=4'hd;
s6=4'ha;
s7=4'hb;
s8=4'hc;end
else
begin
s5=settime/10;
s6=settime%10;
s7=lefttime/10;
s8=lefttime%10;
end
end
endmodule
(2)元器件
(3)功能仿真
6.数据选择器
通过本模块将四个八位信号分别选到译码器的输入端。
(1)源程序
module lrshujuxuanze(in0,in1,in2,in3,in4,in5,in6,in7,sel,out);
input[3:0]in0,in1,in2,in3,in4,in5,in6,in7;
input[2:0]sel;
output[3:0]out;
reg[3:0]out;
always@( in0 or in1 or in2 or in3 or in4 or in5 or in6 or in7 or sel) begin
case(sel)
3'd0:out=in0;
3'd1:out=in1;
3'd2:out=in2;
3'd3:out=in3;
3'd4:out=in4;
3'd5:out=in5;
3'd6:out=in6;
3'd7:out=in7;
endcase
end
endmodule
(2)元器件
(3)功能实现
7.译码电路
本模块将数据选择器的4位输出信号译码为7位信号作为数码管的显示。
(1)源程序
module lryimaqi(decode_out,decode_in);
output[6:0] decode_out;
input[3:0] decode_in;
reg[6:0] decode_out;
always @(decode_in)
begin
case(decode_in)
4'h0:decode_out=7'b1111110;
4'h1:decode_out=7'b0110000;
4'h2:decode_out=7'b1101101;
4'h3:decode_out=7'b1111001;
4'h4:decode_out=7'b0110011;
4'h5:decode_out=7'b1011011;
4'h6:decode_out=7'b1011111;
4'h7:decode_out=7'b1110000;
4'h8:decode_out=7'b1111111;
4'h9:decode_out=7'b1111011;
4'ha:decode_out=7'b1001111;
4'hb:decode_out=7'b0010101;
4'hc:decode_out=7'b0111101;
4'hd:decode_out=7'b0000000;
endcase
end
endmodule
(2)元器件
(3)功能仿真
四、总结与讨论
本次课程设计设计了基于EPGA的洗衣机电机正反转控制器。
在课程开始之前,要提前预习,掌握设计的总体思路。
由于没有好好预习,所以在第一天花费很长时间了解设计任务、设计要求及思考总体思路。
本次设计要根据系统采
取层次化、模块化的设计方法,设计顺序自下而上。
首先实现系统框图中的各子模块,然后由顶层设计调用各子模块来完成整个系统。
在显示管的管脚分配的时候由于基础知识掌握不牢固,将管脚分配弄反,得到了镜像的数字显示。
第二次验证程序的时候,数字可以正常显示,但D1,D2,D3三个灯均不亮,检查了很多遍才发现自己的错误。
最后,顺利完成了本次设计并且实现了题目要求的功能。
本次设计,学到了很多东西:
①在经过了几天的设计仿真,学到的东西,主要是对数字电路的基础理论知识的复习巩固和对FPGA方面知识的掌握,更加清楚了解到了Verilog HDL语言的魅力,对以前学的理论知识通过实践来检验,更深入的理解了理论联系实际的重要性。
②要有坚持不懈的耐心和毅力,程序实现不可能一次成功,可能会出现很多错误,所以要持之以恒。
③要先把握事物大概,然后详细了解其各个组成部分。
本次设计中采用层次化。
模块化的设计方法,设计顺序自上而下。
首先实现系统框图中的各子模块,然后由顶层设计调用各子模块来完成整个系统。