This is our forth lab day. Our objective today was to revise the ASM chart for some of the blocks and try to code for them.
Figure 1. Revised block diagram
Figure 1 is the revised (forth edition) block diagram for our design. Compared to the one in week three, one new block has been added to obtain the correct number of coins in the machine after giving out the change. As for other blocks, they remained the same.
By this week, we have also finished the code for all imporatant functional blocks (1st edition).
Codes for the 'product_choice' block:
SUBDESIGN
product_choice
(
reset,sw[14..0]:
INPUT;
product_price_LSB[3..0],
product_price_MSB[3..0], sw_error: OUTPUT;
)
BEGIN
IF
(reset)THEN
product_price_LSB[]=B"0000"
; product_price_MSB[]=B"0000" ; sw_error=B"0";
ELSIF (sw[]==B"000000000000000")then
sw_error=B"0";
ELSIF
(sw[]==B"000000000000001")then
product_price_LSB[]=B"0010"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000000000010")then
product_price_LSB[]=B"0010"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000000000100")then
product_price_LSB[]=B"0010"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000000001000")then
product_price_LSB[]=B"0101"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000000010000")then
product_price_LSB[]=B"0101"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000000100000")then
product_price_LSB[]=B"0101"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000001000000")then
product_price_LSB[]=B"1000"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000010000000")then
product_price_LSB[]=B"1000"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000000100000000")then
product_price_LSB[]=B"1000"
; product_price_MSB[]=B"0000";
ELSIF
(sw[]==B"000001000000000")then
product_price_LSB[]=B"0000"
; product_price_MSB[]=B"0001";
ELSIF
(sw[]==B"000010000000000")then
product_price_LSB[]=B"0000"
; product_price_MSB[]=B"0001";
ELSIF
(sw[]==B"000100000000000")then
product_price_LSB[]=B"0000"
; product_price_MSB[]=B"0001";
ELSIF
(sw[]==B"001000000000000")then
product_price_LSB[]=B"0111"
; product_price_MSB[]=B"0001";
ELSIF
(sw[]==B"010000000000000")then
product_price_LSB[]=B"0111"
; product_price_MSB[]=B"0001";
ELSIF
(sw[]==B"100000000000000")then
product_price_LSB[]=B"0111"
; product_price_MSB[]=B"0001";
ELSE
sw_error=B"1";
END IF;
END;
Codes for 'coin_input' block:
SUBDESIGN
coin_input
(
clk, reset
:INPUT ;
coin_input[3..0]
:INPUT;
total_money_LSB[3..0],
total_money_MSB[3..0] : OUTPUT;
)
VARIABLE
total_money_LSB[3..0],
total_money_MSB[3..0] : DFF;
BEGIN
total_money_LSB[].clk = clk;
total_money_MSB[].clk = clk;
IF (reset) THEN
total_money_LSB[].d = 0;
total_money_MSB[].d = 0;
ELSIF (coin_input[0] == 1) THEN
IF(total_money_LSB[].q != 9)THEN
total_money_LSB[].d = total_money_LSB[].q +
1;
total_money_MSB[].d = total_money_MSB[].q +
0;
ELSIF(total_money_LSB[].q == 9) THEN
total_money_LSB[].d = 0;
total_money_MSB[].d = total_money_MSB[].q +
1;
END IF;
ELSIF (coin_input[1] == 1)THEN
IF(total_money_LSB[].q < 8)THEN
total_money_LSB[].d = total_money_LSB[].q +
2;
total_money_MSB[].d = total_money_MSB[].q +
0;
ELSIF(total_money_LSB[].q >= 8) THEN
total_money_LSB[].d = total_money_LSB[].q -
8;
total_money_MSB[].d = total_money_MSB[].q +
1;
END IF;
ELSIF (coin_input[2] == 1)THEN
IF(total_money_LSB[].q < 5)THEN
total_money_LSB[].d = total_money_LSB[].q +
5;
total_money_MSB[].d = total_money_MSB[].q +
0;
ELSIF(total_money_LSB[].q >= 5 &
total_money_LSB[].q <= 9) THEN
total_money_LSB[].d = total_money_LSB[].q -
5;
total_money_MSB[].d = total_money_MSB[].q +
1;
END IF;
ELSIF (coin_input[3] == 1)THEN
total_money_LSB[].d = total_money_LSB[].q +
0;
total_money_MSB[].d = total_money_MSB[].q +
1;
ELSIF (coin_input[] == B"0000")THEN
total_money_LSB[].d = total_money_LSB[].q +
0;
total_money_MSB[].d = total_money_MSB[].q +
0;
END IF;
END;
Codes for 'counter' block:
SUBDESIGN
counter
(
clk, reset
:INPUT ;
coin_input[3..0] :INPUT;
temp_10p[3..0]
, temp_20p[3..0] , temp_50p[3..0] , temp_100p[3..0] : OUTPUT;
)
VARIABLE
count_10p[3..0]
, count_20p[3..0] , count_50p[3..0] , count_100p[3..0] : DFF;
BEGIN
count_10p[].clk = clk;
count_20p[].clk = clk;
count_50p[].clk = clk;
count_100p[].clk = clk;
temp_10p[] =
count_10p[];
temp_20p[] =
count_20p[];
temp_50p[] =
count_50p[];
temp_100p[]
= count_100p[];
IF (reset) THEN
count_10p[].d = 0;
count_20p[].d = 0;
count_50p[].d = 0;
count_100p[].d = 0;
ELSIF (coin_input[0] == 1) THEN
count_10p[].d = count_10p[].q + 1;
count_20p[].d = count_20p[].q + 0;
count_50p[].d = count_50p[].q + 0;
count_100p[].d = count_100p[].q + 0;
ELSIF (coin_input[1] == 1) THEN
count_10p[].d = count_10p[].q + 0;
count_20p[].d = count_20p[].q + 1;
count_50p[].d = count_50p[].q + 0;
count_100p[].d = count_100p[].q + 0;
ELSIF (coin_input[2] == 1) THEN
count_10p[].d = count_10p[].q + 0;
count_20p[].d
= count_20p[].q + 0;
count_50p[].d = count_50p[].q + 1;
count_100p[].d = count_100p[].q + 0;
ELSIF (coin_input[3] == 1) THEN
count_10p[].d = count_10p[].q + 0;
count_20p[].d = count_20p[].q + 0;
count_50p[].d = count_50p[].q + 0;
count_100p[].d = count_100p[].q + 1;
ELSIF (coin_input[] ==
B"0000")THEN
count_10p[].d = count_10p[].q + 0;
count_20p[].d = count_20p[].q + 0;
count_50p[].d = count_50p[].q + 0;
count_100p[].d = count_100p[].q + 0;
END IF;
END;
Codes for 'subs' block:
SUBDESIGN
subs
(
sys_reset,
change_end :INPUT ;
coin_change_10p[3..0]
, coin_change_20p[3..0] , coin_change_50p[3..0] , coin_change_100p[3..0] :
INPUT;
temp_10p[3..0]
, temp_20p[3..0] , temp_50p[3..0] , temp_100p[3..0] : INPUT;
number_10p[3..0]
, number_20p[3..0] , number_50p[3..0] , number_100p[3..0] : OUTPUT;
)
VARIABLE
c1 : node;
c2 : node;
c3 : node;
c4 : node;
BEGIN
IF
(sys_reset)THEN
Number_10p[]
= B"0000";
Number_10p[]
= B"0000";
Number_10p[]
= B"0000";
Number_10p[]
= B"0000";
ELSE
IF(change_end)THEN
(c1,number_10p[])=(gnd,temp_10p[])-(gnd,coin_change_10p[]);
(c1,number_20p[])=(gnd,temp_20p[])-(gnd,coin_change_20p[]);
(c3,number_50p[])=(gnd,temp_50p[])-(gnd,coin_change_50p[]);
(c4,number_100p[])=(gnd,temp_100p[])-(gnd,coin_change_100p[]);
ELSE
number_10p[]
= temp_10p[];
number_20p[]
= temp_20p[];
number_50p[]
= temp_50p[];
number_100p[]
= temp_100p[];
END IF;
END IF;
END;
Codes for 'control' block:
SUBDESIGN control
(
clk, reset, cancel : INPUT;
product_price_LSB[3..0], product_price_MSB[3..0] : INPUT;
total_LSB[3..0], total_MSB[3..0] : INPUT;
product_out, change_total[3..0] : OUTPUT;
cancel_change_LSB[3..0], cancel_change_MSB[3..0] : OUTPUT;
)
variable
c_LSB, s_LSB[3..0] : NODE;
BEGIN
(c_LSB,s_LSB[])=(gnd,total_LSB[])-(gnd,product_price_LSB[]);
IF (cancel)THEN
cancel_change_LSB[] = total_LSB[];
cancel_change_MSB[] = total_MSB[];
product_out=B"0" ;
ELSE
cancel_change_LSB[] = B"0000";
cancel_change_MSB[] = B"0000";
END IF;
IF (reset)THEN
change_total[] = B"0000";
product_out=B"0";
ELSIF (product_price_MSB[1] == 1 & total_MSB[1] == 0 )THEN
product_out=B"0" ;
change_total[] = B"0000";
ELSIF (product_price_MSB[1] == total_MSB[1])THEN
IF (product_price_MSB[0] == 1 &
total_MSB[0] == 0 )THEN
product_out=B"0" ;
change_total[] = B"0000";
ELSIF (product_price_MSB[0] ==
total_MSB[0])THEN
IF (product_price_LSB[3] == 1 &
total_LSB[3] == 0 )THEN
product_out=B"0" ;
change_total[] = B"0000";
ELSIF (product_price_LSB[3] ==
total_LSB[3])THEN
IF
(product_price_LSB[2] == 1 & total_LSB[2] == 0)THEN
product_out=B"0" ;
change_total[]
= B"0000";
ELSIF
(product_price_LSB[2] == total_LSB[2])THEN
IF (product_price_LSB[1] == 1 &
total_LSB[1] == 0)THEN
product_out=B"0" ;
change_total[] = B"0000";
ELSIF (product_price_LSB[1] ==
total_LSB[1])THEN
IF (product_price_LSB[0] == 1 &
total_LSB[0] == 0)THEN
product_out=B"0" ;
change_total[] = B"0000";
ELSIF (product_price_LSB[0] ==
total_LSB[0])THEN
product_out=B"1" ;
change_total[] = B"0000";
ELSIF
(product_price_LSB[0] == 0 & total_LSB[0] == 1)THEN
product_out=B"1" ;
change_total[] = B"0001";
END IF;
ELSIF (product_price_LSB[1] == 0 &
total_LSB[1] == 1)THEN
product_out=B"1" ;
change_total[] = s_LSB[];
END IF;
ELSIF
(product_price_LSB[2] == 0 & total_LSB[2] == 1)THEN
product_out=B"1"
;
change_total[]
= s_LSB[];
END IF;
ELSIF (product_price_LSB[3] == 0 &
total_LSB[3] == 1)THEN
product_out=B"1" ;
change_total[] = s_LSB[];
END IF;
ELSIF
(product_price_MSB[0] == 0 & total_MSB[0] == 1)THEN
product_out=B"1" ;
change_total[] = s_LSB[] + B"1010" ;
END IF;
ELSIF (product_price_MSB[1] == 0 & total_MSB[1] ==
1)THEN
product_out=B"1" ;
change_total[] = s_LSB[] + B"1010" ;
END IF;
END;
Codes for 'change' block:
SUBDESIGN change
(
reset, ent, clk, cancel : INPUT;
change_LSB[3..0] , change_MSB[3..0] : INPUT;
number_10p[3..0] , number_20p[3..0] , number_50p[3..0] , number_100p[3..0] : INPUT;
change_error, change_end : OUTPUT;
coin_change_10p[3..0] , coin_change_20p[3..0] , coin_change_50p[3..0] , coin_change_100p[3..0] : OUTPUT;
)
variable
t1, s1[3..0] : DFF;
t2, s2[3..0] : DFF;
t3, s3[3..0] : DFF;
t4, s4[3..0] : DFF;
value[3..0] : DFF;
MSB[3..0] : DFF;
a[3..0], b[3..0], c[3..0], d[3..0] : DFF;
change_10p[3..0] , change_20p[3..0] , change_50p[3..0], change_100p[3..0] :DFF;
BEGIN
a[] = number_10p[];
b[] = number_20p[];
c[] = number_50p[];
d[] = number_100p[];
coin_change_10p[] = change_10p[];
coin_change_20p[] = change_20p[];
coin_change_50p[] = change_50p[];
coin_change_100p[] = change_100p[];
a[].clk = clk;
b[].clk = clk;
c[].clk = clk;
d[].clk = clk;
value[].clk = clk;
MSB[].clk = clk;
change_10p[].clk = clk;
change_20p[].clk = clk;
change_50p[].clk = clk;
change_100p[].clk = clk;
(t1,s1[])=(gnd,number_10p[])-(gnd,change_10p[]);
(t2,s2[])=(gnd,number_20p[])-(gnd,change_20p[]);
(t3,s3[])=(gnd,number_50p[])-(gnd,change_50p[]);
(t4,s4[])=(gnd,number_100p[])-(gnd,change_100p[]);
a[] = s1[];
b[] = s2[];
c[] = s3[];
d[] = s4[];
IF (cancel # ent)THEN
value[] = change_LSB[];
MSB[] = change_MSB[];
END IF;
IF (!reset)Then
IF (MSB[].q == 1)THEN
MSB[].d = MSB[].q - 1;
change_100p[].d = change_100p[].q + 1;
IF (value[].q == 0)THEN
change_end = B"1";
END IF;
ELSE
MSB[].d = MSB[].q + 0;
change_100p[].d = change_100p[].q + 0;
END IF;
IF (value[].q > 5)THEN
IF (c[].q > 0)THEN
value[].d = value[].q - 5;
change_50p[].d = change_50p[].q + 1;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
ELSIF (b[].q > 0)THEN
value[].d = value[].q - 2;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 1;
change_10p[].d = change_10p[].q + 0;
ELSIF (a[].q > 0)THEN
value[].d = value[].q - 1;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 1;
ELSE
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_error = B"1";
END IF;
ELSIF (value[].q == 5)THEN
IF (c[].q > 0)THEN
value[].d = value[].q - 5;
change_50p[].d = change_50p[].q + 1;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_end = B"1";
ELSIF (b[].q > 0)THEN
value[].d = value[].q - 2;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 1;
change_10p[].d = change_10p[].q + 0;
ELSIF (a[].q > 0)THEN
value[].d = value[].q - 1;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 1;
ELSE
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_error = B"1";
END IF;
ELSIF (value[].q > 2 & value[].q < 5)THEN
IF (b[].q > 0)THEN
value[].d = value[].q - 2;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 1;
change_10p[].d = change_10p[].q + 0;
ELSIF (a[].q > 0)THEN
value[].d = value[].q - 1;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 1;
ELSE
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_error = B"1";
END IF;
ELSIF (value[].q == 2)THEN
IF (b[].q > 0)THEN
value[].d = value[].q - 2;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 1;
change_10p[].d = change_10p[].q + 0;
change_end = B"1";
ELSIF (a[].q > 0)THEN
value[].d = value[].q - 1;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 1;
ELSE
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_error = B"1";
END IF;
ELSIF (value[].q == 1)THEN
IF (a[].q > 0)THEN
value[].d = value[].q - 1;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 1;
change_end = B"1";
ELSE
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
change_error = B"1";
END IF;
ELSIF (value[].q == 0)THEN
value[].d = value[].q + 0;
change_50p[].d = change_50p[].q + 0;
change_20p[].d = change_20p[].q + 0;
change_10p[].d = change_10p[].q + 0;
END IF;
ELSE
coin_change_10p[] = B"0000";
coin_change_20p[] = B"0000";
coin_change_50p[] = B"0000";
coin_change_100p[] = B"0000";
change_error = B"0";
change_end = B"0";
END IF;
END;