完整版verilog实验之密码箱实验报告Word文档下载推荐.docx
《完整版verilog实验之密码箱实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整版verilog实验之密码箱实验报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![完整版verilog实验之密码箱实验报告Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/1/a9dfc771-3a4d-4984-b777-29613629f52b/a9dfc771-3a4d-4984-b777-29613629f52b1.gif)
d0:
seg_led1=9'
b000111111;
//数码管1显示0
d1:
b000000110;
//1
d2:
b001011011;
//2
d3:
b001001111;
//3
d4:
b001100110;
//4
d5:
b001101101;
//5
d6:
b001111101;
//6
d7:
b000000111;
//7
d8:
b001111111;
//8
d9:
b001101111;
//9
default:
b100111111;
//0
endcase
case(code_high)
seg_led2=9'
//数码管2显示0
end
二、密码比对判断
always@(posedgeclk)//密码判断
if(!
rst)
begin
wrong_cnt<
=2'
b00;
//初始错误次数为0
code_low<
=4'
b0000;
code_high<
led<
=8'
b11111111;
end
elseif(low_d)
=sw;
elseif(high_d)
elseif(enter_d)
if(wrong_cnt!
d2)
begin
if((code_low==Y&
&
code_high==X)||(code_low==newcode_low&
code_high==newcode_high))
begin
led<
b01111111;
//密码正确,led8亮
wrong_cnt<
d0;
end
else
b11111110;
//密码错误,led1亮错误次数加一
=wrong_cnt+1;
end
else
led<
b00000000;
//密码输错三次,报警
三、密码修改实现
//修改控制模块
always@(posedgeclk)
if(!
change<
=0;
elseif(led<
b01111111)
=1;
if(change==1&
high_d)
begin
newcode_high<
end
elseif(change==1&
low_d)
newcode_low<
endmodule
四、按键消抖实现
//按键消抖模块
moduledebounce(clk,rst,key,key_pulse);
parameterN=2;
//要消除的按键的数量
inputclk;
inputrst;
input[N-1:
0]key;
//输入的按键
output[N-1:
0]key_pulse;
//按键动作产生的脉冲
reg[N-1:
0]key_rst_pre;
//定义一个寄存器型变量存储上一个触发时的按键值
0]key_rst;
//定义一个寄存器变量储存储当前时刻触发的按键值
wire[N-1:
0]key_edge;
//检测到按键由高到低变化是产生一个高脉冲
//利用非阻塞赋值特点,将两个时钟触发时按键状态存储在两个寄存器变量中
always@(posedgeclkornegedgerst)
if(!
rst)
key_rst<
={N{1'
b1}};
//初始化时给key_rst赋值全为1,{}中表示N个1
key_rst_pre<
else
=key;
//第一个时钟上升沿触发之后key的值赋给key_rst,同时key_rst的值赋给key_rst_pre
key_rst_pre<
=key_rst;
//非阻塞赋值。
相当于经过两个时钟触发,key_rst存储的是当前时刻key的值,key_rst_pre存储的是前一个时钟的key的值
end
assignkey_edge=key_rst_pre&
(~key_rst);
//脉冲边沿检测。
当key检测到下降沿时,key_edge产生一个时钟周期的高电平
reg[17:
0]cnt;
//产生延时所用的计数器,系统时钟12MHz,要延时20ms左右时间,至少需要18位计数器
//产生20ms延时,当检测到key_edge有效是计数器清零开始计数
if(!
cnt<
=18'
h0;
elseif(key_edge)
cnt<
else
=cnt+1'
h1;
0]key_sec_pre;
//延时后检测电平寄存器变量
0]key_sec;
//延时后检测key,如果按键状态变低产生一个时钟的高脉冲。
如果按键状态是高的话说明按键无效
if(!
key_sec<
elseif(cnt==18'
h3ffff)
key_sec<
key_sec_pre<
key_sec_pre<
=key_sec;
assignkey_pulse=key_sec_pre&
(~key_sec);
4.附录,源码图以及源码
//顶层模块
modulesafebox_plus(
inputclk,
input[3:
0]sw,//四位拨码开关,用作十进制密码
inputrst,//复位键
inputenter,//密码确认键
inputhigh,//十位输入键
inputlow,//个位输入键
outputreg[7:
0]led,//八位报警灯,led8为正确提示灯,led1为错误提示灯
outputreg[8:
0]seg_led1,//数码管1显示个位密码
0]seg_led2//数码管2显示十位密码
);
parameterX=4'
//用作初始密码
parameterY=4'
wireenter_d;
//key[3]确认密码输入
wirelow_d;
//key[1]个位确认
wirehigh_d;
//key[2]十位确认
reg[1:
0]wrong_cnt;
//统计错误次数
reg[3:
0]code_low;
//个位密码
0]code_high;
//十位密码
regchange;
//可修改密码状态
0]newcode_low;
//更新密码个位
0]newcode_high;
//更新密码十位
//例化调用消抖模块
debounce#(.N(3))u1
(
.clk(clk),
.rst(rst),
.key({enter,low,high}),
.key_pulse({enter_d,low_d,high_d})
seg_l