1.设计要求: 用 verilog 语言设计一个数字密码锁,需要满足以下基本功能:
(1). 密码为 4 位,每位密码为数字 0-5,4 位密码各不相同。 (2). 具有使能输入端 en,用于控制密码锁的开启和关闭。密码锁开启, 允许输入密码;密码锁关闭,禁止输入密码。 (3). 具有清零输入端 clr,用于清除已输入的密码,重新进行密码输入。 (4). 可输出显示密码正确与否。 进阶功能: (1). 具有密码修改功能,允许修改预设的四位密码。 (2). 密码连续输错 3 次以上,密码锁输出显示锁定,不允许再进行密码 输入。 (3). 可自定义添加其他功能。 编写 testbench 验证功能并下板验证。
2.基本功能:
Stay状态:
stay:begin //等待状态(测试各输出是否能够正常输出)
unlock_led <= 1;
error_led <= 1;
inpw3 <= 8;
inpw2 <= 8;
inpw1 <= 8;
inpw0 <= 8;
s <= 3;
if(en) begin //若en为1,则进入输入(inpt)状态
state <= inpt;
unlock_led <= 0;
error_led <= 0;
inpw3 <= 10; //显示横线
end
end
当en=1时,进入输入状态,当clr=0时清0,
inpt:begin //输入密码状态
unlock_led <= 0;
error_led <= 0;
if(en) begin //使能端en为1,进行密码输入
case(s)
3:begin
inpw3 <= pw;
s <= s-1;
inpw2 <= 10; //显示横线
end
2:begin
inpw2 <= pw;
s <= s-1;
inpw1 <= 10; //显示横线
end
1:begin
inpw1 <= pw;
s <= s-1;
inpw0 <= 10; //显示横线
end
0:begin
inpw0 <= pw;
s <= 3;
state <= check;
end
default;
endcase
end
else begin //若en为0,返回stay状态
state <= stay;
end
end
当最后一个数字输入后,进入check状态进行检测,
check:begin //密码检测状态
if(en) begin
inpw3 <= 10;
inpw2 <= 10;
inpw1 <= 10;
inpw0 <= 10;
if((inpw3==password3)&&
(inpw2==password2)&&
(inpw1==password1)&&
(inpw0==password0)) begin
state <= ulock;
t <= 3; //错误计数重置
end
else begin
state <= er;
t <= t-1; //错误次数计数
end
end
else begin
state <= stay;
end
end
如果与设置的密码相符,则进入ulock状态,解锁,会有unlock_led <= 1;error_led <= 0;显示;
ulock:begin //密码正确,解锁成功状态
unlock_led <= 1;
error_led <= 0;
state <= stay;
end
如果不符则进入er状态,会有unlock_led <= 0;error_led <= 1;显示,并且此时数码管上显示EEEE。
er:begin //密码错误
inpw3 <= 11; //显示E
inpw2 <= 11;
inpw1 <= 11;
inpw0 <= 11;
unlock_led <= 0;
error_led <= 1;
state <= stay;
end
3.进阶功能
如果set=1,则进入密码输入状态
setpw:begin //更改密码状态
unlock_led <= 0;
error_led <= 0;
inpw3 <= 10; //显示横线
inpw2 <= 12;
inpw1 <= 12;
inpw0 <= 12;
case(s)
3:begin
password3 <= pw;
s <= s-1;
inpw3 <= pw;
inpw2 <= 10; //显示横线
end
2:begin
password2 <= pw;
s <= s-1;
inpw3 <= password3;
inpw2 <= pw;
inpw1 <= 10; //显示横线
end
1:begin
password1 <= pw;
s <= s-1;
inpw3 <= password3;
inpw2 <= password2;
inpw1 <= pw;
inpw0 <= 10; //显示横线
end
0:begin
password0 <= pw;
s <= 3;
inpw3 <= password3;
inpw2 <= password2;
inpw1 <= password1;
inpw0 <= pw;
state <= stay;
end
default;
e