完整版verilog实验之密码箱实验报告Word文档下载推荐.docx

上传人:b****2 文档编号:12963781 上传时间:2022-10-01 格式:DOCX 页数:19 大小:638.07KB
下载 相关 举报
完整版verilog实验之密码箱实验报告Word文档下载推荐.docx_第1页
第1页 / 共19页
完整版verilog实验之密码箱实验报告Word文档下载推荐.docx_第2页
第2页 / 共19页
完整版verilog实验之密码箱实验报告Word文档下载推荐.docx_第3页
第3页 / 共19页
完整版verilog实验之密码箱实验报告Word文档下载推荐.docx_第4页
第4页 / 共19页
完整版verilog实验之密码箱实验报告Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

完整版verilog实验之密码箱实验报告Word文档下载推荐.docx

《完整版verilog实验之密码箱实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整版verilog实验之密码箱实验报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

完整版verilog实验之密码箱实验报告Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1