- 前 言
番茄工作法是简单易行的时间管理方法。使用番茄工作法,它的工作原理是选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟结束,然后进行短暂休息一下(5分钟),然后再开始下一个番茄。我们基于Xilinx公司的EGO1平台,利用现场可编程门阵列FPGA设计了一个番茄钟。除了基本的定时功能之外,还附加了其他功能。主要包括通过按键的控制自行设定工作和休息时间、控制蜂鸣器休息的时候会有音乐响起、记录种下番茄的个数以及休息时间结束后跑马灯亮起5秒。这为番茄工作法的实现提供了一条切实可行的解决途径。
随着现代社会的飞速发展,劳动强度和工作任务也在不断加大,如何充分利用和管理时间,提高工作效率的同时保证充足的休息是人们面临的一个实际问题,为此,番茄工作法被提出并为越来越多的人所接受。
整个系统采用自动向下的层次化设计方法,顶层模块调用秒脉冲产生、60秒倒计时、分钟倒计时、数码管显示、有限状态机、蜂鸣器发声以及跑马灯闪烁来实现创意番茄钟的设计。系统的总体结构如图 2‑1所示,其中最左侧的第一级为三个按键消抖模块,三个按键是用来控制番茄钟休息和工作时间的信号,分别为设置按键、加分钟按键以及减分钟按键,用来控制下一级的分钟倒计时模块。第二级最上方为100MHz的分频模块,经过分频后得到秒脉冲信号。下面是25分钟(5分钟)倒计时模块。第三级最上方是结束信号传输模块,将信号传递给下一级的状态机,主要用来控制25分钟(5分钟)结束后自动转换为5分钟(25分钟)倒计时。第四级是状态机模块,主要控制状态的转换。第五级是60秒倒计时模块,同时输出进位信号到分钟倒计时模块。它的下面是蜂鸣器控制模块,主要用于休息时音乐的播放,愉悦心情。下一级是数码管显示模块和跑马灯模块。
图 2‑1 RTL综合视图
根据番茄工作法,设计的番茄钟可以实现25min和5min倒计时功能。其中25min主要用于定时工作学习,5min用于定时休息。与此同时,用户可以根据个人需要来调节工作和休息时间。通过key_set按键来进入设置状态,进入设置状态后,FPGA板子上面的右侧LED灯会亮起来提醒现在是设置状态,通过Key_addition和Key_subtraction按键来实现分钟的加和减。25min工作倒计时结束后,番茄钟会自动转入5min倒计时状态。25min和5min可实现循环倒计时,也可通过start_stop和load按键分别控制时钟的开始/暂停、状态切换以及置数。每次进入休息倒计时后,蜂鸣器会放出音乐。休息倒计时结束,音乐停止,同时FPGA板子上面的LED灯会闪烁,来提醒一个番茄周期结束了。另外四个数码管用来显示番茄周期数,即每完成一个番茄周期,数码管显示会加一,以供用户总结今天的学习情况。功能如图 2‑2所示。
图 2‑2 FPGA功能模块展示
关于输入输出设计,这部分在总模块会有体现。这里介绍一下。
输入设计,我们使用了FPGA板子上面的100MHz模块clk(P17),用来分频产生秒脉冲等等。然后就是复位信号rst(P5)的输入,这里我们使用一个开关,当复位信号有效时,番茄钟回归初始状态。接下来就是五个按键,左按键key_load和右按键key_start_stop控制时钟的开始/暂停、状态切换以及置数。上按键puls_signal、中间按键set_signal和下按键reduce_signal控制工作和休息时间的长短,通过中间按键进入设计状态,然后通过加法按键和减法按键来实现时间的控制。
输出设计,首先就是数码管,我们使用左边的四位数码管用来显示工作和休息时间倒计时。右边四位数码管来显示番茄的个数。我们利用了FPGA板子上面的LED灯来做信号提醒,当休息状态结束,左侧的LED灯会闪烁,跑马灯来提醒用户休息时间快要结束了。当进入设置时间状态后,右侧的LED灯会亮起。除了这些,还有两个控制端口来控制蜂鸣器。
关于子模块划分,最基本的5个子模块分别是状态机模块、秒脉冲产生模块、60秒倒计时模块、分钟倒计时模块、数码管显示模块以及按键消抖模块。除了这些模块实现基本功能之外,我们还添加了音乐播放模块、跑马灯闪烁模块。这些子模块实现了番茄钟我的功能。模块展示如图 2‑3所示。
图 2‑3 子模块展示
-
- 系统RTL顶层逻辑和子模块设计思路
- 系统RTL顶层逻辑图
- 系统RTL顶层逻辑和子模块设计思路
系统的RTL顶层逻辑图如图 2‑1所示,该图展示出了各个模块以及各个模块之间的连线以及输入输出功能。在层次化的设计当中,常常将比较复杂的电路进行模块划分,分成一个个的子模块,然后在顶层模块中通过实例化连接这些子模块。
系统自带的时钟为100MHz,秒脉冲模块利用计数器进行分频得到1Hz的秒脉冲信号供后续电路使用。秒脉冲模块如图 2‑4所示。
图 2‑4 秒脉冲发生器
消抖模块主要分为三个部分,分别是信号检测、消除抖动以及上升沿输出。我们消抖模块采用的原理是延时消抖。原理大概是检测到边沿后,开始计数,抖动大约5-10ms,这里选择计数15ms,如果计数还不到15ms又检测到上升沿,就清零计数器重新计数,直到连续计数15ms,则产生一个周期的按键标志位脉冲。消抖模块RTL图如图 2‑5所示。
图 2‑5 消抖模块
该模块是整个设计的核心,其中状态的转换、按键的控制、倒计时的控制等都由该模块完成。根据状态转移图,整个系统需要处理七种状态,相互之间有着复杂的转换关系。六种状态分别是:工作初态、工作计数态、工作暂停态、休息初态、休息计数态、休息暂停态以及跑马灯状态。通过按键的输入来进行控制。RTL如图 2‑6所示。
图 2‑6 状态转换及
有限状态机在任意时刻都处于有限状态集合中的某一状态。当其被触发时,将从当前状态转换到另一个状态,或者仍然保持在当前状态。各种状态如图 2‑7所示。
图 2‑7 状态展示
当位于工作初态(WORK_INIT)时,如果触发条件为(key_start_stop==1),那么次态就是工作计数态,如果触发条件为(key_load==1),那么次态就是休息初态,否则维持。当位于工作计数态时,如果触发条件为(key_start_stop==1),那么次态就是工作暂停态,如果触发条件是25min倒计时的结束信号(WorkEnd==1),那么次态就是休息初态,否则维持。当位于工作暂停态时,如果触发条件为(key_load==1),那么次态就是休息初态,如果触发条件为(key_start_stop==1),那么次态就是工作计数态,否则维持。
当位于休息初态(REST_INIT)时,如果触发条件为(key_start_stop==1),那么次态就是休息计数态,如果触发条件为(key_load==1),那么次态就是工作初态,否则维持。当位于休息计数态时,如果触发条件为(key_start_stop==1),那么次态就是休息暂停态,如果触发条件是5min倒计时的结束信号(RestEnd==1),那么次态就是跑马灯状态,否则维持。当位于跑马灯状态时,如果触发条件为(LEDEND==1),那么次态就是工作初态,否则不变。状态转移图如图 2‑9所示。部分Verilog代码如图 2‑8所示。
图 2‑8 Verilog 状态转换部分代码
系统采用八个数码管构成动态扫描的方式显示结果。它接受计数模块送来的倒计时数据,以及番茄个数等信号,编程实现动态扫描数码管的位、查段码表并输出段码的方式将信号输出给数码管。时间显示在左侧数码管上,番茄数显示在右侧数码管上。数码管显示如图 2‑2 FPGA功能模块展示所示。数码管显示原理如图 2‑9 EGO1数码管显示原理所示。
图 2‑9 EGO1数码管显示原理
倒计时模块是整个番茄钟最重要的部分。整个倒计时模块分为两个部分,分别是60秒倒计时模块和分钟倒计时模块。其中分钟倒计时包括5分钟倒计时和25分钟倒计时模块,主要是根据状态机的输出,并运用条件语句进行控制来实现。60秒倒计时模块接受来自秒脉冲发生器的信号进行计数,并且输出进位信号到分钟倒计时模块实现分钟倒计时。并且倒计时模块中加入了状态机,这个状态机主要用于实现工作和休息时间的自行设定,分为三个状态分别是工作态、设置状态1和设置状态2。其中设置状态1主要用来设定工作时间、设置状态2主要用来设定休息时间。并且在休息模块还加入了番茄数累计模块,从而实现番茄个数的显示。
音乐播放模块使用了FPGA板子上面的蜂鸣器。基本原理是给予蜂鸣器不同长度的脉冲,蜂鸣器将会发出不同的声音,从而实现音乐播放的效果。我们是将有限状态机的输出信号(rcnt_en==1)作为音乐播放的条件。即休息时播放音乐,休息结束音乐停止。输出信号beep和beep1如图 2‑10 音乐播放模块所示。
图 2‑10 音乐播放模块
跑马灯模块的主要作用是用于提醒用户休息时间快要结束了。当跑马灯模块接收到状态机模块输出的开始信号后,跑马灯模块内部存在一个计时模块,当计时5秒后返回状态机一个结束信号,状态转换为工作初态。跑马灯RTL模块如图 2‑11 跑马灯RTL模块所示。
图 2‑11 跑马灯RTL模块
图 2‑12 转态转移图
表 2‑1 状态转移表
现态 | 触发条件 | 次态 |
开始/暂停键 | 25分钟倒计时开始 | |
25分钟初态 | 置数键 | 5分钟初态 |
25分钟倒计时开始 25分钟倒计时暂停 5分钟初态 5分钟倒计时开始 跑马灯状态 5分钟倒计时暂停 | 复位键 开始/暂停键 倒计时到0(WORKEND=1) 复位键 开始/暂停键 复位键 开始/暂停键 置数键 复位键 开始/暂停键 倒计时到0(RESTEND=1) 复位键 计时结束(LEDEND=1) 复位键 开始/暂停键 复位键 | 25分钟初态 25分钟倒计时暂停 5分钟初态 25分钟初态 25分钟倒计时开始 25分钟初态 5分钟倒计时开始 25分钟初态 25分钟初态 5分钟倒计时暂停 跑马灯状态 25分钟初态 25分钟初态 25分钟初态 5分钟倒计时开始 25分钟初态 |
-
- 用户使用手册
- 具体功能实现
- 基本计时功能:25min倒计时和5min倒计时。当25min倒计时结束之后自动转换为5min倒计时。还包括25min暂停、回到25min初态、5min暂停以及回到5min初态。
- 自行设定工作和休息时间:用户可以根据自身需要来设定工作和休息时间。主要通过按键来进入设置状态并进行时间的加减,而且右侧的LED灯亮起代表进入设置状态,否则是初始状态。
- 音乐播放功能:当用户进入休息倒计时后,音乐播放会自动响起,用来预约用户的心情。
- 番茄个数显示:每当用户完成一个完整的番茄周期,右端的四位数码管就会显示种下番茄的总数。
- 跑马
灯提醒功能:当休息状态结束后,跑马灯会亮起提醒用户休息状态将要结束了。
- 操作使用说明
- 具体功能实现
- 用户使用手册
用户主要通过按键进行操控。
当处于25min初态(5min初态)时,如果此时按下key_load键,也就是图 2‑13 按键展示中的S3键,状态就会变为5min初态(25min初态)。如果按下key_start_stop键,也就是图 2‑13 按键展示中的S0键,番茄钟就会开始倒计时。如果此时再次按下key_start_stop键,番茄钟就会停止倒计时。此时按下key_load键,状态就会变成5min初态(25min初态)。当处于25min初态时,按下set_signal键,也就是图 2‑13 按键展示中的S2键,就会位于工作时间设置状态,此时再按一下key_load键和set_signal键,就会进入休息时间设置状态。设置完成后,再次按下key_load键就完成了时间的设定。
图 2‑13 按键展示