数字逻辑实验报告
---全自动洗衣机系统
数字逻辑实验报告
全自动洗衣机系统设计 ------
一、实验目的
通过硬件描述语言VHDL的编程,深入了解并掌握可编程芯片的使用技术,
完成规定的设计任务,加强对《数字逻辑》课程所学知识的理解,培养创造性思
维能力和独立解决实际问题的能力。
二、实验所用到的仪器和组件
• 可编程芯片ISP1032E
位于实验箱右半部,可用的芯片引脚68个
• DICE-SEM实验箱
• 逻辑开关:一排16个,K0~K15
• 按钮开关:2个,P1~P2
• 显示灯:一排16个,L0~L15
• 七段译码显示器:6个(8421码驱动显示)
• 输出直流电压:5V?0.1V
• 输出直流电流:2.5A
• 钮子开关、单脉冲按钮、指示灯若干
• 时钟信号:1Hz, 10Hz,…
• 引线若干
三、实验
设计方案
关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案
及逻辑图
1.洗衣机控制面板图:
2.界面功能介绍:
在该图中,圆形
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示按钮,小方框表示指示灯,大方框表示数码管,用一个单独
的数码管来显示设定的水位,另外两个数码管显示目前所处工作状态的剩余时
间。
(1) 输入:电源开关(电平),启动/暂停按钮(脉冲信号),洗衣模式(脉冲
信号),水位控制(脉冲信号)。
(2) 输出:指示灯(电源开关指示灯,启动暂停指示灯,洗涤指示灯,漂洗指
示灯,脱水指示灯。
数码管:用两个数码管来显示剩余时间,由三种工作状态的剩余时间公用,
即洗涤时间(12分钟),漂洗时间(6分x 2次),脱水时间(3分钟),在
进行洗衣模式选择时则显示为该模式的总时间。一位数码管显示水位。
3.洗衣机的设计具体要求:
(1)洗衣机有六种洗衣模式:标准洗,单洗,洗漂,单漂,漂脱,单脱。各模
式所包含的工作状态时间如下:
• 标准洗模式下,洗衣机先洗涤12分钟,然后洗涤6分钟x2次,最后脱水
3三分钟。
• 单洗模式下,洗衣机只洗涤12分钟
• 洗漂模式下,洗衣机先洗涤12分钟,然后漂洗6分钟 x 2次。
• 单漂模式下,洗衣机只漂洗6分钟 x 2 次。
• 漂脱模式下,洗衣机先漂洗6分钟 x 2次,然后脱水3分钟。
• 单脱模式下,洗衣机只脱水3分钟。
在上面6中模式运行时间内,都可以随时按“启动/暂停”键在启动运行和暂停运行两者之间切换。启动运行时继续执行刚才被暂停的未完成的工作流程。在
一个洗衣模式下的所有流程完成后,洗衣机进入标准模式,同时如果5分钟没有按“启动/暂停”键来启动运行它们,系统将自行断电。 (2)在选择洗衣模式时,两个数码管会显示新的洗衣模式的总时间。“洗涤”,
“漂洗”和“脱水”指示灯也会随着新的洗衣模式的变化而变化。某个指示灯亮,
表示在本洗衣模式中包含对应的工作流程,反之则不包含。这样在操作时会很方
便的了解每个洗衣模式下的所有的工作流程。在洗衣机工作时,已完成的或者不
会执行的洗衣工作所对应的指示灯熄灭,而正在执行的洗衣工作对应的指示灯闪
烁,稍后准备执行的但还没有开始的指示灯亮。如果在洗衣机工作时按“启动/暂停”键,则正在闪烁的变量。
(3)系统启动期间不允许改变工作状态。必须按“启动/暂停”使系统暂停 然后才可以选择洗衣状态。洗衣流程如下:
洗衣模式 总时间 洗涤指示灯 漂洗指示灯 脱水指示灯 标准洗 27 亮 亮 亮 单洗 12 亮 灭 灭 洗涤 24 亮 亮 灭 单漂 12 灭 亮 灭 漂脱 15 灭 亮 亮 单脱 3 灭 灭 亮
(4)系统工作时,“启动/暂停”指示灯亮;系统暂停或者电源关闭时“电源”
开关为关,“启动/暂停”灭。
(5)对电源开关的操作相当于上电和关闭电源。电源接通时将开关拨到开,电
源指示灯亮,洗衣模式变成标准洗,系统处于暂停状态。此时可以设置水位,选
择模式;当关闭电源后,个指示灯熄灭,停止工作。 (6)一个洗衣模式至少包括一个流程,每个流程的时间如上面的表格所示。在
工作时数码管的示数减小,知道结束。如果结束后没有采取操作,系统超时会自
动断电。
(7)水位按钮和水位指示数码管是一个独立的模块。水位值有一个固定的范围,
即4~8,初始值为6。每按一下“水位”,则水位数加1,超过8时变成最小值4.
(8)在按每个按钮时,都要发出“嘟”的一声报警声,在每个洗衣模式所有的
程序结束时,发出“嘟嘟嘟”的报警声,响30秒停止,自动执行“电源”开关关的所有工作。
4.设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
上电(自动暂停)
设定水位
选择洗衣模式
启动工作
暂停?是
否工作完成
跳电
5.逻辑图和流程图
以下简单绘出图样,因变量太多用各个模板实现之,对于其中部分信号的驱动,
由于是和上一个模块的输出有关,所以部分变量或信号时间上是上一个的结果,
这里也当做输入,而且,对于一个模块的输入,由于判断条件很多,所以往往也
需要很多的状态标志位,如water(水位),start(电源开启)„„„„
ClkTime信号确定状态s0~s5StateStart_workWork_time
State(s0~s5)
数码管信号Water_level状态标记water
power
灯的状态及数码管状态标记start_lightPause
每一个按键动作
灯的闪烁PowerOnPlay_sound
State状态
Light信号Start,changedLight_control
暂停信号
Light信号及数码管TimeMode_select
四、实验步骤与实验记录:
1. 在进行设计之前首先进行设计需求
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
。本部分包括对功能的详细了解,以
及对各种实现细节的分析。首先将这个具体的系统分成如下模块:水位控制模块,
模式选择模块,声音模块,指示灯显示模块,启动暂停模块,初始化模块。另外,
对于一些作为判断和选择的模块,采用一个有限状态机来控制。通过这个状态的
形式来
决定
郑伟家庭教育讲座全集个人独资股东决定成立安全领导小组关于成立临时党支部关于注销分公司决定
执行相应的操作。
2. 模块功能细化。此部分的任务是将每一个模块的功能分布分析之,然后逐个
的实现。前提是,我们需要对VHDL语言有一个初步的理解和认识,在掌握了语
法和规则之后,将我们的思路用代码的形式来实现之。此部分也是实现部分的关
键,对于这个部分的把握不好,会造成后面调试的困难。
3. 具体说说实现的部分。
(1):首先分析知道对于水位控制部分是独立的一个模块,也是相对而言比较简单
的部分。此部分控制变量有两个,一个是水位控制的输入,一个是当前的状态,
这个包括电源指示灯和启动/暂停的状态等等。默认情况下为6,而对于在暂停,并且电源为开的时候,需要考虑水位控制的影响,也就是一个脉冲信号的输入。
采取的方式就是多次if判断,只有在暂停和开关处于开的状态下面才可以接受脉
冲信号,然后根据每一次脉冲得上升沿触发的时候来递增,同时赋值给输出信号,
使得相应的指示灯发生变化,显示相应的示数;否则的话,就保持初始的示数为
默认值6.(详细的代码见water_level部分)
(2):然后是声音模块和自动断电模块。此部分的功能也比较简单。声音模块只要
访问到有按钮被按下就将sound赋值为1,表示要发声。注意此处又要进行判断,
对于在有电源(power=1),并且选择水位和模式(也就是这两种输入),根据相
应情况下对sound赋值就可以了。然后注意在声音和断电模块的时候,由于也要
发声,所以需要接始终脉冲,用这个表示相应的时间,这样响30秒就是在count
为30的时候逐个的减少,对应的sound和clk就是需要不断的变化,指示灯也是闪烁,这样就可以实现该模块部分了。
(3)最后部分就是主体部分,对于信号驱动的,对于时间信号,由于时间一直都
是在不断进行的,所以时间驱动一直在进行,但是不同工作状态的标志是不同的,
比如电源是power,而开关start,所以很多判断的条件不同(if判断不同的标志位),利用有限状态机,设定不同状态s0 ~ s5,比如我初始化的时候时间就在一直,
然后记下状态,这样再根据这个,来判断状态。判断洗衣模式,而计时是靠时钟
脉冲的改变来触发的。根据时间信号得到洗衣模式信号,并执行该洗衣模式,同时也是由时间来决定的。至于选择模式的时候显示,这部分是用很多if来判断,
此部分需要理清逻辑,注意很多不同的判断条件来决定操作,而具体的状态的改
变通过信号的赋值来实现。
4. 在实验的过程中记录每个开关对应的LED灯和相应的示数状态, 最后的问题就是调试的问题,此部分很多写代码过程中没有发现就遇到了。而这
部分依赖于对机器的了解和对软件的熟悉。通过不断的改写代码和同学之间的讨
论和尝试来实现。
以下记录为各信号与对应的引脚排布:
Mode 5 模式选择(P1) Power 7 电源开关(K1) Start 9 暂停/启动(K16) Water 11 水位控制(P2) Dry_light 12 脱水灯(L11) Piaoxi_light 13 漂洗灯(L10) Power_light 14 电源开关灯(L1) Show_0 (0 ~ 3) 33, 34 , 35 ,36 剩余时间数码管的十位 Show_1(0 ~ 3) 46,47,48,49 剩余时间数码管的个位 Sound 51 声音(L16) Start_light 26 启动/暂停灯(L4) Washing_light 27 洗涤灯(L9) Water_level( 0 ~ 3) 29,30,31,32 水位控制数码管
五、对观察结果的分析、处理、讨论
实验中通过对观测的结果的分析和讨论可以早点发现代码中的问题,然后调
试发现相应的问题。实验结果中遇到的问题很多,下面就几点来说说。
编译通过但是没有正确运行。这个问题是最常见的问题,比如在开始的时候
写的代码可以编译通过,然后烧制到芯片中,可是之后再检测的时候就发现出现
问题。对于此类问题,觉得还是逻辑错误,比如我在原来的代码中用到了多次if表达,可是漏掉了极端情况的判断,而这个情况正是初始情况,所以就造成了错
误。还有可能我们对于VHDL基本的语法都不是很理解,这部分造成了程序不是
按照我们的想法来运行的,比如说wait „„until语句的时候,如果在程序中直
接对一个信号赋值,process里面的语句是顺序执行的,而外部的每一个进程则
是并行执行的,所以实际上赋值是在后面进行的,而不是马上就进行。这样我得
到的结论是在一般的设计中 尽量避免process中使用wait语句,一般采用敏感变量的形式,这个错误产生的原因可能是因为clk并没有发生状态变化吧。 其实wait语句没有起到作用。当然,还有很多其他的错误造成这种情况,我觉得
主要还是对于VHDL这种特殊的语言的理解不同造成的。
其次,开始我采用的是元件例化语句(port map),将每一个模块的都作为一
个单独的VHDL文件来保存,然后写顶层文件(top),可是发现在例化的过程中
会有问题,单独一个vhdl文件没有什么问题,编译运行正常通过,实际中发现
很多同学遇到相同的问题,大部分是因为信号的赋值出错了,还有其他逻辑错误,
最后决定采用敏感信号,作为一个vhdl文件来处理,虽然结果略显复杂,可是
还是能够正常运行。
还有其他操作问题,比如说脉冲信号和开关信号时不同的。对于启动暂停,
还有调节水位的部分,如果将连线接到了开关处,即使你来回的波动开关,也不
能达到脉冲的效果,这个结果是在当我们实现脉冲控制的时候,由于实验台上的
脉冲信号开关不够,所以借用了单刀单掷开关来实现,可是结果不对,后来检查
电路,发现没有问题,就将开关探测性的接到脉冲,这样就实现了功能。
还有,在测试的前期,发现每次测试的时候结果都不对,没有反应,而代码
没有问题,即使是很简单的问题,开始怀疑是试验台的问题,后来排除,发现是
烧制完成后连线没有拔掉,这个造成了测试的数据不对。
六、实验体会
最后想说说自己的体会:在这次数字逻辑实验中,我发现VHDL和我们实现
的过去的C语言不同,这个也是我认为本实验中最大的难点。过程化的思想和科
学的模块化分析对于我们计算机系的学生来说是很容易想到的,可是要实现这个
功能,借助于VHDL这么新的语言,需要我们对于语言本身有更多的理解,确实
掌握一门语言我觉得还是很难,特别是当我们认为自己的代码没有问题可是在上
机的时候出现很多奇怪的问题的时候,需要我们花费大量的时间来搞清楚,语言
的细节很重要。我认为这个实验中语言本身的问题是最大的,其次是根据编译器
错误信息来找到错误。VHDL语言我认为最大的特点就是进程的特别,变量的类
型繁多,以及在赋值过程中的很多我们没有意识到的后台操作。过程语句和进程
语句的区别,这种硬件描述语言不同之处在于并行执行语句,和我们过去认为的
语言的按照次序执行的不同。最后,这个实验让我了解到了VHDL这门新的语言,对于数字逻辑的设计也有了一个新的认识,模块化分支设计的思想也得到了加
强,对于复杂电路的分析和设计有了一个新的认识!
七、实验方案的改进意见
实验的最后这个蜂鸣模块没有实现,每次按下按钮的时候应该出现声音,但
是在实现过程中没有做好,所以结果每次按键的时候没有声音,也就是没有闪烁;
但是最终的时候实现了自动断电,就是30秒没有按键动作后就自动关机。
改进意见是:单独将这个模块拿出来,然后编译,用波形仿真来探测。最后再回
到源代码中重新实现,这部分实现应该是与其他的接口部分没有做好,需要时间
来调试。
附:源代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity washer is
port ( power: inout std_logic;
clk: in std_logic;
start: in std_logic;
mode: in std_logic;
water: in std_logic;
show_1: out std_logic_vector(3 downto 0);
show_0: out std_logic_vector(3 downto 0);
sound: out std_logic;
water_level: out std_logic_vector(3 downto 0);
power_light: out std_logic;
start_light: out std_logic;
washing_light: out std_logic;
piaoxi_light: out std_logic;
drying_light: out std_logic); end washer;
architecture rtl of washer is ------
type states is (s0,s1,s2,s3,s4,s5);
signal current_state:states;
signal oneminute: std_logic;
signal time :integer range 0 to 27;
signal last_time: integer range 0 to 27;
signal stop: std_logic;
signal count: integer range 0 to 30;
signal changed: std_logic;
signal complete: std_logic; begin
start_work: process(clk) --, begin
if power_light = '1' then
if start_light = '1' then
if clk'event and clk = '1' then
if time > 0 then
last_time <= time;
time <= time-1;
end if;
end if;
else --
if changed = '1' then
case current_state is
when s0=> time <= 27;
when s1=> time <= 12;
when s2=> time <= 24;
when s3=> time <= 12;
when s4=> time <= 15;
when s5=> time <= 3;
when others=> null;
end case;
end if;
end if;
else
time <= 27;
end if;
end process start_work;
work_time: process(time) --,
variable temp: integer range 0 to 15;
begin
if power_light = '1' then
if start_light = '0' then
if changed = '1' or time = 27 then
case current_state is
when s0=> show_1 <= "0010";
show_0 <= "0111";
when s1=> show_1 <= "0001";
show_0 <= "0010";
when s2=> show_1 <= "0010";
show_0 <= "0100";
when s3=> show_1 <= "0001";
show_0 <= "0010";
when s4=> show_1 <= "0001";
show_0 <= "0101";
when s5=> show_1 <= "0000";
show_0 <= "0011";
when others=> null;
end case;
end if;
else
case current_state is
when s0=> if time > 15 then
temp := time-15;
elsif time > 3 then
temp := time-3;
else temp := time;
end if;
when s1=> temp := time;
when s2=> if time > 12 then
temp := time-12;
else temp := time;
end if;
when s3=> temp := time;
when s4=> if time > 3 then
temp := time-3;
else temp := time;
end if;
when s5=> temp := time;
when others=> null;
end case;
if temp >9 then
show_1 <= "0001";
temp := temp-10;
else show_1 <= "0000";
end if;
case temp is
when 9=> show_0 <= "1001";
when 8=> show_0 <= "1000";
when 7=> show_0 <= "0111";
when 6=> show_0 <= "0110";
when 5=> show_0 <= "0101";
when 4=> show_0 <= "0100";
when 3=> show_0 <= "0011";
when 2=> show_0 <= "0010";
when 1=> show_0 <= "0001";
when 0=> show_0 <= "0000";
when others=> null;
end case;
end if;
else
show_1 <= "0000";
show_0 <= "0000";
end if;
end process work_time;
pause: process(power,start) --/
begin
if power_light = '1' then
if start'event and start = '1' then
start_light <= not start_light;
end if;
if time = 0 and last_time = 1 and start_light = '1' then
start_light <= '0';
end if;
else
start_light <= '0';
end if;
end process pause;
light_control: process(time) --,, begin
if power_light = '1' then
if start_light = '0' then
if changed = '1' then
case current_state is
when s0=> washing_light <= '1'; piaoxi_light <= '1'; drying_light <= '1';
when s1=> washing_light <= '1'; piaoxi_light <= '0'; drying_light <= '0';
when s2=> washing_light <= '1'; piaoxi_light <= '1'; drying_light <= '0';
when s3=> washing_light <= '0'; piaoxi_light <= '1'; drying_light <= '0';
when s4=> washing_light <= '0'; piaoxi_light <= '1'; drying_light <= '1';
when s5=> washing_light <= '0'; piaoxi_light <= '0'; drying_light <= '1';
when others=> null;
end case;
else--
case current_state is --
when s0=> if time > 15 then washing_light <= '1';
piaoxi_light <= '1';
drying_light <= '1';
elsif time > 3 then washing_light <= '0';
piaoxi_light <= '1';
drying_light <= '1';
else washing_light <= '0';
piaoxi_light <= '0';
drying_light <= '1';
end if;
when s1=> washing_light <= '1';
piaoxi_light <= '0';
drying_light <= '0';
when s2=> if last_time > 12 then washing_light <= '1';
piaoxi_light <= '1';
drying_light <= '0';
else washing_light <= '0';
piaoxi_light <= '1';
drying_light <= '0';
end if;
when s3=> washing_light <= '0';
piaoxi_light <= '1';
drying_light <= '0';
when s4=> if last_time > 3 then washing_light <= '0';
piaoxi_light <= '1';
drying_light <= '1';
else washing_light <= '0';
piaoxi_light <= '0';
drying_light <= '1';
end if;
when s5=> washing_light <= '0'; piaoxi_light <= '0'; drying_light <= '1';
when others=> null;
end case;
end if;
else
case current_state is
when s0=> if time > 15 then
if time mod 2 = 0 then washing_light <= '0';
else washing_light <= '1';
end if;
piaoxi_light <= '1'; drying_light <= '1';
elsif time > 3 then washing_light <= '0';
if time mod 2 = 0 then piaoxi_light <= '0';
else piaoxi_light <= '1';
end if;
drying_light <= '1';
else washing_light <= '0'; piaoxi_light <= '0';
if time mod 2 = 0 then drying_light <= '0';
else drying_light <= '1';
end if;
end if;
when s1=> if time mod 2 = 0 then washing_light <= '0';
else washing_light <= '1';
end if;
piaoxi_light <= '0'; drying_light <= '0';
when s2=> if time > 12 then
if time mod 2 = 0 then washing_light <= '0';
else washing_light <= '1';
end if;
piaoxi_light <= '1'; drying_light <= '0';
else washing_light <= '0';
if time mod 2 = 0 then piaoxi_light <= '0';
else piaoxi_light <= '1';
end if;
drying_light <= '0';
end if;
when s3=> washing_light <= '0';
if time mod 2 = 0 then piaoxi_light <= '0';
else piaoxi_light <= '1';
end if;
drying_light <= '0';
when s4=> if time > 3 then washing_light <= '0';
if time mod 2 = 0 then piaoxi_light <= '0';
else piaoxi_light <= '1';
end if;
drying_light <= '1';
else washing_light <= '0'; piaoxi_light <= '0';
if time mod 2 = 0 then drying_light <= '0';
else drying_light <= '1';
end if;
end if;
when s5=> washing_light <= '0'; piaoxi_light <= '0';
if time mod 2 = 0 then drying_light <= '0';
else drying_light <= '1';
end if;
when others=> null;
end case;
end if;
else
washing_light <= '0';
piaoxi_light <= '0';
drying_light <= '0';
end if;
end process light_control;
mode_select: process(time,mode) -- begin
if power_light = '1' then
if start_light = '0' and mode'event and mode = '1' then
changed <= '1';
case current_state is
when s0=> current_state <= s1;
when s1=> current_state <= s2;
when s2=> current_state <= s3;
when s3=> current_state <= s4;
when s4=> current_state <= s5;
when s5=> current_state <= s0;
when others=> null;
end case;
end if;
if time = 0 and last_time = 1 then
current_state <= s0;
changed <= '1';
end if;
if time > 0 and start_light = '1' then
changed <= '0';
complete <= '1';
end if;
else
current_state <= s0;
changed <= '1';
complete <= '0';
end if;
end process mode_select;
power_control: process(power,stop) -- begin
power_light <= power;
if power = '1' then
if stop = '1' then
power_light <= '0';
end if;
end if;
end process power_control;
water_control: process(power,water) -- begin
if power_light = '1' then
if start_light = '0' and water'event and water = '1' then
if water_level = "0000" then
water_level <= "0100";
elsif water_level < "1000" then
water_level <= water_level+1;
else
water_level <= "0100";
end if;
end if;
else
water_level <= "0110";
end if;
end process water_control;
time_kicking:process(clk) --,
begin
if power = '1' then
if clk'event and clk = '1' then
if time = 27 and start_light = '0' and complete = '1' then
count <= count+1;
else
count <= 0;
end if;
if count = 30 then
stop <= '1';
count <= 0;
else
end if;
end if;
else
count <= 0;
stop <= '0';
end if;
end process time_kicking;
play_sound:process(power,start,mode,water,count,clk) --
variable num:integer:=0;
begin
if power_light = '1' then
if start = '1' or mode = '1' or water = '1' then
sound <= '1';
elsif clk = '1' then
sound <= '0';
end if;
if count > 0 then
if count mod 2 = 1 then
sound <= '1';
else
sound <= '0';
end if;
end if;
else
sound <= '0';
end if;
end process play_sound;
end rtl;