std_logic_vector won't "keep" certain values

Guest #3646971
Rate this post
useful
not useful
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?
Guest #3647024
Rate this post
useful
not useful
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;

Reply

Please log in before posting.

or

Log in with Google account

Registration is free and takes only a minute.

Register now