请编写程序,可以给出仿真图,题目如下图,请按题目要求编写,并给出程序。
请注意题目必须用按键!
密码锁仿真,时钟用 100Hz 密码锁中的时钟分频部分需要修改一下
`timescale 1ms / 1ms
module passwd_lock_sim();
reg clk;
parameter CLK_PERIOD = 5; //100Hz
initial begin
clk = 0;
////////////////////////////////////////
//#(CLK_PERIODxx*300) $stop;
end
always #(CLK_PERIOD/2) clk = ~clk; //100Hz
wire [2:0] key;
reg [1:0] sw;
wire [1:0] led;
wire [6:0] led_7a;
wire [6:0] led_7b;
wire [6:0] led_7c;
wire [6:0] led_7d;
reg [3:0] pwd_a;
reg [3:0] pwd_b;
reg [3:0] pwd_c;
reg [3:0] pwd_d;
reg en;
passwd_lock u1 //密码锁
(
.clk (clk),
.k (key),
.sw (sw),
.led (led),
.led_7a (led_7a),
.led_7b (led_7b),
.led_7c (led_7c),
.led_7d (led_7d)
);
sim_key u2 //这个是模拟按键的代码,只用在仿真测试
(
.clk (clk),
.pwd_a (pwd_a),
.pwd_b (pwd_b),
.pwd_c (pwd_c),
.pwd_d (pwd_d),
.en (en),
.key (key)
);
initial begin
//////////////////////////////////////////
sw[0] <= 0;//修改密码
sw[1] <= 1;
en <= 0;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd3,4'd4,4'd5,4'd6}; //按键 3456
# 10 en <= 1;
# 10 en <= 0;
#200000
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁
sw[1] <= 1;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd4,4'd5,4'd6,4'd7}; //按键 4567
# 10 en <= 1;
# 10 en <= 0;
#200000
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁
sw[1] <= 1;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd3,4'd4,4'd5,4'd7}; //按键 3457
# 10 en <= 1;
# 10 en <= 0;
#200000
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁
sw[1] <= 1;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd3,4'd4,4'd5,4'd8}; //按键 3458
# 10 en <= 1;
# 10 en <= 0;
#200000
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁//错误了3次了,键盘也锁了
sw[1] <= 1;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd3,4'd4,4'd5,4'd6}; //按键 3456
# 10 en <= 1;
# 10 en <= 0;
#200000
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁
sw[1] <= 0;//解锁
# 10
//////////////////////////////////////////
sw[0] <= 1;//正常密码锁//正确的密码
sw[1] <= 1;
{pwd_a,pwd_b,pwd_c,pwd_d} <= {4'd3,4'd4,4'd5,4'd6}; //按键 3456
# 10 en <= 1;
# 10 en <= 0;
#200000 $stop;
end
endmodule
module sim_key
(
input clk,
input [3:0] pwd_a,
input [3:0] pwd_b,
input [3:0] pwd_c,
input [3:0] pwd_d,
input en,
output [2:0] key
);
reg [7:0] key_cnt = 0;
reg [2:0] key_r=3'b111;
reg [31:0] rdy[4:0];
assign key=key_r;
always @(posedge clk)
begin
if(en == 1)
begin
rdy[0] <= pwd_a*50+10;
rdy[1] <= pwd_b*50+10;
rdy[2] <= pwd_c*50+10;
rdy[3] <= pwd_d*50+10;
rdy[4] <= 10*1000;
end
else if(rdy[key_cnt] != 0 && key_cnt < 5)
rdy[key_cnt] <= rdy[key_cnt] - 1;
end
always @(posedge clk)
begin
if(en == 1)
key_cnt <= 0;
else if(rdy[0]==1||rdy[1]==1||rdy[2]==1||rdy[3]==1)
key_cnt <= key_cnt + 1;
end
always @(posedge clk)
begin
if(en == 1)
key_r[0] <= 1; //k0 选择按键抬起
else if((rdy[0]>0&&rdy[0]<10)||(rdy[1]>0&&rdy[1]<10)||(rdy[2]>0&&rdy[2]<10)||(rdy[3]>0&&rdy[3]<10))
key_r[0] <= 1; //k0 选择按键抬起
else if(rdy[0]!=0||rdy[1]!=0||rdy[2]!=0||rdy[3]!=0)
key_r[0] <= 0; //k0 选择按键按下
else
key_r[0] <= 1; //k0 选择按键抬起
end
always @(posedge clk)
begin
if(en == 1)
key_r[1] <= 1; //k1 取消按键抬起
end
always @(posedge clk)
begin
if(en == 1)
key_r[2] <= 1; //k2 确认按键抬起
else if(rdy[4]==1)
key_r[2] <= 0; //k2 确认按键按下
else
key_r[2] <= 1; //k2 确认按键抬起
end
endmodule
你的图片未贴出哦