Verilog vending machine code?

Status
Not open for further replies.

icd

Junior Member level 3
Joined
Jan 25, 2012
Messages
25
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,506
Hi guys,
i know that it is hard to check others code. however im having a problem with my vending machine verilog code. the problem it gives me an output which is vend_out when the input is a quarter even though the price should be 40 cents to give the product. im attaching the code and the waveform. if u can find what is wrong ill appreciate.
======================================

Code Verilog - [expand]
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
module test(clk,coin,reset,change,vend_out);
 
input clk,reset;
input [2:0] coin;
output reg vend_out;
output reg [2:0] change;
 
parameter [3:0] idle=4'b0000;
parameter [2:0]nickle=3'b001;
parameter [2:0]dime=3'b010;
parameter [2:0]quarter=3'b011;
parameter [2:0]nickle_dime=3'b100;
parameter [2:0]two_dime=3'b101;
parameter [2:0]quarter_nickle=3'b110;
parameter [2:0]quarter_dime=3'b111;
 
parameter [3:0]five=4'b0001;
parameter [3:0]ten=4'b0010;
parameter [3:0]fifteen=4'b011;
parameter [3:0]tweenty=4'b0100;
parameter [3:0]tweenty_five=4'b0101;
parameter [3:0]thirty=4'b110;
parameter [3:0]thirty_five=4'b111;
parameter [3:0]fourty=4'b1000;
parameter [3:0]fourty_five=4'b1001;
parameter [3:0]fifty=4'b1010;
 
reg [3:0] state, next_state;
 
 
 
always@(posedge clk, negedge reset) begin
if(!reset)
state<=idle;
else state<=next_state;
end
 
always@(coin,state) begin
 
case(state)
idle: case(coin)
           nickle:begin
           next_state= five;
           change=3'b000;
           vend_out=1'b0;
           end
           dime:begin
           next_state= ten;
           change=3'b000;
           vend_out=1'b0;
           end
           quarter:begin
           next_state= tweenty_five;
           change=3'b000;
           vend_out=1'b0;
           end
           default:begin
           next_state=idle;
           change=3'b000;
           vend_out=1'b0;
           end
           endcase
five: case(coin)
            nickle: next_state=ten;
            dime : next_state=fifteen;
            quarter : next_state=thirty;
            default:next_state=nickle;
            endcase
ten: case(coin)
            nickle:next_state=fifteen;
            dime: next_state=tweenty;
            quarter:next_state=thirty_five;
            default:next_state=dime;
            endcase
fifteen:case(coin)
             nickle:next_state=tweenty;
             dime:next_state=thirty_five;
             quarter:begin
                     next_state=idle;
                     vend_out=1'b1;
           change=3'b000;
                     end
             default:next_state=fifteen;
             endcase
tweenty:case(coin)
             nickle:next_state=tweenty_five;
             dime:next_state=thirty;
             quarter:begin
             next_state=idle;
             change=nickle;
             vend_out=1'b1;
             end
             default:next_state=tweenty;
             endcase
tweenty_five:case(coin)
                  nickle:next_state=thirty;
                  dime:next_state=thirty_five;
                  quarter:begin
                  next_state=idle;
                  change=dime;
                  vend_out=1'b1;
                  end
                  default:next_state=tweenty_five;
                  endcase
thirty:case(coin)
            nickle:begin
            next_state=thirty_five;
            change=3'b000;
            vend_out=1'b0;
            end
            dime:begin
            next_state=idle;
            vend_out=1'b1;
            change=3'b000;
            end
            quarter:begin
            next_state=idle;
            change=nickle_dime;
            vend_out=1'b1;
            end
            default:next_state=thirty;
            endcase
thirty_five:case(coin)
                 nickle:begin
                 next_state=idle;
                 vend_out=1'b1;
                 change=3'b000;
                 end
                 dime:begin
                 next_state=idle;
                 change=nickle;
                 vend_out=1'b1;
                 end
                 quarter:begin
                 next_state=idle;
                 change=two_dime;
                 vend_out=1'b1;
                 end
                 default:next_state=thirty_five;
                 endcase
fourty:case(coin)
            nickle:begin
            next_state=idle;
            change=nickle;
            vend_out=1'b1;  
            end
            dime:begin
            next_state=idle;
            change=dime;
            vend_out=1'b1;
            end
            quarter:begin
            next_state=idle;
            change=quarter;
            vend_out=1'b1;
            end
            default:begin
            next_state=idle;
            vend_out=1'b1;
            change=3'b000;
            end
            endcase
fourty_five:case(coin)
            nickle:begin
            next_state=idle;
            change=dime;
            vend_out=1'b1;  
            end
            dime:begin
            next_state=idle;
            change=nickle_dime;
            vend_out=1'b1;
            end
            quarter:begin
            next_state=idle;
            change=quarter_nickle;
            vend_out=1'b1;
            end
            default:begin
            next_state=idle;
            change=nickle;
            vend_out=1'b1;
            end
            endcase
fifty:case(coin)
            nickle:begin
            next_state=idle;
            change=nickle_dime;
            vend_out=1'b1;  
            end
            dime:begin
            next_state=idle;
            change=two_dime;
            vend_out=1'b1;
            end
            quarter:begin
            next_state=idle;
            change=quarter_dime;
            vend_out=1'b1;
            end
            default:begin
            next_state=idle;
            change=dime;
            vend_out=1'b1;
            end
            endcase
default:begin
next_state=idle;
change=3'b000;
vend_out=1'b0;
end
endcase 
end                                                           
endmodule


====================
 
Last edited by a moderator:

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…