基于VHDL的洗衣机控制器设计_第1页
基于VHDL的洗衣机控制器设计_第2页
基于VHDL的洗衣机控制器设计_第3页
基于VHDL的洗衣机控制器设计_第4页
基于VHDL的洗衣机控制器设计_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于VHDL的洗衣机控制器设计作者:田骏祎指导老师:严世胜(海南师范大学物理与电子工程学院,海口,571158)摘要:随着科技的不断发展,洗衣机作为日常家庭生活中不可或缺的电器设备,其自动化、智能化和高效化的需求日益凸显,因此,对洗衣机控制器的设计优化与性能提升显得尤为重要。传统的洗衣机控制器基本都是采用超大规模集成电路或者单片机来实现,单片机设计存在着调试复杂的问题,专用集成电路一旦设计出现问题就要完全废弃。而用FPGA设计需要更新时无需更改硬件,只需软件进行升级更新即可。因此论文设计的洗衣机控制器基于FPGA技术和QuartusII开发平台设计。利用自上而下的设计方式,将洗衣机控制器分为4个模块进行设计,并用顶层文件进行连接。使用硬件描述语言来描述各个模块,并将产生的文件下载到FPGA芯片EP4CE10F17C8中。结果表明,该设计基本实现了洗衣机所需的全自动控制过程,包括洗衣机洗衣强度显示、电机模拟波轮洗衣机运转、水流强度可选等功能,通过实验测试,验证了所设计的控制器的稳定性和可靠性,并可以运用到实际生活当中去。关键词:洗衣机控制器;VHDL;FPGA;QuartusII1引言1.1研究意义洗衣机控制器是洗衣机的重要组成部分,基于VHDL语言对洗衣机控制器进行设计,其研究意义主要体现在以下几个方面:(1)提高控制性能:VHDL是一种硬件描述语言,被广泛应用于数字电路设计,它使得数字系统中各个模块的功能和行为得以方便地被描述。在洗衣机控制器的设计中应用VHDL语言,可以确保设计的准确性和可靠性,且性能稳定抗干扰能力强[1],从而提高控制器的性能,保障洗衣机系统的正常运行。(2)使设计更加灵活:将VHDL应用于洗衣机控制器的设计,不仅可以实现洗衣过程的自动化,还可以通过描述控制器的行为,更加精确地实现各项功能。使用FPGA实现硬件设计,使得控制器更具灵活性和可扩展性。(3)推动家电智能化:通过这一研究,可以加深对硬件描述语言的理解与应用,为家电行业提供一种新的设计思路和方法,有助于提升家电产品的智能化和自动化水平,为此应用领域做出贡献。1.2研究现状目前洗衣机控制器通常采用数字电路进行设计[2],传统的数字电路设计方法,基于超大规模集成电路进行,其结构较为复杂,功耗较高,速度较低,且出现问题整个设计就要完全废弃,故不作为经常被选用的方案。在国内,利用单片机作为主控制器设计洗衣机系统是一种比较常见的设计方案[3],该类设计先由STC89C51单片机构成最小系统,再结合外围电路控制电机[4],具有效率高、设计周期短的特点,但其电路较为复杂。在国外,智能洗衣机同样是诸多学者关注的热点,他们有关于洗衣机模糊控制器的研究,有学者提出了采用模糊逻辑控制确定洗衣机转速值和电机转速稳定性的系统[5],但模糊控制存在不足,即没有学习能力,从而使模糊控制产品难以积累经验。因此基于EDA技术研究一套能选择不同工作模式自动完成洗衣功能的智能洗衣机控制器[6]更加有实用意义。2洗衣机控制器方案的选择洗衣机控制器有许多设计方法,可以采用单片机电路、模糊技术控制、现场可编程门阵列FPGA等方案来实现。如果使用单片机电路进行设计,其优点为体积小、质量轻、价格便宜,控制功能灵活[7],而且由于其高度的集成性和优化性能,可以提高生产效率并降低维护成本;此外,利用单片机进行设计可靠性高、运行稳定且易于维护,单片机具备强大的控制和处理能力,可以方便地实现洗衣机的自动化和智能化控制。缺点为在单片机开发过程中可能需要进行复杂的调试和优化工作,以确保控制器的稳定性和可靠性;需要大量的硬件接口和外部设备,设计布线工作量大;单片机控制器对工作环境和电磁干扰的敏感性较高[8],如果工作环境恶劣或电磁干扰较强,可能会影响控制器的正常运行。如果使用模糊控制电路进行设计,其优点为能灵活地根据洗衣机的洗涤参数做出改变[9],有利于水电资源的节省。同时设计模糊控制器所需的时间较为短暂,大大地提高了项目开发效率,模糊控制器根据专业人员总结的规则进行控制量大小转变,能适应洗衣机的非线性、时变、大延迟的特性。缺点为模糊产品难以积累经验,而且在机器上的控制比较呆板,不能做到随机应变,有很大的局限性。如果以FPGA为基础,用VHDL语言实现洗衣机控制器的设计,其优点为具有高度的可编程性[10],FPGA可以根据不同的洗涤模式、水位、转速等需求进行快速配置,满足各种复杂的控制要求;降低能耗和成本,通过精确控制洗衣机的各项功能,FPGA可以帮助减少不必要的能源浪费,从而降低能耗成本;高效的并行处理能力,FPGA采用并行处理的方式,可以同时处理多个任务,从而提高了洗衣机的整体性能。缺点为较高的技术门槛,FPGA编程需要一定的专业知识和经验,包括硬件描述语言的掌握和电路设计技能,这使得非专业人员难以进行FPGA控制器的设计与维护。与传统的设计方案相比,采用FPGA设计方案的设计的优点有:实时性和灵活性:FPGA可以根据洗衣机的实际运行需求灵活调整控制逻辑,实现实时控制和精确管理各个洗衣步骤,且能够快速响应不同模式下的工作要求。可靠性增强:FPGA可以在单一芯片上集成多种功能,减少对外部元件的依赖,从而提高系统的可靠性和稳定性,降低故障率。标准化与统一平台:使用FPGA设计洗衣机控制器可以简化供应链管理,因为同一系列的FPGA可以用于多个型号的洗衣机产品,只需要不同的软件配置即可满足不同产品的差异化需求。总之,采用FPGA设计洗衣机控制器,相较于传统设计方案,在设计初期调研、硬件结构定型、功能仿真调试、模块重复利用、功能修改等方面优势明显[11],系统开发周期大大缩短,开发成本大大降低,可以实现更为精准、高效的控制系统,具有实时性、灵活性、更强的可靠性与标准化、平台统一化的优点。这些优点使得FPGA设计方案成为洗衣机控制器设计领域的理想选择,有助于提升洗衣机的性能和用户体验。3整体设计论述3.1FPGA简介FPGA,即现场可编程门阵列(Field-ProgrammableGateArray),是一种以数字电路为主的集成芯片,属于可编程逻辑器件(ProgrammableLogicDevice,PLD)的一种。它是一种基于可编程逻辑和可编程连接的集成电路器件,采用可编程的逻辑单元和可编程互连电路,具有很高的灵活性[12]和可重构性,可以通过编程来定义其内部逻辑结构,根据不同的需求进行实时配置。本文的洗衣机控制器使用了FPGA芯片EP4CE10F17C8,并对其进行了详细的分析。3.2洗衣机控制器的原理和结构3.2.1洗衣机控制器的原理本文设计的洗衣机控制器为波轮全自动洗衣机,能实现全自动的洗涤、漂洗、脱水的流程,倒计时时间数字的显示、按键控制洗衣强度设置及显示,还具有电机模拟洗衣机正反转的演示功能。洗衣机控制器作为洗衣机的核心模块,洗衣机能否实现洗衣功能主要取决于对洗衣机控制器的设计是否完善。在进行日常观察分析和浏览相关资料得知,洗衣机控制器的设计能够实现洗涤、漂洗、脱水的全自动化流程[13]。首先需要按键设置洗衣强度,有三种洗衣强度可以选择:强洗、标准与轻柔模式。对于强洗模式,洗衣状态为正转5秒,停2秒,反转5秒,停2秒;对于标准模式,洗衣状态为正转3.5秒,停1.5秒,反转3.5秒;对于轻柔模式,洗衣状态为正转2.5秒,停1.5秒,反转2.5秒。选择完洗衣强度后点启动按钮,进水阀打开,到达一定水位后水位开关闭合,进水完成,此时进水阀关闭,洗涤灯亮,电机按照选择的强度进行正反转,洗涤过程进行20分钟后,洗涤灯灭,排水阀打开,此时电机停转,到达一定水位后水位开关关闭,排水完成,此时脱水灯亮,表示开始脱水,电机只正转,脱水时长为5分钟。脱水结束后,脱水灯灭,排水阀关闭。紧接着进水阀打开,到达一定水位后水位开关闭合,进水完成,进水阀关闭,第一次漂洗灯亮,电机按照选择的强度进行正反转,漂洗过程进行10分钟后,第一次漂洗灯灭,排水阀打开,表示正在排水,此时电机停转,到达一定水位后水位开关关闭,排水完成,此时脱水灯亮,电机正转5分钟后脱水结束,脱水灯灭,排水阀关闭。之后进行二次漂洗,进水阀打开,到达一定水位后水位开关闭合,进水完成,进水阀关闭,二次漂洗灯亮,漂洗10分钟后,二次漂洗灯灭,排水阀打开,到达一定水位后水位开关关闭,排水完成,脱水灯亮,开始脱水,脱水5分钟后脱水灯灭,排水阀关闭。综上所述,整个洗衣流程所需时长为55分钟。同时,利用VHDL对洗衣机控制器的功能进行了合理的设计,保证了洗衣机工作的精确次序和切换的时刻。3.2.2洗衣机控制器的结构本文设计的洗衣机控制器的结构主要包括四个模块,即时钟计数模块、按键控制模块、电机控制模块、工作状态显示模块,用顶层文件将他们连接起来。首先外部信号clk给时钟计数模块提供50MHz的外部时钟,时钟计数模块为按键控制模块、电机控制模块、工作状态显示模块提供同步的工作时钟信号,同时为顶层文件中关于进水阀及排水阀闭合或断开的控制部分与洗涤灯、漂洗灯及脱水灯亮灭的控制部分提供同步的工作时钟信号。按键输入信号将按键状态的变化信息送入按键控制模块,按键控制模块为电机控制模块提供去抖动处理后的按键脉冲信号,电机控制模块控制开发板外部电机运转。工作状态模块控制数码管显示的剩余时间和洗衣强度,水位开关能起到控制进水阀及排水阀闭合或断开与洗涤灯、漂洗灯及脱水灯亮灭的作用。根据洗衣机控制器结构的设计要求,最后绘制了如图1所示的系统框图。图1控制系统框图3.3洗衣机控制器ASM图在洗衣机控制器的设计中,要求实现全自动洗衣过程,即按下启动按钮后,洗衣机自动完成洗涤、漂洗、二次漂洗、脱水等流程。流程中的状态会根据水位开关的关断或工作时间来进行切换。该洗衣机控制器的ASM图如图2,由图可以看出,该洗衣机控制器主要设置了13个基本状态,由状态转移电路来在满足判断条件时分别转向不同的状态。本文所设计的洗衣机控制器共有强洗、标准、轻柔三种洗衣强度,因为这三种强度差异之处只在电机正反转设置中,故三者的ASM图完全一致。状态S1:设置完洗衣强度并启动按键,进水阀打开,水位开关拨上;状态S2:进水阀关闭,洗涤灯亮,电机正反转,洗涤20分钟;状态S3:洗涤灯灭,排水阀打开,电机停转,断开水位开关;状态S4:脱水灯亮,电机只正转,脱水时长为5分钟;状态S5:脱水结束后,脱水灯灭,排水阀关闭,进水阀打开;状态S6:水位开关拨上,进水阀关闭,第一次漂洗灯亮,电机正反转;状态S7:漂洗10分钟以后,第一次漂洗灯灭,排水阀打开,电机停转,断开水位开关;状态S8:脱水灯亮,电机正转;状态S9:5分钟后,脱水灯灭,排水阀关闭,进入二次漂洗,进水阀打开;状态S10:水位开关拨上,进水阀关闭,二次漂洗灯亮;状态S11:漂洗10分钟后二次漂洗灯灭,排水阀打开;状态S12:水位开关断开,脱水灯亮,电机正转;状态S13:脱水5分钟后脱水灯灭,排水阀关闭,洗衣结束。图2洗衣机控制器ASM图4主要功能模块设计洗衣机控制器所要实现的功能分别在时钟计数模块、按键控制模块、电机控制模块、工作状态显示模块这四个模块中分别进行设计,最后用顶层文件将各个模块连接起来。4.1时钟计数模块设计在洗衣机控制器的设计中,需要系统根据设定的程序来自动控制洗衣机的工作时间与状态切换。因此,为了防止计时出现混乱导致洗衣机不能正常实现功能,所设计的洗衣机控制器需要一个稳定的时钟来支持其正常的工作。其中时钟计数电路模块图如图3:图3时钟计数电路模块图由该硬件模块图可知clk为输入信号,由外部信号提供50MHz的时钟信号;rst_n为输入的负边沿复位信号,当rst_n为低电平时,计数器清零,若rst_n是高电平且计数器达到最大值,则产生一个脉冲信号sec_1_r,并将其赋值给输出端口sec_1;该时钟计数电路模块主要是负责产生稳定的1s脉冲信号,为按键控制模块、电机控制模块、工作状态显示模块提供同步的工作时钟信号。为了保证计时准确,我们根据50MHz外部输入时钟设定计数器的最大值为24999999,用于生成一个1秒的时间间隔。这个值是根据所使用的时钟频率和所需的时间间隔来计算得出的。对于一个50MHz的时钟频率,如果要生成一个1秒的时间间隔,需要进行50000000次计数。本文设计计数器的范围是从0到最大值,所以最大值的值需要减去1。因此最大值被设置为24999999,以确保在计数到24999999时生成一个1秒的脉冲信号。部分VHDL程序如下:entitytime_countisPort(clk:inSTD_LOGIC;--时钟,50MHZrst_n:inSTD_LOGIC;--复位信号,下降沿有效,negativesec_1:outSTD_LOGIC--1s输出一个脉冲信号entitytime_countisPort(clk:inSTD_LOGIC;--时钟,50MHZrst_n:inSTD_LOGIC;--复位信号,下降沿有效,negativesec_1:outSTD_LOGIC--1s输出一个脉冲信号);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--记最大数1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--计数寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s计时器process(clk)beginarchitectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--记最大数1s,50000000次signalcnt_1:naturalrange0toMAX_NUM:=0;--计数寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s计时器process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thencnt_1<=0;elsifcnt_1=MAX_NUMthencnt_1<=0;elsecnt_1<=cnt_1+1;endif;endif;endprocess;“if

falling_edge(clk)

then”这个进程描述了生成1秒脉冲信号的逻辑。它在每个时钟下降沿检测时钟信号。如果复位信号rst_n是高电平且计数器达到MAX_NUM,则产生一个脉冲信号。“sec_1<=sec_1_r;”这条语句将内部生成的1秒脉冲信号sec_1_r赋值给输出端口sec_1。至此就实现了一个简单的1秒脉冲信号发生器。4.2按键控制模块设计当按键信号变化时,可能会出现抖动,即信号在短时间内多次变化,假如不做消抖处理,系统将会识别到很多抖动的信号,即识别到很多次按键按下,会对洗衣机控制器的正常工作带来极大干扰。为了避免抖动,需要通过按键消抖实现输出一个脉冲,这样就保证每次按下按键只会产生一个脉冲。按键控制模块实现了一个按键的去抖动机制和脉冲检测。按键控制模块图如图4:图4按键控制模块图由该硬件模块图可知clk为一个输入端口,由外部提供50MHz的时钟信号;key_in为一输入端口,用于检测按键状态的变化,并触发相应的动作,如去抖动处理和脉冲检测;rstn为一输入端口,表示复位信号,下降沿有效;key_pulse为输出信号,用于表示经过去抖动处理后的按键脉冲信号,以便系统能够正确地识别按键的按下或释放动作。部分VHDL程序如下:entitykeyisgeneric(N:integer:=1;PULSE_PERIOD:integer:=262143);Port(clk:inSTD_LOGIC;rstn:inSTD_LOGIC;key_in:inSTD_LOGIC;key_pulse:outSTD_LOGIC);endkey;architectureBehavioralofkeyissignalkey_rst_pre,key_rst,key_edge,key_sec_pre,key_sec:STD_LOGIC;signalcnt:STD_LOGIC_VECTOR(17downto0):=(others=>'0');beginprocess(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_rst<='1';key_rst_pre<='1';elsekey_rst<=key_in;key_rst_pre<=key_rst;endif;endif;endprocess;key_edge<=key_rst_preand(notkey_rst);上段程序首先检测按键信号的边缘变化(上升沿),并将其存储在key_rst_pre和key_rst中。当没有复位信号(rstn)时,将key_rst和key_rst_pre设置为高电平,确保在复位期间不产生误触发信号。如果有复位信号,将按键信号(key_in)赋值给key_rst和key_rst_pre。使用key_rst_pre和key_rst进行边缘检测,确定按键信号的上升沿。process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thencnt<=(others=>'0');elsifkey_edge='1'thencnt<=(others=>'0');elsecnt<=cnt+'1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec<='1';elsifcnt=PULSE_PERIODthenkey_sec<=key_in;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec_pre<='1';elsekey_sec_pre<=key_sec;endif;endif;endprocess;key_pulse<=key_sec_preand(notkey_sec);--检测前后一个时钟周期的按键信号之间的差异接下来检测到上升沿后,启动一个计数器cnt,在每个时钟周期上升沿到来时递增。如果没有复位信号,计数器将一直递增,直到达到设定的脉冲周期(PULSE_PERIOD),然后重置为零。一旦计数器达到设定的脉冲周期,将按键信号赋值给key_sec,表示检测到一个脉冲。key_sec_pre用于存储前一个时钟周期中key_sec的状态。最后就实现了输出信号key_pulse通过检测前一个时钟周期的按键信号和当前时钟周期的按键信号之间的差异来产生脉冲信号。4.3电机控制模块设计电机控制模块主要通过步进电机四个引脚的电平切换来控制电机旋转的方向和启停,并输出了一个周期性的脉冲信号。电机控制模块根据时钟信号、使能信号和方向信号,周期性地更新输出的控制信号,用于控制电机的运动。电机控制模块图如图5:图5电机控制模块由该硬件模块图可知clk为输入50MHz的时钟信号,dir为电机运动方向信号,en为使能信号,ctrl_out为输出信号,是一个4位向量,用于控制电机。电机控制模块将电机状态控制寄存器ctrl_reg里的值赋给ctrl_out,输出电机控制信号。部分VHDL设计程序如下:entityservorisport(clk:instd_logic;en:instd_logic;--电机使能信号dir:instd_logic;--电机运动方向信号ctrl_out:outstd_logic_vector(3downto0));--输出4位控制电机信号endservor;architectureBehavioralofservorissignalclk_cnt_servor:integer:=0;signalservor_pulse:std_logic:='0';signalctrl_reg:std_logic_vector(3downto0):="0001";beginctrl_out<=ctrl_reg;process(clk)beginifrising_edge(clk)then在上段代码中,当时钟信号clk上升沿到来时,检查计数器clk_cnt_servor的值是否小于90000。90000代表一个计数阈值。这个值用来控制产生脉冲信号的时钟周期数量。ifclk_cnt_servor<90000thenclk_cnt_servor<=clk_cnt_servor+1;servor_pulse<='0';elseclk_cnt_servor<=0;servor_pulse<='1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifservor_pulse='1'anden='1'thenifdir='1'thenctrl_reg<=ctrl_reg(2downto0)&ctrl_reg(3downto3);--反转elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正转endif;endif;endif;endprocess;endarchitectureBehavioral;如果小于90000,则计数器递增并保持脉冲生成标志信号servor_pulse为低电平,否则计数器归零,并将servor_pulse设置为高电平,表示产生了一个脉冲信号。当时钟信号clk上升沿到来时,同时也检查servor_pulse和使能信号en是否都为高电平。如果是,则根据方向信号dir的值,更新ctrl_reg的值,实现了电机控制逻辑正转或反转。4.4工作状态显示模块设计在洗衣机控制器进行工作时,如果不知道洗衣当前选择的模式及洗衣当前状态的剩余时间,用户只能一直等待,这样就会过多浪费用户的时间。如果有模式显示与倒计时时间显示允许用户知道洗衣机当前处于哪种模式、完成当前洗涤周期还需要多长时间。这样,用户可以合理安排自己的时间,等待洗衣机完成并及时取出洗好的衣物,避免浪费时间。因此,工作状态显示模块最主要的功能就是根据按键输入信号显示当前洗衣模式,以及根据当前洗衣进度显示当前状态的剩余时间。工作状态显示模块图如图6: 图6工作状态显示模块由该硬件模块图可知clk为输入时钟信号,rst_n为复位信号,time_remain为剩余时间输入信号,washer_mode为洗衣机模式选择输入信号,washer_power为洗衣机强度选择输入信号。sgm_bit为位选输出信号,sgm_bit为段选输出信号。工作状态显示部分VHDL程序如下:process(cnt_sel)begincasecnt_selis--位选when0=>--显示最低位的数码管sgm_sel<="111110";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60mod10,4));dp_en<='0';--剩余时间的秒数的个位数when1=>--显示次低位的数码管sgm_sel<="111101";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60/10,4));dp_en<='0';--剩余时间的秒数的十位数when2=>--显示次中间位的数码管sgm_sel<="111011";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60mod10,4));dp_en<='1';--剩余时间的分钟数的个位数when3=>--显示中间位的数码管sgm_sel<="110111";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60/10,4));dp_en<='0';--剩余时间的分钟数的十位数when4=>--显示次高位的数码管sgm_sel<="101111";sgm_data<="00"&washer_power;dp_en<='1';--洗衣强度when5=>显示最高位的数码管sgm_sel<="011111";sgm_data<="00"&washer_mode;--洗衣模式dp_en<='1';whenothers=>sgm_sel<="111111";dp_en<='0';endcase;endprocess;这段代码根据计数器cnt_sel的值来选择要显示的数码管的位,并将相应的数字或字符发送到段选端口,实现了位选原理。当cnt_sel等于0时,选择显示最低位的数码管,并将剩余时间的秒数的个位数发送到该数码管,同时设置小数点使能信号为0;当cnt_sel等于1时,选择显示次低位的数码管,并将剩余时间的秒数的十位数发送到该数码管,同时设置小数点使能信号为0。当cnt_sel等于2时,选择显示次中间位的数码管,并将剩余时间的分钟数的个位数发送到该数码管,同时设置小数点使能信号为1。当cnt_sel等于3时,选择显示中间位的数码管,并将剩余时间的分钟数的十位数发送到该数码管,同时设置小数点使能信号为0。当cnt_sel等于4时,选择显示次高位的数码管,并将洗衣机的强度状态发送到该数码管,并在显示数字前加上两个零,表示空位,同时设置小数点使能信号为1。当cnt_sel等于5时,选择显示最高位的数码管,并将洗衣机的模式状态发送到该数码管,并在显示数字前加上两个零,表示空位,同时设置小数点使能信号为1。对于其他情况,将所有数码管的段选信号设置为全高电平,同时关闭小数点使能信号。dp_bit<=notdp_en;process(data_in)begincasedata_inis--段选when"0000"=>bit_out<=dp_bit&"1000000";when"0001"=>bit_out<=dp_bit&"1111001";when"0010"=>bit_out<=dp_bit&"0100100";when"0011"=>bit_out<=dp_bit&"0110000";when"0100"=>bit_out<=dp_bit&"0011001";when"0101"=>bit_out<=dp_bit&"0010010";when"0110"=>bit_out<=dp_bit&"0000010";when"0111"=>bit_out<=dp_bit&"1111000";when"1000"=>bit_out<=dp_bit&"0000000";when"1001"=>bit_out<=dp_bit&"0010000";when"1010"=>bit_out<=dp_bit&"0111111";whenothers=>bit_out<="11111111";endcase;endprocess;这段代码将dp_en的逻辑反值赋给dp_bit,用于控制小数点的显示状态。当dp_en为低电平时,dp_bit为高电平,表示小数点关闭;当dp_en为高电平时,dp_bit为低电平,表示小数点开启。接着根据输入的data_in值控制七段数码管的段选,以显示相应的数字,并根据dp_en控制小数点的显示状态。4.5顶层电路设计顶层电路的设计主要就是把时钟计数模块、按键控制模块、电机控制模块、工作状态显示模块这四个模块用元件例化语句连接起来构成一个完整电路。工作状态显示部分VHDL程序如下:entitytopisPort(clk:instd_logic;rst_n:instd_logic;key_start_in:instd_logic;key_water_in:instd_logic;key_power_in:instd_logic;servor_out:outstd_logic_vector(3downto0);--输出电机控制信号sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0);led_water_in:outstd_logic;--进水灯led_water_out:outstd_logic;--排水灯led_washer:outstd_logic;--洗涤灯led_pure_washer:outstd_logic;--漂洗灯led_drop:outstd_logic--脱水灯);endtop;architectureBehavioraloftopissignalruning:std_logic:='0';--正在运行标志signalwasher_power:std_logic_vector(1downto0):="00";--洗衣强度模式signalwasher_finished:std_logic;signalkey_start_pulse:std_logic;signalkey_power_pulse:std_logic;signalkey_water_in_pulse:std_logic;--按键脉冲信号signalrunning_state:std_logic_vector(3downto0);signalhalf_sec_pulse:std_logic;--半秒的定时信号signalhalf_sec_cnt:integer:=0;signalroll_half_sec_cnt:integer:=0;--半秒计数器signalservor_en:std_logic;signalservor_dir:std_logic;signaltime_remain:integer:=0;componentkeyisport(clk:instd_logic;rstn:instd_logic;key_in:instd_logic;key_pulse:outstd_logic--按键脉冲输出信号);endcomponent;componentsgm_topisport(clk:instd_logic;rst_n:instd_logic;time_remain:integer;washer_mode:instd_logic_vector(1downto0);washer_power:instd_logic_vector(1downto0);sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0));endcomponent;componentservorisport(clk:instd_logic;en:instd_logic;dir:instd_logic;ctrl_out:outstd_logic_vector(3downto0));endcomponent;顶层连接部分的代码主要包括对这四个模块的声明、按键处理、主洗衣机工作进程控制、洗衣机状态显示灯控制,以及对u_key_start、u_key_power、u_key_mode三个属于按键控制模块的分模块的实例化,对时钟计数模块、工作状态显示模块、电机控制模块的实例化。5实物测试与仿真5.1主要模块仿真5.1.1时钟计数模块仿真模块仿真使用了Modelsim进行仿真。为方便观看波形,时钟信号的周期并未严格按实际要求设置,仿真前先将程序中的MAX_NUM数值改小为49(代码中为24999999),否则仿真会因为仿真时间过长而失败。clk为输入信号,rst_n为系统内部自复位信号,当rst_n为低电平时,系统内部信号复位。由仿真图11可以看出,系统可以提供稳定的1s脉冲。当rst_n为高电平时,当计数器cnt_1达到最大值MAX_NUM,则产生一个脉冲信号sec_1r,并赋值给sec_1输出一个1s脉冲。图11时钟计数模块仿真图5.1.2按键控制模块仿真clk为输入信号,提供50MHz的时钟信号,key_in为一输入端口,检测按键的变化,rst_n为复位信号,key_pulse为经过去消抖处理后的按键脉冲信号。从图中可以看出,当没有复位信号(rst_n)时,将key_rst和key_rst_pre设置为高电平,如果有复位信号,将按键信号(key_in)赋值给key_rst和key_rst_pre。接下来使用key_rst_pre和key_rst进行边缘检测,确定按键信号的上升沿检测到上升沿后,启动一个计数器cnt,在每个时钟周期上升沿到来时递增。如果没有复位信号,计数器将一直递增,直到达到设定的脉冲周期(PULSE_PERIOD),然后重置为零。一旦计数器达到设定的脉冲周期,将按键信号赋值给key_sec,表示检测到一个脉冲。key_sec_pre用于存储前一个时钟周期中key_sec的状态。最后输出信号key_pulse通过检测前一个时钟周期的按键信号和当前时钟周期的按键信号之间的差异来产生脉冲信号。图12按键控制模块仿真图5.1.3电机控制模块仿真clk为输入50MHz的时钟信号,dir为电机运动方向信号,en为使能信号,ctrl_out为输出信号,是一个4位向量,用于控制电机。从图中可以看出,当时钟信号clk上升沿到来时,检查计数器clk_cnt_servor的值是否小于31。代码中用的值是90000,为了方便仿真设置为31。如果小于31,则计数器递增并保持脉冲生成标志信号servor_pulse为低电平,否则计数器归零,并将servor_pulse设置为高电平,表示产生了一个脉冲信号。当时钟信号clk上升沿到来时,同时也检查servor_pulse和使能信号en是否都为高电平。如果是,则根据方向信号dir的值,更新ctrl_reg的值,实现电机控制逻辑正转或反转。图13电机控制模块仿真图5.1.4工作状态显示模块仿真clk为输入时钟信号,rst_n为复位信号,time_remain为剩余时间输入信号,washer_mode为洗衣机模式选择输入信号,washer_power为洗衣机强度选择输入信号。sgm_bit为位选输出信号,sgm_bit为段选输出信号。从图中可以看出,数码管实现了位选与段选。图14工作状态显示模块仿真图5.2实验结果将电机、驱动板与开发板之间用导线进行引脚连接,通过下载器往芯片中烧入程序后即可正常运行。程序可以正常开始运行,点击复位按钮RESET,数码管显示整体剩余时间,按下KEY1一下,数码管第二位显示1,再按一下显示2,再按一下显示0,如此循环,这是按键选择洗衣机的强度模式,0代表强洗,1代表标准,2代表轻柔。图中为强洗模式,按下启动按键KEY0后,数码管开始倒计时,DS0亮起,表示进水阀打开。如图15所示,以强洗强度为例:图15强洗模式下进水阀打开水位开关闭合,进水阀关闭,即DS0灭,洗涤灯DS2亮,如图16所示,以强洗强度为例:图16强洗模式下洗涤灯亮洗涤完成后洗涤灯DS2灭,排水阀打开,即DS1亮,如图17所示:图17强洗模式下洗涤完排水断开水位开关,脱水灯亮,如图18所示:图18进行脱水脱水结束后脱水灯排水灯灭,排水阀关闭,DS1灭,进水阀打开,即DS0亮,水位开关闭合后,进水阀关闭,即DS0灭,第一次漂洗灯亮,即DS3亮,如图19所示:图19进水后开始第一次漂洗漂洗结束,第一次漂洗灯灭,即DS3灭,排水阀打开,即DS1亮,如图21所示:图20第一次漂洗结束,开始排水水位开关断开,脱水灯亮,脱水结束后脱水灯排水灯灭,排水阀关闭,DS1灭,进水阀打开,即DS0亮,之后开始进行第二次漂洗,与第一次漂洗过程完全相同。最后第二次漂洗脱水结束后脱水灯排水灯灭,排水阀关闭,即DS1灭,洗衣结束,所有led灯全灭,倒计时停止。如图21所示:图21洗衣结束6总结本设计是基于VHDL语言进行编程,以实现整体预期的洗衣机控制功能,描述洗衣机控制器的模块以及其中使用的数据可以根据实际情况进行配置。目标器件是FPGA芯片,采用分层设计方法完成各模块的连接,通过仿真和实物测试验证,证明能够实现洗衣机控制器的主要功能。同时也还存在问题:编写的程序能够实现主要的洗衣功能但是代码过于繁琐,尤其是顶层文件使用例化语句调用并连接各个模块时,代码过于繁杂,不如用原理图连接更为简洁方便。该设计仅能初步实现一种可选择三种洗衣强度的基本的洗衣机的流程,模式太过于单一,存在局限性。参考文献朱伟.全自动直筒洗衣机FPGA控制器的开发设计[J].科技创新与应用,2017,(14):50.成超,任峻.基于VHDL的洗衣机控制器的设计[J].电子设计工程,2014,22(04):92-94+98.闫晶晶,张尚宇,王冰.基于单片机的全自动洗衣机控制系统设计[J].中国高新科技,2023,(13):19-21.王晓冬,陈红友.基于单片机的全自动洗衣机控制系统设计[J].科技创新与应用,2017,(09):88.NWulandari,AGAbdullah.DesignandSimulationofWashingMachineusingFuzzyLogicController(FLC)[J].IOPConferenceSeries:MaterialsScienceandEngineering,2018,384(1).孙浩,付一含,赵根,徐栋义,王颖.基于Verilog的洗衣机控制电路设计[J].电脑知识与技术,2019,15(07):244-245.高学群.单片机控制的全自动洗衣机系统[J].时代农机,2015,42(06):57+59.李彩容.浅谈单片机系统的电磁干扰与抗干扰措施[J].黑龙江科技信息,2011,(32):82.张继东.自动控制技术在全自动洗衣机的应用[J].中国设备工程,2017,(05):110-111.郭忠,李涛,李勇,等.基于FPGA的洗衣机控制系统设计[J].电子设计工程,2012,20(13):190-192.DOI:10.14022/ki.dzsjgc.2012.13.017.陈飞云.基于VerilogHDL语言的全自动洗衣机控制器的设计与仿真[J].应用技术学报,2017,17(03):257-261.杜强.基于FPGA的智能洗衣机控制器的研究与仿真设计[D].哈尔滨理工大学,2016.梅江龙.波轮全自动洗衣机模块化平台的设计研究[J].日用电器,2021,(11):69-75.附录1、时钟计数模块:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytime_countisPort(clk:inSTD_LOGIC;--时钟,50MHZrst_n:inSTD_LOGIC;--复位信号,下降沿有效,negativesec_1:outSTD_LOGIC--1s输出一个脉冲信号);endtime_count;architectureBehavioraloftime_countisconstantMAX_NUM:natural:=24_999_999;--记最大数1s,50,000,000次--constantMAX_NUM:natural:=49;--记最大数1s,50,000,000次signalcnt_1:naturalrange0toMAX_NUM:=0;--计数寄存器signalsec_1_r:STD_LOGIC:='0';begin--1s计时器process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thencnt_1<=0;elsifcnt_1=MAX_NUMthencnt_1<=0;elsecnt_1<=cnt_1+1;endif;endif;endprocess;--1s脉冲信号process(clk)beginifrising_edge(clk)thenifnotrst_n='1'thensec_1_r<='0';elsifcnt_1=MAX_NUMthensec_1_r<='1';elsesec_1_r<='0';endif;endif;endprocess;sec_1<=sec_1_r;--当右边改变,立马赋值给左边assign和always并行endBehavioral;2、按键控制模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitykeyisgeneric(N:integer:=1;PULSE_PERIOD:integer:=262143--PULSE_PERIOD:integer:=10);Port(clk:inSTD_LOGIC;rstn:inSTD_LOGIC;key_in:inSTD_LOGIC;key_pulse:outSTD_LOGIC);endkey;architectureBehavioralofkeyissignalkey_rst_pre,key_rst,key_edge,key_sec_pre,key_sec:STD_LOGIC;signalcnt:STD_LOGIC_VECTOR(17downto0):=(others=>'0');beginprocess(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_rst<='1';key_rst_pre<='1';elsekey_rst<=key_in;key_rst_pre<=key_rst;endif;endif;endprocess;key_edge<=key_rst_preand(notkey_rst);process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thencnt<=(others=>'0');elsifkey_edge='1'thencnt<=(others=>'0');elsecnt<=cnt+'1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec<='1';elsifcnt=PULSE_PERIODthenkey_sec<=key_in;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifnot(rstn='1')thenkey_sec_pre<='1';elsekey_sec_pre<=key_sec;endif;endif;endprocess;key_pulse<=key_sec_preand(notkey_sec);endBehavioral;3、电机控制模块:libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;entityservorisport(clk:instd_logic;en:instd_logic;dir:instd_logic;ctrl_out:outstd_logic_vector(3downto0));endservor;architectureBehavioralofservorissignalclk_cnt_servor:integer:=0;signalservor_pulse:std_logic:='0';signalctrl_reg:std_logic_vector(3downto0):="0001";beginctrl_out<=ctrl_reg;process(clk)beginifrising_edge(clk)thenifclk_cnt_servor<90000thenclk_cnt_servor<=clk_cnt_servor+1;servor_pulse<='0';elseclk_cnt_servor<=0;servor_pulse<='1';endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifservor_pulse='1'anden='1'thenifdir='1'thenctrl_reg<=ctrl_reg(2downto0)&ctrl_reg(3downto3);--反转elsectrl_reg<=ctrl_reg(0downto0)&ctrl_reg(3downto1);--正转endif;endif;endif;endprocess;endarchitectureBehavioral;5、工作状态显示模块:libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;useieee.std_logic_unsigned.all;useieee.numeric_std.all;entitysgm_topisport(clk:instd_logic;rst_n:instd_logic;time_remain:integer;washer_mode:instd_logic_vector(1downto0);washer_power:instd_logic_vector(1downto0);sgm_sel:outstd_logic_vector(5downto0);sgm_bit:outstd_logic_vector(7downto0));endsgm_top;architectureBehavioralofsgm_topissignalsgm_data:std_logic_vector(3downto0);signaldp_en:std_logic;signalclk_cnt_ms:integer;signalclk_pulse_1ms:std_logic;signalcnt_sel:integer;componentsgmisport(data_in:instd_logic_vector(3downto0);dp_en:instd_logic;bit_out:outstd_logic_vector(7downto0));endcomponent;beginprocess(clk)beginifrising_edge(clk)thenifrst_n='0'thenclk_cnt_ms<=0;clk_pulse_1ms<='0';elseifclk_cnt_ms<49999thenclk_cnt_ms<=clk_cnt_ms+1;clk_pulse_1ms<='0';elseclk_cnt_ms<=0;clk_pulse_1ms<='1';endif;endif;endif;endprocess;process(clk)beginifrising_edge(clk)thenifrst_n='0'thencnt_sel<=0;elseifclk_pulse_1ms='1'thenif(cnt_sel<5)thencnt_sel<=cnt_sel+1;elsecnt_sel<=0;endif;endif;endif;endif;endprocess;process(cnt_sel)begincasecnt_selis--位选when0=>--显示最低位sgm_sel<="111110";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60mod10,4));dp_en<='0';when1=>sgm_sel<="111101";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)mod60/10,4));dp_en<='0';when2=>sgm_sel<="111011";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60mod10,4));dp_en<='1';when3=>sgm_sel<="110111";sgm_data<=std_logic_vector(to_unsigned((time_remain/2)/60/10,4));dp_en<='0';when4=>sgm_sel<="101111";sgm_data<="00"&washer_power;dp_en<='1';when5=>sgm_sel<="011111";sgm_data<="00"&washer_mode;dp_en<='1';whenothers=>sgm_sel<="111111";dp_en<='0';endcase;endprocess;u_sgm:sgmportmap(data_in=>sgm_data,dp_en=>dp_en,bit_out=>sgm_bit);endarchitectureBehavioral;libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;useieee.std_logic_unsigned.all;entitysgmisPort(data_in:instd_logic_vector(3downto0);dp_en:instd_logic;bit_out:outstd_logic_vector(7downto0));endsgm;architectureBehavioralofsgmissignaldp_bit:std_logic;begindp_bit<=notdp_en;process(data_in)begincasedata_inis--段选when"0000"=>bit_out<=dp_bit&"1000000";when"0001"=>bit_out<=dp_bit&"1111001";when"0010"=>bit_out<=dp_bit&"0100100";when"0011"=>bit_out<=dp_bit&"0110000";when"0100"=>bit_out<=dp_bit&"0011001";when"0101"=>bit_out<=dp_bit&"0010010";when"0110"=>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论