EmbDev.net

Forum: FPGA, VHDL & Verilog std_logic_vector won't "keep" certain values


von Amir (Guest)


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?

von Amir (Guest)


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;

: Edited by Moderator
von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Attached files:

Rate this post
useful
not useful
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
No account? Register here.