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

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.