I was asked to design a simple can dispensing machine using VHDL. I have an input called CoinIn and is defined as an std_logic_vector(1 downto 0); for some reason, when I try to force it with a "11" it will treat it as a "01" and when i try to force it with a "10" it will treat it at "00". Does anyone have any idea what the problem might be?
Here's the code BTW (it's not 100% ready yet):
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | |
4 | ENTITY FSM IS |
5 | PORT (CLK : in std_logic; --Clock, active high |
6 | RSTn : in std_logic; --Async. Reset, active low |
7 | CoinIn : in std_logic_vector (1 downto 0) ; --Which coin was inserted |
8 | Soda : out std_logic := '0'; --Is Soda dispensed ? |
9 | CoinOut : out std_logic_vector (1 downto 0) --Which coin is dispensed? |
10 | );
|
11 | |
12 | END ENTITY; |
13 | |
14 | ARCHITECTURE behavior of FSM IS |
15 | TYPE state IS ( start, change, can, pending ); |
16 | SIGNAL present_state, next_state : state; |
17 | SIGNAL Count : integer range 0 to 6:=0; |
18 | |
19 | BEGIN
|
20 | PROCESS (RSTn, clk, CoinIn) --sync part |
21 | BEGIN
|
22 | IF RSTn ='0' THEN |
23 | present_state <= start; |
24 | ELSIF rising_edge(clk) THEN |
25 | present_state <= next_state; |
26 | END IF; |
27 | END PROCESS; |
28 | |
29 | PROCESS (CoinIn, clk, present_state, next_state) --combinational |
30 | VARIABLE SodaVar : std_logic; |
31 | VARIABLE CoinOutVar : std_logic_vector(1 downto 0); |
32 | BEGIN
|
33 | CoinOutVar := "00"; |
34 | CASE present_state is |
35 | WHEN start => |
36 | SodaVar := '0'; |
37 | IF CoinIn = "01" then |
38 | next_state <= pending; |
39 | count <= 1; |
40 | ELSIF CoinIn = "10" then |
41 | next_state <= can; |
42 | count <= 0; |
43 | ELSIF CoinIn = "11" then |
44 | next_state <= change; |
45 | count <= 5; |
46 | ELSIF CoinIn = "00" THEN |
47 | next_state <= start; |
48 | count <= 0; |
49 | END IF; |
50 | WHEN pending => |
51 | SodaVar := '0'; |
52 | IF CoinIn = "01" then |
53 | next_state <= can; |
54 | count <= 2; |
55 | ELSIF CoinIn = "10" then |
56 | next_state <= change; |
57 | count <= 3; |
58 | ELSIF CoinIn = "11" then |
59 | next_state <= change; |
60 | count <= 6; |
61 | ELSIF CoinIn = "00" then |
62 | next_state <= pending; |
63 | END IF; |
64 | WHEN change => |
65 | SodaVar := '0'; |
66 | IF ((count - 2) = 1) then |
67 | CoinOutVar := "01"; |
68 | count <= 0; |
69 | next_State <= can; |
70 | ELSIF ((count -2) = 0) then |
71 | next_state <= can; |
72 | count <= 0; |
73 | CoinOutVar := "00"; |
74 | ELSE
|
75 | next_state <= change; |
76 | count <= count - 2; |
77 | CoinOutVar := "10"; |
78 | END IF; |
79 | WHEN can => |
80 | next_state <= start; |
81 | SodaVar := '1'; |
82 | count <= 0; |
83 | END CASE; |
84 | Soda <= SodaVar; |
85 | CoinOut <= CoinOutVar; |
86 | END PROCESS; |
87 | END ARCHITECTURE; |
:
Edited by Moderator
Amir wrote: > Here's the code BTW Please use the formatting tags (see screenshot). > when I try to force it with a "11" it will treat it as a "01" How do you see that? How do you "force" it? Don't you have a test bench for this vending machine?
:
Edited by Moderator
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.