基于FPGA的洗衣机电机正反转控制器Word文档格式.docx
《基于FPGA的洗衣机电机正反转控制器Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于FPGA的洗衣机电机正反转控制器Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
![基于FPGA的洗衣机电机正反转控制器Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/b681d509-e2ef-4b37-abf1-be9c2cd63c68/b681d509-e2ef-4b37-abf1-be9c2cd63c681.gif)
(2)设定好定时时间后,按下并松开S3(按下时S3=0,松开时S3=1),启动控制器,整个系统开始运行;
再次按下并松开S3,停止运行;
再次按下并松开S3继续运行;
按下并松开S绷U回到上电初始状态。
其他两个按键不起作用。
到达定时时间后,停止运行,按下并松开S绷U回到初始状态,在运行中要显示定时时间和剩余工作时间,当剩余时间为0时,要显示“End'
。
在工作过程中用三个LED旨示灯指示电机工作状态,正转D1灯亮,反转D2灯亮,暂停D3灯亮,如此反复直至工作时间为0停止(三个LED丁都不亮)。
二、设计方案
1洗衣机控制器的整体框图与原理:
原理:
本次设计中七段数码管采用动态扫描的方式显示,扫描需要一个比较高频率的信号,本次设计选用1000HZ。
为了得到1000Hz信号,必须对输入的时钟信号50MHZ进行分频。
而定时脉冲采用秒脉冲,所以选用两个分频器。
总的电路图包括时钟分频模块、定时和加减模块、时钟中心控制模块、数码管显示译码模块。
具体电路图如图所示:
2.控制电路各模块程序及仿真图
2.1时钟分频模块
FPG的输入脉冲有50MHz而数码管显示所需的脉冲为1KHz.而时钟中心控制模块所需的脉冲为1Hz.所以需要两个分频器,具体如下:
其VerilogHDL语言描述如下:
modulefenpin(p_50MHz,p_1kHz);
//分频
inputp_50MHz;
outputp_1kHz;
regp_1kHz;
reg[15:
0]count1;
always@(posedgep_50MHz)if(count1==24999)
begin
count1<
=15'
d0;
p_1kHz<
=〜p_1kHz;
endelsecountl<
=countl+1'
b1;
endmodule
modulefenpin1(clk_1000,clk_1);
inputclk_1000;
outputclk_1;
regclk_1;
reg[9:
0]cnt;
always@(posedgeclk_1000)
beginif(cnt==10'
d499)
ent<
=10'
elseent<
=cnt+1;
end
beginif(cnt==1O'
dO)clk_1<
=〜clk_1;
50MHz-----1KHz仿真波形
1KHz——1Hz仿真波形
2.2定时和时钟中心控制模块
通过此模块,可以实现时间的设定及加减,时钟中心控制正反转,暂停,以及LED灯的亮灭。
通过设定时间及脉冲来决定剩余时间,二者输出作为选择器的输入。
modulekongzhi(clk,s1,s2,s3,s4,set,show,d1,d2,d3);
inputclk;
inputs1;
inputs2;
inputs3;
inputs4;
output[4:
0]show;
0]set;
outputd1,d2,d3;
reg[5:
0]s_out;
reg[4:
0]m_out;
0]m_up;
0]m_down;
regstr;
regd1,d2,d3;
reg[3:
0]i;
regstop;
always@(posedgeclkornegedge
s4)
begin
if(!
s_out<
=0;
m_out<
d1<
=1;
i<
d3<
d2<
elseif(i<
6)
stopv=0;
=i+1;
elseif(str&
&
!
stop)
if(show==0)
10)
stop<
11)
if(i<
4)
elseif(i==11)
if(s_out!
=6'
d59)
二s_out+1;
else
=m_out+1;
always@(posedgesiornegedge
m_up<
elseif(!
str)
=m_up+5'
d1;
always@(posedges2ornegedge
m_down<
二m_down-5'
always@(posedges3ornegedge
str<
elseif(str==1)
elseif(str==0)
always@(siors2ors4)
set<
=5'
d10+m_up+m_down;
always@(clkors3ors4)
show=set-m_out;
模块仿真图
2.3数码管显示译码模块
由于本次显示的内容较多且有的恒定不变,有的要随脉冲改变。
所以加一个控制
模块来选择数码管的输出,将八选一选择器和数码管显示作为一个模块。
modulexuanze(set,show,s1,s2,s3,s4,s5,s6,s7,s8);
output[3:
0]s1,s2,s3,s4,s5,s6,s7,s8;
input[4:
0]show,set;
always@(setorshow)begin
s1=4'
h2;
s2=4'
h1;
s3=4'
h0;
s4=4'
h3;
if(show==0)begin
s5=4'
hd;
s6=4'
ha;
s7=4'
hb;
s8=4'
hc;
end
s5=set/10;
s6二set%10;
s7二show/10;
s8=show%10;
modulexuan(in1,in2,in3,in4,in5,in6,in7,in8,sel,decode_out);
input[3:
0]in1,in2,in3,in4,in5,in6,in7,in8;
input[2:
0]sel;
output[6:
0]decode_out;
reg[3:
0]out;
reg[6:
always@(in1orin2orin3orin4orin5orin6orin7orin8or
sel)
case(sel)
3'
d0:
out=in1;
d1:
out=in2;
d2:
out=in3;
d3:
out=in4;
d4:
out=in5;
d5:
out=in6;
d6:
out=in7;
d7:
out=in8;
endcase
always@(out)
case(out)
4'
h0:
decode_out=7'
b1111110;
h1:
b0110000;
h2:
b1101101;
h3:
b1111001;
h4:
b0110011;
h5:
b1011011;
h6:
b1011111;
h7:
b1110000;
h8:
b1111111;
h9:
b1111011;
ha:
b1001111;
hb:
b0010101;
hc:
b0111101;
hd:
b0000000;
endendmodule
数码管显示仿真图
选择控制八个数码管输出仿真图
2.4计数器提供脉冲模块
该模块采用模八计数器来提供数码管的扫描脉冲以及作为八选一选择器的输入端
modulejishu(cp,q);
inputcp;
output[2:
0]q;
reg[2:
always@(negedgecp)
if(q<
b111)q<
=q+1;
elseqv=4'
b000;
计数器仿真波形
三、电路调试
1.在调试时,学号在整个运行过程中都保持不变,此符合要求。
2.第一次调试时,设置的定时时间和自减的初值不能同步。
这是因为一开始我把
它们分为两个模块,时钟控制不一致。
解决方法:
将这两部分放到一个模块里面,由一个时钟脉冲来控制,问题顺利解决。
3.每次按键改变定时器的初值,有时不是减一而是减多值。
这是因为抖动产生的
不稳定,若要解决,须给程序加上消抖模块
四、总结与体会
通过本次设计,对于Verilog语言和quartus软件有了更深的了解,由开始的只知皮毛到现在的自己可独立编程,真的有很大收获。
由于开始对知识的不熟悉,在设计过程中困难重重。
起初没有思路,后来明白框图又不知如何下手的辛酸,在第一天尤其明显。
在设计中,时钟中心控制模块最为困难,因为要控制的量很多,而且控制条件也较复杂,参阅和查询了资料,一次又一次的测试才成功。
此次设计的模块化是一亮点,减少了很多不必要的连线使整体更加清晰。
到电路测试时,也不是一次便成功。
多改多试,持之不懈,最终得以成功。
在项目设计方面中,我遇到了些问题,比如说对于一些语法不懂,写程序时候没有注意层次分明,在模块连线时候,也没有注意输入与输出,管脚分配错
误等,因此在调试时候出错,浪费了一些时间才找到错误所在。
通过这次设计,让我更深入的掌握了VerilogHDL勺设计方法与一些技巧,让我对FPG的编程、定时器和计数的设计更加熟悉,让我更加明白时序组合门电路设计思路和方法。
整个过程的酸甜苦辣都已尝试,最后成功的喜悦更是令人欣喜。
此次设计也说明要有耐心,恒心,多想,多查阅,不放弃是成功所必备的。