Lock
Lock
Descriptions of
Digital Systems
Electronic Lock
//
// Electronic combinational lock
//
module lock(seg7,key, valid_key, col, row, mclk, resetL) ;
output
[0:6] seg7;
output
[0:3] col ;
output
[3:0] key ;
output
valid_key ;
input
resetL ,mclk ;
input
[0:3] row ;
wire
clk ;
Kb_scan
//
// Module to scan matrix keyboard
// FSM to scan the keyboard
//
module kb_scan(key, valid_key, col, row, clk, resetL) ;
output
output
output
input
input
[3:0] key ;
valid_key ;
[0:3] col ;
[0:3] row ;
clk, resetL ;
reg
reg
reg
reg
reg
[0:3] row_reg;
[2:0] nstate, pstate ;
valid, valid_key ;
[3:0] key, key_code ;
[0:3] col ;
wire
kd ;
parameter
Kb_scan (Continued)
// if any key is down, the kd signal will be high
assign
kd = | row_reg ;
if (~kd) begin
nstate = st_2
col = 4'b0100
end
else begin
nstate = st_5
col = 4'b1000
valid = 1 ;
end
;
;
;
;
st_3:
if (~kd) begin
nstate = st_3
col = 4'b0010
end
else begin
nstate = st_5
col = 4'b0100
valid = 1 ;
end
if (~kd) begin
nstate = st_4
col = 4'b0001
end
else begin
nstate = st_5
col = 4'b0010
valid = 1 ;
end
;
;
;
;
;
;
st_4:
st_5:
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Validate Module
Validate
//
// Module to validate entry code being entered
//
module validate(seg7, key, valid_key, clk, resetL) ;
output
[0:6] seg7 ;
input
valid_key, resetL, clk ;
input
[3:0] key ;
wire
pound_sign, Z, AeqB, EQ ;
reg
reg
reg
reg
reg
reg
reg
eqQ ;
[1:0]
[0:6]
[1:0]
[2:0]
[3:0]
[0:6]
pstate, nstate ;
seg7 ;
digit_sel ;
cnt ;
B ;
display_reg_inp ;
Validate (Continued)
parameter
parameter
blank = 7'b0000000 ,
open = 7'b1110111 ,
error = 7'b1101101 ;
AeqB = (key == B) ;
=
=
=
=
blank ;
open ;
error ;
blank ;
Z = (cnt == 3'b000) ;
begin
if (Z) begin
nstate = st_3 ;
ld_display = 1 ;
if (eqQ) display_sel = 1 ;
else display_sel = 2 ;
end
else begin
if (valid_key) begin
ld_eq = 1 ;
nstate = st_2 ;
end
else nstate = st_1 ;
end
end
st_2 :
begin
nstate = st_1 ;
dec_cnt = 1 ;
end
st_3 :
Lock Testbench
//
// Testbench for electronic combinational lock
//
`timescale
1 ms / 1 us
module lock_tb ;
wire
wire
wire
[0:6] seg7 ;
[0:3] col ;
[3:0] key ;
reg
reg
reg
[0:3] row ;
mclk ;
resetL ;
// Clock generator
// Clock period is 10 msec
initial begin
mclk = 1 ;
forever #10 mclk = ~mclk ;
end
resetL = 1 ;
#200
row = 4'b0000 ;
row = 4'b0000 ;
row = 4'b0000 ;
row = 4'b0000 ;
==
==
==
==
row = 4'b0000 ;
4'b1111)
4'b1000)
4'b0100)
4'b0010)
row
row
row
row
=
=
=
=
4'b0001
4'b0000
4'b0000
4'b0001
;
;
;
;
initial begin
$dumpfile("./lock.dmp") ;
$dumpflush ;
$dumpvars(3, lock_tb) ;
end