Vending Machine...

E

Esma

Guest
my project designing a vending machine that sells a candy for 40 cent. it accept olny 5 cent(N) and 10 cent (D). and the candy i wrote this code for this but i couldn\'t write a testbench to see waveform Can you help me please
library ieee;
use ieee.std_logic_1164.all;

entity vending_machine is
port (
CLK, RESET: in std_logic;
N, D: in std_logic;
output: out std_logic;
change: out std_logic_vector(5 downto 0)
);
end vending_machine;

architecture process_3 of vending_machine is
type state_type is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
signal state, next_state: state_type;

begin
process (CLK, RESET)
begin
if (RESET = \'1\') then
state <= s0;
elsif (rising_edge(CLK)) then
state <= next_state;
end if;
end process;

process (state, N, D)
begin
case state is
when s0 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"000000\";
elsif N = \'0\' and D = \'1\' then
next_state <= s1;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s2;
output <= \'0\';
change <= \"000000\";
end if;

when s1 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"000101\";
elsif N = \'0\' and D = \'1\' then
next_state <= s2;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s3;
output <= \'0\';
change <= \"000000\";
end if;

when s2 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"001010\";
elsif N = \'0\' and D = \'1\' then
next_state <= s3;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s4;
output <= \'0\';
change <= \"000000\";
end if;

when s3 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"001111\";
elsif N = \'0\' and D = \'1\' then
next_state <= s4;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s5;
output <= \'0\';
change <= \"000000\";
end if;

when s4 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"010100\";
elsif N = \'0\' and D = \'1\' then
next_state <= s5;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s6;
output <= \'0\';
change <= \"000000\";
end if;

when s5 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"011001\";
elsif N = \'0\' and D = \'1\' then
next_state <= s6;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s7;
output <= \'0\';
change <= \"000000\";
end if;

when s6 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"011110\";
elsif N = \'0\' and D = \'1\' then
next_state <= s7;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s8;
output <= \'1\';
change <= \"000000\";
end if;
end if;

when s7 =>
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"100011\";
elsif N = \'0\' and D = \'1\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000101\";
else
next_state <= s9;
output <= \'1\';
change <= \"000101\";
end if;
elsif N = \'1\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s9;
output <= \'1\';
change <= \"000000\";
end if;
end if;
when s8 =>
if N = \'0\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s8;
output <= \'1\';
change <= \"000000\";
end if;
end if;

when s9 =>
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000101\";
else
next_state <= s9;
output <= \'0\';
change <= \"000000\";
end if;

when others =>
next_state <= s0;
output <= \'0\';
change <= \"000000\";
end case;
end process;

end architecture process_3;
 
On Thursday, June 15, 2023 at 2:15:19 PM UTC-4, Esma wrote:
my project designing a vending machine that sells a candy for 40 cent. it accept olny 5 cent(N) and 10 cent (D). and the candy i wrote this code for this but i couldn\'t write a testbench to see waveform Can you help me please
library ieee;
use ieee.std_logic_1164.all;

entity vending_machine is
port (
CLK, RESET: in std_logic;
N, D: in std_logic;
output: out std_logic;
change: out std_logic_vector(5 downto 0)
);
end vending_machine;

architecture process_3 of vending_machine is
type state_type is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
signal state, next_state: state_type;

begin
process (CLK, RESET)
begin
if (RESET = \'1\') then
state <= s0;
elsif (rising_edge(CLK)) then
state <= next_state;
end if;
end process;

process (state, N, D)
begin
case state is
when s0 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"000000\";
elsif N = \'0\' and D = \'1\' then
next_state <= s1;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s2;
output <= \'0\';
change <= \"000000\";
end if;

when s1 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"000101\";
elsif N = \'0\' and D = \'1\' then
next_state <= s2;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s3;
output <= \'0\';
change <= \"000000\";
end if;

when s2 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"001010\";
elsif N = \'0\' and D = \'1\' then
next_state <= s3;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s4;
output <= \'0\';
change <= \"000000\";
end if;

when s3 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"001111\";
elsif N = \'0\' and D = \'1\' then
next_state <= s4;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s5;
output <= \'0\';
change <= \"000000\";
end if;

when s4 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"010100\";
elsif N = \'0\' and D = \'1\' then
next_state <= s5;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s6;
output <= \'0\';
change <= \"000000\";
end if;

when s5 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"011001\";
elsif N = \'0\' and D = \'1\' then
next_state <= s6;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
next_state <= s7;
output <= \'0\';
change <= \"000000\";
end if;

when s6 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"011110\";
elsif N = \'0\' and D = \'1\' then
next_state <= s7;
output <= \'0\';
change <= \"000000\";
elsif N = \'1\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s8;
output <= \'1\';
change <= \"000000\";
end if;
end if;

when s7 =
if N = \'0\' and D = \'0\' then
next_state <= s0;
output <= \'0\';
change <= \"100011\";
elsif N = \'0\' and D = \'1\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000101\";
else
next_state <= s9;
output <= \'1\';
change <= \"000101\";
end if;
elsif N = \'1\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s9;
output <= \'1\';
change <= \"000000\";
end if;
end if;
when s8 =
if N = \'0\' and D = \'0\' then
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000000\";
else
next_state <= s8;
output <= \'1\';
change <= \"000000\";
end if;
end if;

when s9 =
if RESET = \'1\' then
next_state <= s0;
output <= \'1\';
change <= \"000101\";
else
next_state <= s9;
output <= \'0\';
change <= \"000000\";
end if;

when others =
next_state <= s0;
output <= \'0\';
change <= \"000000\";
end case;
end process;

end architecture process_3;

The bit that is important in the test bench is this:

entity vending_machine is
port (
CLK, RESET: in std_logic;
N, D: in std_logic;
output: out std_logic;
change: out std_logic_vector(5 downto 0)
);
end vending_machine;

You need to treat your design as a component in the test bench. Write code to drive the clock, the N and the D inputs as you choose. You can examine the outputs manually in the simulator, or, if you wish to analyze the design carefully, you can write code to verify the outputs automatically. The statement to assist with this is:

assert(exp);

Where exp is an expression that should evaluate to TRUE. If not, the assert statement will print to the simulation output. You can combine assert with report to give a specific text output indicating exactly what is wrong, including the value of the thing being tested.

--

Rick C.

- Get 1,000 miles of free Supercharging
- Tesla referral code - https://ts.la/richard11209
 

Welcome to EDABoard.com

Sponsor

Back
Top