用verilog HDL语法仿真

请编写程序,可以给出仿真图,题目如下图,请按题目要求编写,并给出程序。
请注意题目必须用按键!

密码锁仿真,时钟用 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

你的图片未贴出哦