1、东南大学电工电子实验中心实 验 报 告课程名称: 数字逻辑电路设计实践 第 6 次实验实验名称:可编程数字系统设计全自动洗衣机控制器 院 (系): 吴健雄学院 专 业: 电类 姓 名: 王维亮 学 号: 61009319 实 验 室: 103 实验组别: / 同组人员: / 实验时间:2011 年 1 月 1 日 评定成绩: 审阅教师: 1、 申请题目:全自动洗衣机控制器 题目内容:一、 基础部分设计一个全自动洗衣机控制器,它具有三个阀门,分别是冷水阀门、热水阀门和排水阀门(实验中用 3 个 LED 代替) ,当控制输入为逻辑 1 时阀门打开。一个马达用于洗涤和脱水(实验中用 3 个 LED
2、代替) ,控制编码为 2 位二进制数,具体如下表所示。系统有 6 个数码管,高 3 位分别显示衣物量、洗衣水温和洗衣模式,低三位显示时间。1. 使用者按“F”按钮启动控制器。 2. 使用者选择待洗衣物的数量。通过按键输入 1、2 或 3 ,加上 “ E“ 选择“少” 、 “中”或“多”的衣物量,选择结果在最高位数码管显示。控制器将根据这个输入值,控制注入洗衣机内的水量,其中“少”为 30 秒水量, “中”为 40 秒水量, “多”为 50 秒水量。 3. 使用者选择洗衣水温。通过按键输入 1、2 或 3 ,加上 “ E“ 选择“冷” 、“温”或“热”的洗衣温度,选择结果在次高位数码管显示。控制
3、器将根据这个输入值通过控制冷水和热水阀,加入合适的冷水和热水,使水温达到所选的温度。其中“冷”为全部加冷水, “温”为一半时间加冷水,一半时间加热水;“热”为全部加热水。 4. 使用者选择洗衣模式,通过按键输入 1、2 或 3 ,加上 “ E“ 选择“轻柔”、 “普通”或“重垢” ,选择结果在第三高位显示。其中“轻柔”模式马达慢速旋转,洗衣时间为 30 秒, “普通”模式马达中速旋转,洗衣时间为 40 秒, “重垢”模式马达高速旋转,洗衣时间为 50 秒,所有模式中每隔 5 秒转换旋转方向。 5. 数据输入过程中如果输错,可以按“C ”清除,系统回到 AA 等待状态 6. 所有数据输入完毕后,
4、使用者按下 “F”键开始。此时低三位数码管显示完成整个洗衣过程所需的总时间,并开始倒计时,控制器将根据预置的模式在特定的时间将相应控制信号送到洗衣机的相应单元。其中洗衣结束后放水阀门打开,等待 20 秒后开始甩干,甩干用时 20 秒,当衣物完全洗好后,控制器控制 LED 闪烁 3 下进行提示。 二、提高部分(30%) 1. 用 5 个 LED 模拟显示水位,加水时每 10 秒点亮一个,放水的时候每 4秒熄灭一个;(10%) 2. 用 5 个 LED 模拟马达,马达转动的时候 4 灭一亮,顺时针时从左到右循环,逆时针是从右向左循环,循环速度和转速相关;(10%) 3. 提供预设模式功能,可存储
5、10 种洗涤模式( 衣物量、洗衣水温、洗衣模式预先设定好),设定过程如下:(10% ) a) 在基本功能 2 中,按下“A ”键,选择“自定义”模式,显示“0” ,直接按下“E”键,表示选择 “0”号预置洗涤模式,此时显示该模式的衣物量、洗衣水温和洗衣模式。也可用键盘输入“0”到“9”中的任何数字选择相应预置洗涤模式,按“E”确认。选择完成后按“F ”按钮开始训练。 b) 在基本功能 2 中,按下“B”键,选择“自定义 ”模式,显示“0” ,用键盘输入“0”到“9”中的任何数字选择要设置的预置洗涤模式,按下“E”键,显示该模式原来预置的衣物量、洗衣水温和洗衣模式,参考基本功能 2,重设预置衣物
6、量,按“E”确认,参考基本功能 3,重设洗衣水温,按下“E”键确认,参考基本功能 4,重设洗衣模式,再按下“B”键存储预设值,回到基本功能初始状态。2、状态机设计思路: 功能、指标、规模1) 功能“两步走”首先,在仔细分析题目要求之后发现,从宏观上看整个过程可分为设置参数(包括洗衣服数量、洗衣水温、洗衣模式)和计数即洗衣过程。因此,这两个部分可分别设置一个状态机进行控制。而为了使两个大的过程之间过渡顺利,需要在设置参数的过程完成之后产生一个信号,控制计数过程的开始。2) 指标大的思路有了之后,再细细划分。首先,设置参数的状态可分为:等待;启动键盘;设置洗衣数量;确认(如果设置错了可返回前一个状
7、态) ;设置洗衣温度;确认(设置错了可返回前一个状态) ;设置洗衣模式;确认;结束参数设置并进入计时过程。共 8 个状态,用 4 位二进制码表示为0000,0001,0010,0011,0100,0101,0110,0111,1000.注:在设置参数过程中如果出错,按 C 键表示重新设置当前参数,按D 键表示回到等待状态,需要启动键盘后再重新从头设置。而题目中要求的是直接回到等待状态从头设置。但考虑到实际情况中,特别是需要设置的参数很多的时候,我们不可能中间输错后再从头设置,因此这算是自己的一个小小的改进,更加符合现实应用。进入计时过程后,可分为等待状态、注水(waterin) 、洗衣(was
8、h) 、排水(waterout) 、甩干( dry)5 个状态,用二进制码表示为000,001,010,011,100。3) 规模ROM+161+138在设置参数时,由于下个状态与键盘按哪个键以及当前所处的状态都有关系,涉及到的情况比较冗杂。因此,设置参数过程的状态转换可以通过编写一块 ROM 来实现。由键盘 8 个输入加上上个状态的 4 位二进制码输出下个状态及对应键盘按下的键的 BCD 码(为了数码管的显示) ,即 12 输入8 输出的 ROM。而计数过程的状态比较简单,因为其状态的转换时固定死的,用一块161 加一块 138 就可实现。 面板(显示) 、操作、规则1) 面板(显示)数码管
9、:利用 3 个数码管显示所设置的洗衣数量、洗衣温度、洗衣模式,再利用 2 个数码管显示洗衣数量对应的注水时间倒计时;2 个数码管显示洗衣模式对应的洗衣时间倒计时;2 个数码管显示 20 秒排水时间倒计时; 2个数码管显示甩干时间倒计时。这样共用 11 个数码管。LED 灯: 5 个 LED 灯显示水量(注水时每加 10 秒亮一个灯,排水时每4 秒灭一个) ;2 个 LED 灯显示注入的是冷水还是热水;5 个 LED 灯显示洗衣和甩干时马达的正传反转;1 个 LED 灯显示洗衣结束时的闪烁。注:题目要求用 6 个数码管,是想要用 2 个数码管同时显示 4 个状态的倒计时。其实很容易实现,只要用计
10、数状态作控制端的数据选择器就可以实现,之所以坚持没改,是因为考虑到实际生活中,倒计时应该分别显示,不同的位置显示不同状态的倒计时,这样看起来更清晰,更人性化,而且成本也增加不了多少。2) 操作及规则按 F 启动键盘,此时输入 1,2,3 中的一个数字选择洗衣数量,按 E 键确认,按 C 键重设,按 D 键则回到等待装态(如果按非 E,C ,D 键,则没有反应,停留在当前状态) ;之后按照上述操作分别设置洗衣温度、洗衣模式;之后按 F 键开始自动倒计时。首先注水倒计时,每注 10 秒水位灯亮一个;注水完成后为洗衣,此时马达开始工作,此时指示灯每 5 秒改变流动方向,表示每 5 秒马达改变转动方向
11、;之后是排水,每 4 秒水位灯灭一个;最后为甩干,此时马达按上述规则运转;最后 3 秒指示灯闪烁 3 下表示洗衣完成。 输入、输出接口1) 设置参数阶段的状态机输入输出:由前面的分析知道,每个状态都是由键盘的输入和上个状态来决定的。因此,其输入为键盘的 8 位及上个状态的 4 位,共 12 位;输出为下个状态的 4 位及键盘输入的数字的 BCD 码 4 位,共 8 位。2) 计时阶段的状态机的输入输出:此状态机的功能相对单调,即上一个状态结束后便进入下一个状态。因此输入为上个状态完成的信号,包括注水、洗衣、排水、甩干这 4 种计时完成时产生的信号;输出为下个状态开始的信号,为 138 的 4
12、个输出端(这 4 个输出控制是哪一个阶段的计时) 。3、实现方案: 核心问题1) 状态转换当然是首先要考虑的核心问题。而由上述分析,整个过程分为了设置参数和计时两个大的阶段。每个阶段内的状态转换在前面都做了详细的阐述。两个大阶段之间怎样衔接是一个值得考虑的核心问题。2) 另外,设置参数时选通不同存储器( 161)进行存储也是一个值得考虑的问题。3) 倒计时的实现方法。 解决方案1) 对于核心问题 1) ,仔细观察发现,参数设置阶段的最后一个状态恰为 1000,即恰好在最高位产生了一个 1 信号,我们完全可以通过这个 1 信号启动计时阶段的开始。 (将其接到计时阶段状态机的 161 的 clea
13、r 端,当1 信号到来时解除清零状态,开始倒计时)2) 对于核心问题 2) ,可以这样设置:进入清零状态( 0001)时,通过load 端选通衣服数量存储器,同时对温度、模式存储器异步清零;进入数量确认状态(0011)时,通过 load 端选通温度存储器,同时对模式存储器异步清零;进入水温确认状态(0101)时,通过 load 端选通模式存储器。这样便实现了不同状态下选通不同存储器进行存储的问题。3) 对于核心问题 3) ,在小型数字系统设计(交通灯控制器)中,我是通过烧制 ROM 将正计时对应到倒计时,后来一想,只要把 161 的输出端分别加一个非门就由正计时转到倒计时了。本实验就是采用后者
14、实现,这样就避免了烧制 ROM 的麻烦。4、系统结构: 系统框图 模块功能描述1) Keyboard(键盘):对键盘进行行扫描,当有按键按下时,将按下的键存储,送入 control。2) Control(控制):包含两个状态机,实现状态转换。设置参数时,在当前状态下按下某键时进入下一状态;计数时,根据一个阶段计时完成的反馈信号,控制进入下一计时阶段。3) Set(设置参数):是 keyboard 和 control 两部分的集成。能够由键盘输入完成参数的设定,并包含计时阶段的状态机。4) Waterin(注水):参数设定完成后开始倒计时(时间由设定的洗衣数量决定) ,计时完成后反馈给 cont
15、rol 状态机。另外,此模块还控制着表示水量的 5 个 led 灯亮灭(10 秒钟亮一个)和表示加冷水热水的 2 个 led 灯。5) Wash(洗衣):根据洗衣模式的设定决定倒计时的时间,计时完成后反馈给 control 状态机。另外,此模块还控制着表示马达转向和转速的 5 个 led 灯。6) Waterout(排水):20 秒的倒计时,并控制表示水量的 5 个 led 灯,4 秒钟灭一个。7) dry(甩干):20 秒的倒计时,并控制着表示马达转向和转速的 5个 led 灯。8) ShowAmmount(水量显示):由于表示水量的 5 个 led 灯由waterin 和 waterout
16、 两个模块控制,因此单独拎出一个模块来控制水量显示的 5 个 led 灯。此模块受 waterin 和 waterout 两个模块控制。9) Work(计时):注水(waterin) 、洗衣(wash) 、排水(waterout) 、甩干(dry)四个模块的集成。它受 control 控制,每完成一个阶段的倒计时,都产生一个信号反馈给 control,并由 control 控制进入下一个阶段的倒计时。10) Integration(总电路):set 和 work 两个模块的集成,是总模块。 模块接口标注(参数、协议)电路图接口 释义 芯片接口 面包箱接口CLK1 1HzTTL 方波脉冲 PIN
17、_73 P1CLK100 100HzTTL 方波脉冲 PIN_72 P2CLK1000 1000HzTTL 方波脉冲 PIN_71 P3outcol0 PIN_70 P4outcol1 PIN_69 P5outcol2 PIN_68 P6outcol3加到键盘上的扫描信号PIN_67 P7col0 PIN_62 P8col1 PIN_61 P9col2 PIN_60 P10col3键盘 4 列的 4 个输入PIN_59 P11row0 PIN_58 P12row1 PIN_57 P13row2 PIN_56 P14row3键盘 4 行的 4 个输入PIN_55 P15AmmountLED0 P
18、IN_54 P16AmmountLED1 PIN_53 P17AmmountLED2 PIN_52 P18AmmountLED3洗衣量(接到数码管)PIN_51 P19TempretureLED0 温度(接到数码管) PIN_50 P20TempretureLED1 PIN_49 P21TempretureLED2 PIN_48 P22TempretureLED3 PIN_47 P23ModelLED0 PIN_42 P24ModelLED1 PIN_41 P25ModelLED2 PIN_40 P26ModelLED3洗衣模式(接到数码管)PIN_39 P27waterin_count0 P
19、IN_38 P28waterin_count1 PIN_37 P29waterin_count2 PIN_36 P30waterin_count3 PIN_35 P31waterin_count4 PIN_34 P32waterin_count5注水倒计时PIN_33 P33wash_count0 PIN_32 P34wash_count1 PIN_31 P35wash_count2 PIN_5 P36wash_count3 PIN_4 P37wash_count4 PIN_3 P38wash_count5洗衣倒计时PIN_2 P39waterout_count0 PIN_144 P40wat
20、erout_count1 PIN_143 P41waterout_count2 PIN_142 P42waterout_count3 PIN_141 P43waterout_count4 PIN_140 P44waterout_count5排水倒计时PIN_139 P45dry_count0 PIN_134 P46dry_count1 PIN_133 P47dry_count2 PIN_132 P48dry_count3 PIN_131 P49dry_count4 PIN_130 P50dry_count5甩干倒计时PIN_129 P51hotwaterin PIN_126 P54coldwa
21、terin 冷热水指示灯 PIN_125 P55showAmmount1 PIN_124 P56showAmmount2 PIN_123 P57showAmmount3 PIN_122 P58showAmmount4 PIN_121 P59showAmmount5水量指示灯PIN_120 P60motordir1 PIN_119 P61motordir2 PIN_114 P62motordir3 PIN_113 P63motordir4马达转向转速指示灯PIN_76 IO/GSR2motordir5 PIN_127 P53doneLED 洗衣完成时的闪烁 PIN_128 P525、状态流程图:
22、 系统工作状态流程清 00001设置模式0110设置水温0100数量确认0011设置数量0010F 键13 键非 F 键C 键初态0000F 键非 13 键E 键非 E,C 键 非 13 键13 键E 键C 键非 E,C 键E 键C 键13 键洗衣计时1000模式确认0111非 F 键水温确认0101非 13 键等待000注水001高位出现的 1 信号使得计时状态由 000进入 001,此时计时状态机开始起作用。洗衣010排水011甩干100甩干倒计时完成后产生的信号使所有计时清零,回到初始状态在参数设置状态机起作用时,其中任意一个状态下按 D 键都会回到初态(0000)6、各主要模块图与仿真
23、波形 各模块的仿真波形,详细注释输入输出功能端口,波形意义1) 键盘部分keyboard最上层为时钟,接下来的 5 组波形分别为扫描信号、输入 col、输入row、输出 col、输出 row。红色线圈里面是人为设置的按下一个键的输入信号(col 为 1011,row 为 1101) ,可见,输出了蓝色线圈所示的按键信号(colout 为 1011,rowout 为 1101). 与预想功能相符。2) Control 部分的波形仿真a) 参数设定状态机模拟在特定状态下按下特定键时,状态的转换如上图所示,前两行为 1Hz 和 1000Hz 的时钟信号。可见,在 0000状态下当模拟按下 F 键时,
24、状态过渡到 0001 状态,表示键盘启动;紧接着模拟按下 2 键,状态过渡到 0010,BCD 码(接到数码管)输出 0010,表示设定了洗衣数量为 2,此时会在洗衣数量对应的数码管显示 2.红色线圈为状态转换的瞬间。与预想功能相符。b) 计数状态机模拟一个计数完成后进入下一个计时阶段。如图当参数设定状态机进入 1000 状态时,意味着开始计时,waterin变为 1,即开始注水,如红方框 1 所示;当注水完成,waterinOK 产生一个脉冲,使得状态转入洗衣阶段,即 wash 变为 1,如红方框 2 所示;当洗衣完成,washOK 产生一个脉冲,使得状态转入排水阶段,即 waterout
25、变为1,如红方框 3 所示;当排水完成,wateroutOK 产生一个脉冲,使得状态转入甩干阶段,即 dry 变为 1,如红方框 4 所示;当注水完成,dryOK 产生一个脉冲,使得状态转入初始状态,洗衣结束。与预想功能相符。3) Wash 模块模拟洗衣倒计时及此时马达转向。第一行为时钟,第二行为 wash,它为 1 时马达转动,进入洗衣阶段,为 0 时马达停止转动。High 和 low 分别表示倒计时的十位和个位数。Motordir 为表示马达转向和转速的 5 个 led 灯,从图中看出,每 5 秒钟,马达就会变换方向。当倒计时到 0 时,washOK 产生一个单脉冲,反馈给控制端,转入下一
26、个状态排水的倒计时。与预想功能相符。对于 waterin(注水) 、waterout(排水) 、dry(甩干)这三个模块与wash 模块大同小异,经过模拟,都与预想功能相符。这里就没有必要每一个都进行分析了,详见工程中的波形文件。4) ShowAmmount 模块模拟水量 led 灯的亮灭1234第一行为注水时每 10 秒产生的信号,第二行为排水时每 4 秒产生的信号。下面 5 行分别代表 5 个 led 灯的亮灭(1 表示亮,0 表示灭) ,可见,注水时,每过 10 秒,会顺次有一个 led 亮;直到 5 个 led 都亮;而排水时,每过 4 秒,都会顺次有一个 led 灯灭,直到 5 个
27、led 灯都灭。与预想功能相符。5) Integration 模块整体电路模拟由于整个过程是一个漫长的过程,无法整体显示,下面截取的波形的几个重要部分(按照洗衣数量为 2,温度为 2,模式为 3 进行模拟):a) 开始注水,如红线圈所示,waterin_high 和 waterin_low 表示注水倒计时的高位和低位。b) 由于设定温度为 2,即一半冷水一半热水,所以在前 20 秒注冷水,后 20 秒注热水,其转换瞬间如下图所示,hotwater 表示注热水,coldwater表示注冷水:c) 注水结束开始洗衣以及洗衣结束开始排水的瞬间,wash_high 和wash_low 分别表示洗衣倒计
28、时的高位和低位;waterout_high 和waterout_low 分别表示排水倒计时的高位和低位;dry_high 和 dry_low 分别表示甩干倒计时的高位和低位。d) 洗衣结束后 led 灯闪烁三下, doneLED 即表示该 led 灯,如红线圈所示:7、设计总结 预期的目标与当前实现功能的差异提高部分 3 的预设功能没有实现。 调试过程中出现的问题分析及其解决措施问题:注水倒计时完成后无法转入洗衣倒计时。解决措施:仔细分析,最终找到了原因:计数初态为 000,本来使用设置参数状态的高位以及倒计时部分注水完成、洗衣完成、排水完成、甩干完成产生的信号的或作为计时状态机的触发信号。而
29、设置参数完成后,高位产生的 1 信号触发计时状态机,进入 001 状态,即开始注水。而此时设置状态机的高位一直保持为 1,因此注水完成后产生的单脉冲便不起作用了(它们的或作为触发) 。找到原因后,解决起来便很简单了。可以在计时状态机的触发端前加一个非门,靠下降沿触发。并把设置状态机高位改为它的非,再和其他倒计时完成产生的信号相或,经过设置的非门接到计时状态机的触发端。问题得到解决!其他便没有什么大问题了。 可以进一步发挥提高的部分a) 首先,当然是预设功能了。b) 这点前面讲到了:在设置参数过程中如果出错,按 C 键表示重新设置当前参数,按 D 键表示回到等待状态,需要启动键盘后再重新从头设置
30、。而题目中要求的是直接回到等待状态从头设置。但考虑到实际情况中,特别是需要设置的参数很多的时候,我们不可能中间输错后再从头设置,因此这算是自己的一个小小的改进,更加符合现实应用。这点在我的电路中已经实现。c) 这点也在前面讲到了:题目要求用 6 个数码管,是想要用 2 个数码管同时显示 4 个状态的倒计时。其实很容易实现,只要用计数状态作控制端的数据选择器就可以实现,之所以坚持没改,是因为考虑到实际生活中,倒计时应该分别显示,不同的位置显示不同状态的倒计时,这样看起来更清晰,更人性化,而且成本也增加不了多少。这点在我的电路中也已经实现,虽然被老师说为不符合题目要求。 设计体会1) 在本学期最后
31、的这个实验很好地体现了从底层到顶层的设计思想,我也在亲身设计中真切的感受到了这一点。把大的功能划分成小模块,分别实现了各个模块的功能后,再按照逻辑有机结合起来,去实现总的功能。虽然中间不免出现一些错误,但有了整体思想作指导,我们总能把问题找出来,并解决掉。2) 不积跬步,无以至千里。在设计每一个小模块时,就要认真谨慎,再严谨都不为过。这一点,在拼凑小模块去实现大的功能时便很好地体现出来了。因为一开始,我很小心地做了每一个模块,因此,在后期整合时便相对顺利了。我想,下学期的实验中,一定要把这种态度延续下去,甚至渗透到生活中的点点滴滴。3) 出错时,切勿盲目乱改,而是通过出现的错误结果从后向前仔细分析可能的原因。之所以感受到这点,是看到身边的有些同学发现错误时就不知所谓,乱改一番,只能错上加错。借他人之鉴,提高自身实验素质。