数字电路课程设计:基于FPGA和VHDL语言的洗衣机控制系统设计

上传人:good****022 文档编号:116503434 上传时间:2022-07-05 格式:DOC 页数:16 大小:369.50KB
返回 下载 相关 举报
数字电路课程设计:基于FPGA和VHDL语言的洗衣机控制系统设计_第1页
第1页 / 共16页
数字电路课程设计:基于FPGA和VHDL语言的洗衣机控制系统设计_第2页
第2页 / 共16页
数字电路课程设计:基于FPGA和VHDL语言的洗衣机控制系统设计_第3页
第3页 / 共16页
点击查看更多>>
资源描述
08电气8班 吴俊 学号:20080711121数字电路课程设计题目:基于FPGA和VHDL语言的洗衣机控制系统设计 报告员:吴俊 20080711121 组员:彭亮,刘靖,郑淑芳 日期:2010年12月 20日课题:洗衣机定时系统功能:1按内定标准洗涤时间洗涤,脱水时间脱水; 2有预约洗衣功能,如:你预约1小时,则系统会在1小时后自动进入洗涤状态; 3显示屏上能实时显示该机正处于何种状态和该状态下的时间; 4为该机设置了报警提示,及报警铃声控制时间; 5可以自己设定洗涤及脱水的时间; 6可以用于直接脱水; 7报警显示;模块分析:根据系统的设计要求,整个系统可分为键盘转按键,洗衣机主控制器,LCD三个模块。各个模块的作用如下: 1键盘转按键:将板上键盘变为16个按键,从左上到右下,按键按下时,对应输出为1,松开为0 ,它用于洗衣机外端口的输入; 2洗衣机主控制器:它是整个系统正常有序工作的核心,按设计要求产生相应的控制逻辑,以控制其他各部分的协调工作; 3LCD:在LCD上按格式显示4组两位数码 D0D3 从左至右,它用于显示功能中要显示的信息;设计要求1.分析设计任务,拟定多种设计方案,根据当时的制作条件,选定适合的方案绘制框图和设计流程。2.设计各部分单元电路或编写VHDL描述程序。3.对制作的电路进行功能测试,分析各项技术指标;或对设计的电路进行功能仿真,分析仿真波形。4.总结设计资料,但因包括原理电路、VHDL描述、仿真波形的设计报告,校验并演示电路装置。设计过程: 根据上述功能及要显示的信息,我们分析得出10个状态,分别为s0(复位即等待命令,输入),s1(输入命令),s2(注水),s3(洗涤),s4(排水),s5(漂洗),s6(脱水),s7(报警响铃计时),s8(预约计时),s9(结束,播放提示音计时)。相关模块的程序:1主控系统:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity xiyiji is port (CPIN,R : IN STD_LOGIC; bgxh:IN STD_LOGIC; X_add_time: IN STD_LOGIC; X_minus_time:IN STD_LOGIC; start_1 : IN STD_LOGIC; start_2 : IN STD_LOGIC; T_MINUS_TIME: IN STD_LOGIC; T_ADD_TIME : IN STD_LOGIC; yuy_z_TIME : IN STD_LOGIC; xl_out: OUT STD_LOGIC; cp1_out: OUT STD_LOGIC; light: OUT STD_LOGIC; xi_yi_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ); liucsj_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0 ); zt_2_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); zt_1_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);end entity ;architecture JGT of xiyiji is TYPE STATES IS (S0,S1,S2,S3,S4,s5,s6,s7,s8,s9); SIGNAL s: STATES; SIGNAL xidi: STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL TUOSHUI: STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL PIAOXI: STD_LOGIC_VECTOR(7 DOWNTO 0) ; SIGNAL zhushui: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL PAISHUI:STD_LOGIC_VECTOR(7 DOWNTO 0); signal yuyue:std_logic_vector(7 downto 0); SIGNAL xlsj:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL xiyi:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL bgsj:STD_LOGIC_VECTOR(7 DOWNTO 0); signal zt1: std_logic_vector(7 downto 0); signal zt2: std_logic_vector(7 downto 0); signal liucsj: std_logic_vector(7 downto 0); SIGNAL xl: STD_LOGIC; SIGNAL cishu:integer range 0 to 5; signal cp:std_logic;beginPROCESS(CPIN,R)BEGINIF R=1 THEN S=S0; xidi=00000100;tuoshui=00000011;piaoxi=00000100;zhushui=00000011; PAISHUI=00000011;bgsj=00000010;xlsj=00000010; xl=0;cishu=2; yuyue=00000000; light=1; zt1=00010011; -输入-s zt2=00010010; -rELSIF CPIN=1 AND CPINEVENT THEN if s=s0 or s=s1 then xiyi=00000000; else xiyiS if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; -j s= s7; elsif x_add_time=1then zt1=00011000; -洗涤加时-x zt2=00011010; -z xidi=xidi+1; if xidi=00011110 then xidi=00011110; end if; elsif x_minus_time=1then zt1=00011000; -洗涤减 -x zt2=00001010; -j xidi=xidi-1; if xidi=00000000 then xidi=00000000; end if; elsif T_add_time=1then zt1=00010100; -脱水加 -t zt2=00011010; tuoshui=tuoshui+1; if tuoshui=00011001 then tuoshui=00011001; end if; elsif T_minus_time=1then zt1=00010100; -脱水减 zt2=00001010; tuoshui=tuoshui-1; if tuoshui=00000000 then tuoshui=00000000; end if; elsif yuy_z_time=1then zt1=00011001; -预约加 zt2=00011010; yuyue=yuyue+1; if yuyue=00011001 then yuyue=00011001; end if; elsif start_1=1then if yuyue=00000000 then zt1=00011010;-注水 zt2=00010011; s=s2; Else zt1=00000100; -倒计时 zt2=00001010; s=s8; end if; elsif start_2=1then zt1=00010100; -脱水 zt2=00010011; s=s6;xidi=00000000;piaoxi=00000000;zhushui=00000000; PAISHUI if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; else IF zhushui=00000001 THEN zt1=00011000;-洗涤 zt2=00000100; S=S3; zhushui=00000000; else zhushui if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; else IF xidi=00000001 THEN zt1=00010000;-排水 zt2=00010011; s=s4; xidi=00000000; else xidiif bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; else IF paishui=00000001 THEN zt1=00010000;-漂洗 zt2=00011000; s=s5; paishui=00000000; else paishui if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; elsIF piaoxi=00000001 THEN zt1=00010100; -脱水 zt2=00010011; s=s6; piaoxi=00000000; else piaoxi if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; elsIF tuoshui=00000001 THEN zt1=00001010; -洗完 zt2=00010011; S=s9; tuoshui=00000000; else tuoshui if bgsj=00000000 then xl=0;s=s0; else bgsj=bgsj-1; xl if bgxh=1 then zt1=00000010; -报警-b zt2=00001010; s=s7; elsIF yuyue=00000001 then zt1=00011010;-注水 zt2=00010011; yuyue=00000000; s=s2; else yuyue=yuyue-1; zt1=00000100; -倒计时 zt2 if cishu=0 then zt1=00010011; -输入-s zt2=00010010; -r s=s1; elsif xlsj=00000000 then xlsj=00000001; xl=0;cishu=cishu-1; else xlsj=xlsj-1; xl s=s1; end case;end if;end process; process (xiyi,tuoshui,xl,zhushui,zt1,zt2,yuyue,xidi,piaoxi,paishui,liucsj,CPIN) begin if x_add_time=1or x_minus_time=1then liucsj=xidi; elsif T_add_time=1 or T_minus_time=1then liucsj=tuoshui; elsif yuy_z_time=1then liucsj00000000then liucsj00000000 then liucsj00000000then liucsj00000000 then liucsj00000000then liucsj00000000 then liucsj= tuoshui; elsif zhushui=00000000 and yuyue=00000000and xidi=00000000and paishui=00000000 and piaoxi=00000000 and tuoshui=00000000 then liucsj=00000000; end if; if xiyi 10 then xi_yi_out= xiyi; elsif xiyi20 then xi_yi_out=xiyi+6; elsif xiyi30 then xi_yi_out= xiyi+12; elsif xiyi40 then xi_yi_out=xiyi+18; elsif xiyi50 then xi_yi_out=xiyi+24; elsif xiyi60 then xi_yi_out=xiyi+30; elsif xiyi70 then xi_yi_out=xiyi+36; end if; if liucsj 10 then liucsj_out= liucsj; elsif liucsj20then liucsj_out =liucsj+6; elsif liucsj30 then liucsj_out =liucsj+12; elsif liucsj40 then liucsj_out = liucsj+18; elsif liucsj50 then liucsj_out = liucsj+24; elsif liucsj60 then liucsj_out = liucsj+30; elsif liucsj70 then liucsj_out = liucsj+36; end if; if xl=1 then xl_out=xl;cp1_out=CPIN; else xl_out=0;cp1_out=0; end if; zt_1_out=zt1; zt_2_out=zt2;end process ;end architecture jgt;-主控程序2键盘转按键程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity PADTOKEY is port (CPIN,R :IN STD_LOGIC; Y: OUT STD_LOGIC_VECTOR(15 DOWNTO 0); ICOL : IN STD_LOGIC_VECTOR(3 DOWNTO 0); OROW : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END ENTITY;architecture JGT of PADTOKEY is TYPE STATES IS (S0,S1,S2,S3,S4); SIGNAL S: STATES; SIGNAL SROW : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL CPCT : INTEGER RANGE 0 TO 255; SIGNAL CTDELAY: INTEGER RANGE 0 TO 511; SIGNAL CP:STD_LOGIC; BEGIN PROCESS(CPIN) BEGIN IF CPIN=1 AND CPIN EVENT THEN IF CPCT=255 THEN CPCT=0;CP= NOT CP; ELSE CPCT=CPCT+1; END IF; END IF; END PROCESS; PROCESS(CP,R) VARIABLE N:INTEGER RANGE 0 TO 12; BEGIN IF R=1 THEN S=S0;Y=0000000000000000;SROWSOROW=SROW;SSY(3 DOWNTO 0)Y(7 DOWNTO 4)Y(11 DOWNTO 8)Y(15 DOWNTO 12)NULL; END CASE; WHEN S3=IF N=12 THEN N:=0;S=S4;CTDELAY=0;SROW=1110; ELSE N:=N+4;S=S1;SROWIF CTDELAY=511 THEN S=S1;CTDELAY=0; ELSE CTDELAY=CTDELAY+1; END IF; END CASE;END IF;END PROCESS;END JGT;3LCD模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity GENLCD8 is port (CPIN,R,BUSY :IN STD_LOGIC; xlxh :IN STD_LOGIC; xy_sj,lc_sj,zhuangt_1,zhuangt_2 :IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK,RST,STROBE,OUTLINE : OUT STD_LOGIC; DATA : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ADDR : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);end entity ;architecture JGT of GENLCD8 is TYPE STATES IS (S0,S1,S2,S3,S4); SIGNAL S: STATES; SIGNAL LCDPT : INTEGER RANGE 0 TO 20; SIGNAL CPCT: INTEGER RANGE 0 TO 65535; SIGNAL CP: STD_LOGIC; SIGNAL D3: STD_LOGIC_VECTOR(7 DOWNTO 0);beginPROCESS(CPIN,R)BEGINCLK=CPIN;IF R=1 THEN CPCT=65535;ELSIF CPIN=1 AND CPIN EVENT THEN IF CPCT=0 THEN CPCT=65535;CP=NOT CP;-分频为500US周期 ELSE CPCT=CPCT-1; END IF;END IF;END PROCESS;PROCESS(CP,R)-主进程:拟采用500us时钟,即在500us后完成状态转换,修改LCDPT指针BEGINIF R=1 THEN -S0:初始状态,在R=1时,处于S0状态,LCDPT=0 S=S0;LCDPT=0;RST S=S1;LCDPT=0;RST RST=0;STROBE=0;-输出RST=0; IF BUSY=0 THEN-判断BUSY=0? LCDPT=LCDPT+1;-:Y: LCDPT+1 IF LCDPT=7 THEN-LCDPT到固定最后? S=S3;-:Y: 转S3 ELSe S S=S1;STROBE STROBE=0; IF BUSY=0 THEN-BUSY=0? IF LCDPT=14 THEN LCDPT=7; ELSe LCDPT=LCDPT+1; END IF; S STROBE=1;S NULL;- END CASE;END IF; END PROCESS;PROCESS(LCDPT,xlxh)-选择输出进程(LCDPT)BEGINif xlxh=1 then D3=00010001; else D3 NULL;WHEN 1=DATA=00011000;ADDR=0010;OUTLINEDATA=00011001;ADDR=0001;OUTLINEDATA=00001100;ADDR=0110;OUTLINEDATA=00000011;ADDR=0101;OUTLINEDATA=00011010;ADDR=1010;OUTLINEDATA=00010100;ADDR=1001;OUTLINEDATA=0011&xy_sj(7 DOWNTO 4);ADDR=0011;OUTLINEDATA=0011&xy_sj(3 DOWNTO 0);ADDR=0010;OUTLINEDATA=0011&lc_sj(7 DOWNTO 4);ADDR=0110;OUTLINEDATA=0011&lc_sj(3 DOWNTO 0);ADDR=0101;OUTLINEDATA=zhuangt_1;ADDR=1010;OUTLINEDATA=zhuangt_2;ADDR=1001;OUTLINEDATA=0000&D3(7 DOWNTO 4);ADDR=1110;OUTLINEDATA=0000&D3(3 DOWNTO 0);ADDR=1101;OUTLINE NULL;END CASE;END PROCESS;ENDJGT;下板后具体模拟演示过程:-接通电源,按下复位键1,LCD上显示如下: 报警状态流程洗衣00ZTLCXY00SR0000-再按下5号键(x_add_time 代表洗衣时间在标准定值基础上加一个单位时间,为实验以观察一个单位时间在这儿都是取值1个脉冲),则LC两格下依次显示05(表示洗衣时间在标准的基础上加了一个单位时间);-再按下7号键(T_minus_time代表脱水时间在标准基础上减一个单位时间),则LC两格下依次03;-再按下6号键(yuy_z_time表示预约时间为一个单位时间),LC两格下依次显示01;-再按下3号键(start_1表示开始进入洗衣状态);LC显示预约时间倒计时01;ZT显示DJ(倒计时);XY显示18(整个洗衣过程的用时); 接着LCD上显示的就是状态之间的变化等.如下:ZTLCXY00ZSO31700XD051400PS030900PX030600TS030300JS020000RS0000当ZT显示JS时表示洗衣结束,LC显示的是结束提示音的时间,洗衣时间XY显示为00;当提示音为00时状态又转到复位状态即输入(等待命令);与此操作类似的仿真图如下:原理图如下心得体会 在为期两周的数字课程设计的时间里,我初步掌握了altium designer在硬件开发方面的应用,并且学会了用VHDL语言进行简单的硬件程序描述,不仅开拓了自己的视野而且让自己的逻辑思维更加敏捷与严谨。大家都清楚这个课程设计中老师管得较为宽松,而且老师让我们自己设计的主要就是主控程序这一块,所以一开始我们小组都不待见它,感觉应该蛮容易就能完成了。基于这一点我们小组的课题拖了很久才定下来。虽然当我来写主控程序时感觉和C语言的有很多类似的地方,所以给我的错觉是不是很难,可是当我去机房仿真时发现了一些逻辑上的问题,这时我发现它与C语言还是有区别的。还有就是LCD,它是很实际性的器件,我自己仿真成功了,可就是下板子老是出来了信息。后来才知道对于LCD只有单独下板子成功了才能表示LCD程序无误,看其仿真波形无法判断的。当自己的作品顺利显示在FPGA开发板上的时候,才明白我们平时缺乏的是实践能力,以至于在逻辑上还停留在理论上,唯有多加实践,才能让我们更加稳固的掌握一门学科和技术。 16
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸下载 > CAD图纸下载


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!