前言
按照要求,应该实现如下功能:
实验目的:
利用按键、拨码开关以及数码管实现一种简单的密码锁
实验要求:
拨码开关SW1- SW4 设置 2 位数密码,每两位设置一位密码,BM[0:1]设置第一位对应 BM1和 BM2,BM[2:3]设置第二位。所以密码是由0,1,2,3 组成的四位数。
KEY1-KEY2 作为密码输入,按键按一下数字加 1,数字由数码管显示,数字在 0,1,2,3 中循环。
K4 作为确认按键,按下 K4,输入的密码与设置的密码比对,如相同则显示 8888,若不同则显示 7777。 按下 K3 清零,按下后数码管显示 0000,可以重新输密码。
依然使用官方提供的Demo,再次基础上学习实现功能。
1 代码分析
官方代码文件如下:
其中:
- lock_top.v:顶层代码,提供顶层模块设计,始终以及模块调用顺序;
- key_ctrl.v:按键控制代码,采样按键是否按下以及滤波;
- compare.v:比较代码,比较设定密码和拨码开关是否对应;
- seq_display.v:显示部分,用于按键判断密码是否相等以及按钮按下的数据等数码管显示信息。
2 差异项
官方示例代码中:
- KEY1控制的是数码管4;
- KEY2控制的是数码管3;
- KEY3是确认按钮;
- KEY4是清空按钮。
上述设置与预期不符,我修改为如下:
- KEY1控制的是数码管1;
- KEY2控制的是数码管2;
- KEY3是清空按钮;
- KEY4是确认按钮。
3 代码更新
3.1 更新确认和清空按钮配置
示例代码中,确认和清空按钮的引脚和盘古1K开发板不匹配,需要更新,原理图如下:
需要更新lock_top.fdc文件,如下:
define_attribute {p:enter} {PAP_IO_DIRECTION} {INPUT}
define_attribute {p:enter} {PAP_IO_LOC} {59}
define_attribute {p:enter} {PAP_IO_VCCIO} {1.2}
define_attribute {p:enter} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:enter} {PAP_IO_PULLUP} {TRUE}
define_attribute {p:init} {PAP_IO_DIRECTION} {INPUT}
define_attribute {p:init} {PAP_IO_LOC} {60}
define_attribute {p:init} {PAP_IO_VCCIO} {1.2}
define_attribute {p:init} {PAP_IO_STANDARD} {LVCMOS12}
define_attribute {p:init} {PAP_IO_PULLUP} {TRUE}
#
更新seq_display.v代码如下:
seq_control seq_control_0
(
.sel(2'd0),
.key(key0_cnt),
.dig(dig0),
.smg(smg0)
)
seq_control seq_control_1
(
.sel(2'd1),
.key(key1_cnt),
.dig(dig1),
.smg(smg1)
)
seq_control seq_control_2
(
.sel(2'd2),
.key(key2_cnt),
.dig(dig2),
.smg(smg2)
)
seq_control seq_control_3
(
.sel(2'd3),
.key(key3_cnt),
.dig(dig3),
.smg(smg3)
)
4 实现效果
效果见文末视频