-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSequence_Builder
154 lines (143 loc) · 3.59 KB
/
Sequence_Builder
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//-------------------------------------------------------------------------------
// University: Oregon Institute of Technology – CSET Department
// Class: CST 231
// Author: Luis Solis
// Lab: Lab4
// Project: digital door lock system
// File Name: Sequence_Builder.v
// List of other files used: Key_Pad_Scanner.v, Clock_Divider.v,
// reset_15.v,my7Seg.v, Sequence_Checker.v
//-------------------------------------------------------------------------------
// Description of the Code (1 - 5 lines)
// Lab Description: Will create our Sequence and will use our state machine
//-----------------------------------------------------------------------------
// Date: 01/04/2022
// Version: 1.0
// Revision: 02/4-22/2022
//
//-----------------------------------------------------------------------------
module Sequence_Builder (
input clk,
input key_detected,
input reset,
input [3:0] key,
input led_done,
output reg reset_out,
output reg start_15,
output reg [3:0] seq1,
output reg [3:0] seq2,
output reg [3:0] seq3,
output reg [3:0] seq4,
output reg check_seq
);
parameter [2:0] init = 3'b000,
first = 3'b001,
second = 3'b010,
third = 3'b011,
fourth = 3'b100,
final = 3'b111;
reg [2:0] state;
reg [3:0] previous_key;
initial state <= init;
// Always block to handle the case portion
always @(posedge clk or posedge reset)
begin
if(reset)
state <= init;
else if(key == 4'b1110)
state <= init;
else if (key == 4'b1111 && state != fourth && state != final)
state <= final;
else if (state == final && led_done)
state <= init;
else if (key_detected == 1'b1)
begin
previous_key <= key;
case(state)
init : state <= first;
first : state <= second;
second : state <= third;
third : state <= fourth;
fourth : begin
if (key == 4'b1111)
state <= final;
else state <= init;
end
final : state <= state;
default : state <= state;
endcase
end
else
state <= state;
end
// Always block to handle output
always @(posedge clk)
begin
case(state)
init : begin
seq1 <= 4'b1111;
seq2 <= 4'b1111;
seq3 <= 4'b1111;
seq4 <= 4'b1111;
check_seq <= 0;
reset_out <= 1;
start_15 <= 0;
end
first : begin
seq1 <= previous_key;
seq2 <= seq2;
seq3 <= seq3;
seq4 <= seq4;
check_seq <= 0;
start_15 <= 1;
reset_out <= 0;
end
second: begin
seq1 <= seq1;
seq2 <= previous_key;
seq3 <= seq3;
seq4 <= seq4;
check_seq <= 0;
start_15 <= 1;
reset_out <= 0;
end
third : begin
seq1 <= seq1;
seq2 <= seq2;
seq3 <= previous_key;
seq4 <= seq4;
check_seq <= 0;
reset_out <= 0;
start_15 <= 1;
end
fourth: begin
seq1 <= seq1;
seq2 <= seq2;
seq3 <= seq3;
seq4 <= previous_key;
check_seq <= 0;
reset_out <= 0;
start_15 <= 1;
end
final : begin
seq1 <= seq1;
seq2 <= seq2;
seq3 <= seq3;
seq4 <= seq4;
check_seq <= 1;
reset_out <= 0;
start_15 <= 0;
end
default:
begin
seq1 <= 4'b1111;
seq2 <= 4'b1111;
seq3 <= 4'b1111;
seq4 <= 4'b1111;
check_seq <= 0;
reset_out <= 0;
start_15 <= 0;
end
endcase
end
endmodule