电子密码锁

来源:互联网 发布:如何删除oracle数据库 编辑:程序博客网 时间:2024/06/09 22:56

    最近刚写一个电子密码锁的程序,使用Verilog语言实现的。刚刚学这个语言,练习一下。感觉这个语言不是很难,而且通过学这个语言,感觉自己还能通过自学掌握一门语言,挺有成就感的。虽然现在只懂Verilog最基本的一些语法,但是通过不断练习我会不加深入的掌握它,也有信心自学更多的。加油!!

//密码输入、删除模块

module keyinput_bian(k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,back,key_clk,r3,r2,r1,r0);
input k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;
input back,key_clk;
output r3,r2,r1,r0;
reg  [3:0]r3,r2,r1,r0;
reg  [3:0]temp;
reg[9:0] k;
always @(posedge key_clk)
begin
  if(back)
    begin
     r3<=r2;
     r2<=r1;
     r1<=r0;
     r0<=0;
    end
  else
     begin
       k<={k10,k1,k2,k3,k4,k5,k6,k7,k8,k9};
       case(k)
         10'b1000000000:temp<=0;
         10'b0100000000:temp<=1;
         10'b0010000000:temp<=2;
         10'b0001000000:temp<=3;
         10'b0000100000:temp<=4;
         10'b0000010000:temp<=5;
         10'b0000001000:temp<=6;
         10'b0000000100:temp<=7;
         10'b0000000010:temp<=8;
         10'b0000000001:temp<=9;
         default:temp<=10;
       endcase
       if(temp!=10)
         begin
         r0<=r1;
         r1<=r2;
         r2<=r3;
         r3<=temp;
         end
     end
end
endmodule

//寄存模块

module register(set,key_clk,lock,r3,r2,r1,r0,c3,c2,c1,c0);
input [3:0]r3,r2,r1,r0;
input set,key_clk,lock;
output [3:0]c3,c2,c1,c0;
reg [3:0]c3,c2,c1,c0;
always @(posedge key_clk)
begin
if((set==1)&&(lock==0))
begin
 c3<=r3;
 c2<=r2;
 c1<=r1;
 c0<=r0;
end
end
endmodule

//比较模块

module compare(check,close,key_clk,r3,r2,r1,r0,c3,c2,c1,c0,lock);
input r3,r2,r1,r0,c3,c2,c1,c0;
input check,key_clk,close;
wire [3:0]r3,r2,r1,r0,c3,c2,c1,c0;
output lock;
reg lock;
always @(posedge key_clk)
begin
 if(check)
   begin
     if(lock)
       begin
         if((c3==r3)&&(c2==r2)&&(c1==r1)&&(c0==r0))
            lock=0;
         else if((r3==8)&&(r2==8)&&(r1==8)&&(r0==8))
            lock=0;
         else lock=1;
       end
     else lock=0;
   end
 else if(close)lock=1;
end
endmodule

//扫描模块

module scan(r3,r2,r1,r0,scan_clk,s,en);
input r3,r2,r1,r0;
input scan_clk;
output s;
output en;
wire [3:0]r3,r2,r1,r0;
reg[3:0] s,en;
reg [1:0] select;
initial select=2'd0;
always @ (posedge scan_clk)
case (select)
0:begin s<=r0;  select<=1;en<=4'b0001; end
1:begin s<=r1;  select<=2;en<=4'b0010; end
2:begin s<=r2;  select<=3;en<=4'b0100; end
3:begin s<=r3;  select<=0;en<=4'b1000; end
default: s<=r0;
endcase
endmodule

//显示模块

module coding(cod_clk,s,a,b,c,d,e,f,g);
input [3:0]s;
input cod_clk;
output a,b,c,d,e,f,g;
reg a,b,c,d,e,f,g;
always @(posedge cod_clk)
case(s)
 0: begin a<=1;b<=1;c<=1;d<=1;e<=1;f<=1;g<=0;end
 1: begin a<=0;b<=1;c<=1;d<=0;e<=0;f<=0;g<=0;end
 2: begin a<=1;b<=1;c<=0;d<=1;e<=1;f<=0;g<=1;end
 3: begin a<=1;b<=1;c<=1;d<=1;e<=0;f<=0;g<=1;end
 4: begin a<=0;b<=1;c<=1;d<=0;e<=0;f<=1;g<=1;end
 5: begin a<=1;b<=0;c<=1;d<=1;e<=0;f<=1;g<=1;end
 6: begin a<=1;b<=0;c<=1;d<=1;e<=1;f<=1;g<=1;end
 7: begin a<=1;b<=1;c<=1;d<=0;e<=0;f<=0;g<=0;end
 8: begin a<=1;b<=1;c<=1;d<=1;e<=1;f<=1;g<=1;end
 9: begin a<=1;b<=1;c<=1;d<=1;e<=0;f<=1;g<=1;end
endcase
endmodule