[关闭]
@ruanxingzhi 2019-05-19T11:07:17.000000Z 字数 1322 阅读 1023

Lock4Fun

系统概述

8位密码锁,设密码为Pwd。提供的功能是:
1. 当输入K等于Pwd时,灯组LD2全亮,表示开锁
2. 当输入K不等于Pwd时,灯组LD1全亮,表示锁没有打开
3. 计时:从输入第一个按钮开始,倒计时5s,若未打开则复位,并报警
4. 修改密码:按Reset可修改密码

业务逻辑

设置密码

初始状况下,密码为1234.

Reset键之后,进入重设密码状态:不停地读入密文,直到Reset键再次按下。此时,取最后输入的4位数作为密码。

屏幕上总是显示最后输入的4位数。

尝试开锁

此阶段的任意时刻,按【重置】键可以恢复初始状态(没有输入任何一位密码的状态)。

连续输入4个数,输入完4个数之后进入开锁判断阶段。

【开锁判断】

这个阶段可被【计时】打断。

计时

输入任意一位密码之后,开始计时。

屏幕上数秒。数完之后,右边数码管显示EEEE

代码实现

数据结构

  1. reg [3:0]Pwd[3:0] // 密码
  2. reg [3:0]K[3:0] // 输入,初始值为0000
  3. // K恒等于输入的后四位。不足的以0补齐。
  4. // K被重置为0当且仅当:Reset键被按下;复位键被按下
  5. reg Proc // 当前程序。[0]:尝试开锁 1:设置密码
  6. reg isBegun
  7. // Proc=1时,恒为[0]
  8. // Proc=0时,[0]:未开始输入 1:已经开始输入
  9. // isBegun被重置为0当且仅当:Reset键被按下;复位键被按下
  10. reg isOver
  11. // Proc=1时,恒为[0]
  12. // Proc=0时,[0]:时间还没用完 1:时间已经用完
  13. // isOver被重置为0当且仅当:Reset键被按下;复位键被按下
  14. reg isEnd
  15. // 默认为[0]
  16. // 输入结束后,置为1
  17. // isEnd被重置为0当且仅当:Reset键被按下;复位键被按下
  18. reg [1:0]isOpen // [0]:未完成输入 1:成功 2:失败

字符表:

  1. M[0]=0x7E;
  2. M[1]=0x30;
  3. M[2]=0x6D;
  4. M[3]=0x79;
  5. M[4]=0x33;
  6. M[5]=0x5B;
  7. M[6]=0x5F;
  8. M[7]=0x70;
  9. M[8]=0x7F;
  10. M[9]=0x7B;
  11. M[10]=0x77; // A
  12. M[11]=0x67; // P
  13. M[12]=0x4F; // E

计时器状态

这是为数码管实现的计时器。带一位小数:A.B

时钟P171e6Mhz,故计时开始(isBegun上升沿)时,取t=1000000,接下来每个P17时钟沿下降1
恒有:A=t/1000000,B=(t%100000)/100000

t下降到0时,AB置为E.
当四位密码输入完成时,锁定t

数码管状态

以下记数码管为[7:0]D

D[7]显示当前状态。
- D[7]=A:正常工作阶段。此时可以尝试开锁。
- D[7]=S:设置密码阶段。
因此D[7]Proc控制。

D[6:5]显示倒计时。
- D[5:6]为空:isBegun=0,也就是无需计时。
- D[5:6]为数码:计时方式为s.s,带一位小数。由计时器提供。
- D[5:6]为E:

D[4]空。

以上数据汇总后,由左端数码管输出。

D[3:0]恒与K一致。

以上数据汇总后,由右端数码管输出。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注