Sign in

username:

password:



Not a member?

Search Comp.Arch.FPGA



Search tips

fpga by Keywords

Altera | ASIC | CPLD | Cyclone | DCM | DDR | DSP | Ethernet | ISE | JTAG | Linux | LVDS | Microblaze | ML310 | Modelsim | NIOS | OPB | PCI | Quartus | RocketIO | SDRAM | Spartan | Spartan3 | SRAM | Stratix | Verilog | VHDL | Virtex | Virtex-4 | Virtex-II | Xilinx | XST

Ads

See Also

DSPEmbedded SystemsElectronics

Comp.Arch.FPGA | Simulation of VHDL code for a vending machine


There are 26 messages in this thread.

You are currently looking at messages 0 to 10.

Simulation of VHDL code for a vending machine - glallenjr - 2009-12-01 11:53:00

Currently I am studying the "Circuit Design with VHDL" by Volnei A.
Pedroni. On page 207 the run a simulation but do not provide the test
bench. I would like to run the same simulation but I am not familiar with
how to write a testbench. If possible please provide a testbench to mimic
the simulation shown on page 207. If you are unfamiliar with this book or
the simulation run, I would also appreciate ANY KIND of testbench which
could simulate it's funcionality. Also if there are any errors with the
code, please let me know! Your help is much appreciated! thank you!

Here is the code we are trying to implement:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity vending_machine is
    Port ( clk, rst : IN  STD_LOGIC;
           nickel_in, dime_in, quarter_in : IN  BOOLEAN;
           candy_out, nickel_out, dime_out, quarter_out: OUT STD_LOGIC);
end vending_machine;

architecture fsm of vending_machine IS
	TYPE state IS (st0, st5, st10, st15, st20, st25, st30, st35, st40, st45);
	SIGNAL present_state, next_state: STATE;
	
begin
	PROCESS(rst, clk)
	BEGIN
		IF(rst='1') THEN
			present_state <=st0;
		ELSIF(clk' EVENT AND clk ='1') THEN
			present_state <= next_state;
		END IF;
	END PROCESS;
	
	PROCESS(present_state, nickel_in, dime_in, quarter_in)
	BEGIN
		CASE present_state IS
			WHEN st0 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '0';
				IF (nickel_in) THEN next_state <= st5;
				ELSIF (dime_in) THEN next_state <= st10;
				ELSIF (quarter_in) THEN next_state <= st25;
				ELSE next_state <=st0;
				END IF;
			WHEN st5 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '0';
				IF (nickel_in) THEN next_state <= st10;
				ELSIF (dime_in) THEN next_state <= st15;
				ELSIF (quarter_in) THEN next_state <= st30;
				ELSE next_state <=st5;
				END IF;
			WHEN st10 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '0';
				IF (nickel_in) THEN next_state <= st15;
				ELSIF (dime_in) THEN next_state <= st20;
				ELSIF (quarter_in) THEN next_state <= st35;
				ELSE next_state <=st10;
				END IF;
			WHEN st15 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '0';
				IF (nickel_in) THEN next_state <= st20;
				ELSIF (dime_in) THEN next_state <= st25;
				ELSIF (quarter_in) THEN next_state <= st40;
				ELSE next_state <=st15;
				END IF;
			WHEN st20 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '0';
				IF (nickel_in) THEN next_state <= st25;
				ELSIF (dime_in) THEN next_state <= st30;
				ELSIF (quarter_in) THEN next_state <= st45;
				ELSE next_state <=st20;
				END IF;
			WHEN st25 =>
				candy_out <= '1';
				nickel_out <='0';
				dime_out <= '0';
				next_state <= st0;
			WHEN st30 =>
				candy_out <= '1';
				nickel_out <='1';
				dime_out <= '0';
				next_state <= st0;
			WHEN st35 =>
				candy_out <= '1';
				nickel_out <='0';
				dime_out <= '1';
				next_state <= st35;
			WHEN st45 =>
				candy_out <= '0';
				nickel_out <='0';
				dime_out <= '1';
				next_state <= st35;
		END CASE;
		END PROCESS;
		
		END fsm;


	   
					
---------------------------------------		
This message was sent using the comp.arch.fpga web interface on
http://www.FPGARelated.com
______________________________
Newest Blog by Chris Felton: "The Spartans". Click here to read.



Re: Simulation of VHDL code for a vending machine - KMS - 2010-01-16 12:59:00

On Dec 1 2009, 11:53=A0am, "glallenjr" <glalle...@gmail.com> wrote:
> Currently I am studying the "Circuit Design with VHDL" by Volnei A.
> Pedroni. On page 207 the run a simulation but do not provide the test
> bench. I would like to run the same simulation but I am not familiar with
> how to write a testbench. If possible please provide a testbench to mimic
> the simulation shown on page 207. If you are unfamiliar with this book or
> the simulation run, I would also appreciate ANY KIND of testbench which
> could simulate it's funcionality. Also if there are any errors with the
> code, please let me know! Your help is much appreciated! thank you!
>
> Here is the code we are trying to implement:
>
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
>
> entity vending_machine is
> =A0 =A0 Port ( clk, rst : IN =A0STD_LOGIC;
> =A0 =A0 =A0 =A0 =A0 =A0nickel_in, dime_in, quarter_in : IN =A0BOOLEAN;
> =A0 =A0 =A0 =A0 =A0 =A0candy_out, nickel_out, dime_out, quarter_out: OUT =
STD_LOGIC);
> end vending_machine;
>
> architecture fsm of vending_machine IS
> =A0 =A0 =A0 =A0 TYPE state IS (st0, st5, st10, st15, st20, st25, st30, st=
35, st40, st45);
> =A0 =A0 =A0 =A0 SIGNAL present_state, next_state: STATE;
>
> begin
> =A0 =A0 =A0 =A0 PROCESS(rst, clk)
> =A0 =A0 =A0 =A0 BEGIN
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF(rst=3D'1') THEN
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 present_state <=3Dst0;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF(clk' EVENT AND clk =3D'1') THEN
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 present_state <=3D next_s=
tate;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 END PROCESS;
>
> =A0 =A0 =A0 =A0 PROCESS(present_state, nickel_in, dime_in, quarter_in)
> =A0 =A0 =A0 =A0 BEGIN
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 CASE present_state IS
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st0 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF (nicke=
l_in) THEN next_state <=3D st5;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (di=
me_in) THEN next_state <=3D st10;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (qu=
arter_in) THEN next_state <=3D st25;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSE next=
_state <=3Dst0;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st5 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF (nicke=
l_in) THEN next_state <=3D st10;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (di=
me_in) THEN next_state <=3D st15;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (qu=
arter_in) THEN next_state <=3D st30;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSE next=
_state <=3Dst5;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st10 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF (nicke=
l_in) THEN next_state <=3D st15;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (di=
me_in) THEN next_state <=3D st20;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (qu=
arter_in) THEN next_state <=3D st35;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSE next=
_state <=3Dst10;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st15 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF (nicke=
l_in) THEN next_state <=3D st20;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (di=
me_in) THEN next_state <=3D st25;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (qu=
arter_in) THEN next_state <=3D st40;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSE next=
_state <=3Dst15;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st20 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 IF (nicke=
l_in) THEN next_state <=3D st25;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (di=
me_in) THEN next_state <=3D st30;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSIF (qu=
arter_in) THEN next_state <=3D st45;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ELSE next=
_state <=3Dst20;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END IF;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st25 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 next_stat=
e <=3D st0;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st30 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 next_stat=
e <=3D st0;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st35 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 next_stat=
e <=3D st35;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 WHEN st45 =3D>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 candy_out=
 <=3D '0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 nickel_ou=
t <=3D'0';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 dime_out =
<=3D '1';
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 next_stat=
e <=3D st35;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END CASE;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END PROCESS;
>
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 END fsm;
>
> --------------------------------------- =A0 =A0 =A0 =A0
> This message was sent using the comp.arch.fpga web interface onhttp://www=
.FPGARelated.com



Hi,

I recommend you change your BOOLEANs to STD_LOGIC. Also, assuming this
is targeting real hardware, remember that the insertion of coins is
asynchronous and this is a synchronous design. You'll need some logic
for metastability and to create a one clock-wide pulse to your state
machine.

You can do something like this for a testbench:

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

library ieee;
use ieee.std_logic_1164.all;

-- Add your library and packages declaration here ...

entity vending_machine_tb is
end vending_machine_tb;

architecture TB_ARCHITECTURE of vending_machine_tb is
  -- Component declaration of the tested unit
  component vending_machine
    port
      (
      clk         : in  std_logic;
      rst         : in  std_logic;
      nickel_in   : in  std_logic;
      dime_in     : in  std_logic;
      quarter_in  : in  std_logic;
      candy_out   : out std_logic;
      nickel_out  : out std_logic;
      dime_out    : out std_logic;
      quarter_out : out std_logic
      );
  end component;

  -- Stimulus signals - signals mapped to the input and inout ports of
tested entity
  signal clk         : std_logic :=3D '0';
  signal rst         : std_logic :=3D '0';
  signal nickel_in   : std_logic :=3D '0';
  signal dime_in     : std_logic :=3D '0';
  signal quarter_in  : std_logic :=3D '0';
  -- Observed signals - signals mapped to the output ports of tested
entity
  signal candy_out   : std_logic;
  signal nickel_out  : std_logic;
  signal dime_out    : std_logic;
  signal quarter_out : std_logic;

  -- Add your code here ...

begin

  -- Unit Under Test port map
  UUT : vending_machine
    port map
      (
      clk         =3D> clk,
      rst         =3D> rst,
      nickel_in   =3D> nickel_in,
      dime_in     =3D> dime_in,
      quarter_in  =3D> quarter_in,
      candy_out   =3D> candy_out,
      nickel_out  =3D> nickel_out,
      dime_out    =3D> dime_out,
      quarter_out =3D> quarter_out
      );

  -- Add your stimulus here ...
  clk <=3D not clk after 50ns;

  Stimulus: process

    begin

      wait for 200 ns;

      rst <=3D'1';

      wait for 200 ns;

      rst <=3D'0';

      wait for 200 ns;

      nickel_in <=3D'1';

      wait for 1 us;

      nickel_in <=3D'0';

      wait for 1 us;

      dime_in <=3D'1';

      wait for 1 us;

      dime_in <=3D'0';

      wait for 1 us;

      quarter_in <=3D'1';

      wait for 1 us;

      quarter_in <=3D'0';

      -- add more...

      wait;

    end process;

end TB_ARCHITECTURE;

configuration TESTBENCH_FOR_vending_machine of vending_machine_tb is
	for TB_ARCHITECTURE
		for UUT : vending_machine
			use entity work.vending_machine(fsm);
		end for;
	end for;
end TESTBENCH_FOR_vending_machine;

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

I didn't simulate your design to check its operation. This TB is
simple but it will get you started.

KMS

Re: Simulation of VHDL code for a vending machine - Gabor - 2010-01-16 22:23:00

On Jan 16, 12:59=A0pm, KMS <kms34...@gmail.com> wrote:
> Hi,
>
> I recommend you change your BOOLEANs to STD_LOGIC.

If you change the booleans to std_logic, you'll need
to change all the if statements to have a comparison
operator like
if (nickel_in) then . . .
becomes
if (nickel_in =3D '1') then . . .

If you're not trying to synthesize this logic, I'm not really
clear why you shouldn't use booleans, but then I would
normally have used Verilog.

On the other hand, if you make the code synthesizable,
you can use the Xilinx webpack to generate a testbench
template automatically.  That often saves the headache
of writing the signal declarations, instantiations and
initialization logic.

Regards,
Gabor
______________________________
Newest Blog by Chris Felton: "The Spartans". Click here to read.

Re: Simulation of VHDL code for a vending machine - KJ - 2010-01-17 13:28:00

> On Jan 16, 10:23=A0pm, Gabor <ga...@alacron.com> wrote:
> to generate a testbench
> template automatically. =A0That often saves the headache
> of writing the signal declarations, instantiations and
> initialization logic.
>

I never caught on to how this was ever much of a headache and why it
gets touted by the tool vendors as something important.  Copy/paste
the entity that you create to make two copies.

The first copy you add the word 'signal' at the begining of the line
and then delete the 'in', 'out' and 'inout' modes from each line and
'presto' you have the signal definitions for the testbench.

The second copy you edit the 'entity' line to make it an
instantiation, change 'generic' and 'port' to 'generic map' and 'port
map' and then use a macro to change all of the lines of the entity
from this...

   xyz:  in std_logic;

...to this...

   xyz =3D> xyz,

Touch it up a bit if you want and you're done...depends on your
preferred editor, but it never takes more than a minute or so.

Not much of a time saver in my opinion.  Now something to generate the
actual stimulus and generate the assertion checking would be nice and
would be a real timesaver...

KJ
______________________________
Newest Blog by Chris Felton: "The Spartans". Click here to read.

Re: Simulation of VHDL code for a vending machine - Gabor - 2010-01-17 13:55:00

On Jan 17, 1:28=A0pm, KJ <kkjenni...@sbcglobal.net> wrote:
> > On Jan 16, 10:23=A0pm, Gabor <ga...@alacron.com> wrote:
> > to generate a testbench
> > template automatically. =A0That often saves the headache
> > of writing the signal declarations, instantiations and
> > initialization logic.
>
> I never caught on to how this was ever much of a headache and why it
> gets touted by the tool vendors as something important. =A0Copy/paste
> the entity that you create to make two copies.
>
> The first copy you add the word 'signal' at the begining of the line
> and then delete the 'in', 'out' and 'inout' modes from each line and
> 'presto' you have the signal definitions for the testbench.
>
> The second copy you edit the 'entity' line to make it an
> instantiation, change 'generic' and 'port' to 'generic map' and 'port
> map' and then use a macro to change all of the lines of the entity
> from this...
>
> =A0 =A0xyz: =A0in std_logic;
>
> ...to this...
>
> =A0 =A0xyz =3D> xyz,
>
> Touch it up a bit if you want and you're done...depends on your
> preferred editor, but it never takes more than a minute or so.
>
> Not much of a time saver in my opinion. =A0Now something to generate the
> actual stimulus and generate the assertion checking would be nice and
> would be a real timesaver...
>
> KJ

Well just your description is significanly longer than the buttons
to generate the testbench in ISE.  It's actually more of a
timesaver if you use Verilog, where the instantiation and
wires / regs don't resemble the source code like in VHDL.
It's also great if you wanted to quickly make a Verilog
testbench for your VHDL entity or vice versa.  This goes
doubly for a beginner, who may not know the basics
required to start the testbench.

Just my 2 cents,
Gabor

Re: Simulation of VHDL code for a vending machine - rickman - 2010-01-17 15:43:00

On Jan 16, 10:23 pm, Gabor <ga...@alacron.com> wrote:
> On Jan 16, 12:59 pm, KMS <kms34...@gmail.com> wrote:
>
> > Hi,
>
> > I recommend you change your BOOLEANs to STD_LOGIC.
>
> If you change the booleans to std_logic, you'll need
> to change all the if statements to have a comparison
> operator like
> if (nickel_in) then . . .
> becomes
> if (nickel_in = '1') then . . .
>
> If you're not trying to synthesize this logic, I'm not really
> clear why you shouldn't use booleans, but then I would
> normally have used Verilog.

I'll second that.  There is nothing about Booleans that are evil.  The
two times I will replace a Boolean with a std_logic is when I know
this is a signal that will be important in simulation or when it is at
the top level of a synthesized design.  I don't recall the exact issue
having other than std_logic or slv at the top level, but it is not a
big deal to work with that restriction.  I replace a Boolean with
std_logic for simulation only because a std_logic signal produces a
wiggly line with levels that are easy to see while a Boolean has a
state which must be read in the waveform viewer which can be difficult
with small text.  I like Booleans because they can be less typing when
used in an IF statement or in the result of a comparison.  In the end,
it more a matter of preference than anything.  If you like the format
of your code using Booleans, go ahead.  There are no real roadblocks
to using them.

> On the other hand, if you make the code synthesizable,
> you can use the Xilinx webpack to generate a testbench
> template automatically.  That often saves the headache
> of writing the signal declarations, instantiations and
> initialization logic.

I'll second that as well.  But the template is only the signal
declarations and the component instantiations.  You still have to
write the code to drive all the inputs to the UUT.  Once you go a
couple of simple test benches you will see how easy they are.  When
you need to test more complex code, you will find that your test bench
needs to get a little more complex, but the same concepts apply.  The
main thing is to keep it simple and look at other coder's test benches
to get ideas.  There are a lot of good designers out there and it is
always good to learn what you can from them.  But don't be afraid to
think for yourself too.

Rick

Re: Simulation of VHDL code for a vending machine - Brian Drummond - 2010-01-17 18:12:00

On Sun, 17 Jan 2010 12:43:20 -0800 (PST), rickman <g...@gmail.com> wrote:

>On Jan 16, 10:23 pm, Gabor <ga...@alacron.com> wrote:
>> On Jan 16, 12:59 pm, KMS <kms34...@gmail.com> wrote:
>>
>> > Hi,
>>
>> > I recommend you change your BOOLEANs to STD_LOGIC.

>> If you're not trying to synthesize this logic, I'm not really
>> clear why you shouldn't use booleans, but then I would
>> normally have used Verilog.
>
>I'll second that.  There is nothing about Booleans that are evil.  The
>two times I will replace a Boolean with a std_logic is when I know
>this is a signal that will be important in simulation or when it is at
>the top level of a synthesized design.  I don't recall the exact issue
>having other than std_logic or slv at the top level, but it is not a
>big deal to work with that restriction.  

I'll third that.

The issue I see with std_logic[_vector] ports at the top level is that whatever
you use at the top level will be translated to std_logic[_vector] by synthesis
and/or the post-PAR netlist generator. 

Therefore if you ever need to run a timing simulation, the easiest thing is to
use these types from the start. Then your testbench will work with either
behavioural or netlist versions.

Of course you could use other port types, and generate a wrapper to convert port
types for the netlist, but that's more work.

If the tools were actually designed to support VHDL users who want to design at
the most appropriate level of abstraction, they would auto-generate such a
wrapper; it would be trivial, and allow you to use any synthesisable type for
your ports - even records.

But they aren't...

- Brian

Re: Simulation of VHDL code for a vending machine - KJ - 2010-01-17 19:04:00

> Well just your description is significanly longer than the buttons
> to generate the testbench in ISE. =A0

OK, so I ramble on a bit...

> It's actually more of a
> timesaver if you use Verilog, where the instantiation and
> wires / regs don't resemble the source code like in VHDL.

Yeah, VHDL is better than Verilog any day of the week ;)

> This goes
> doubly for a beginner, who may not know the basics
> required to start the testbench.
>

Not sure the beginer learns much just by clicking on a button though.

> Just my 2 cents,
I'll see your 2 cents, and raise you a penny

KJ

Re: Simulation of VHDL code for a vending machine - KJ - 2010-01-17 19:49:00

> In the end,
> it more a matter of preference than anything. =A0If you like the format
> of your code using Booleans, go ahead. =A0There are no real roadblocks
> to using them.
>

In the end, the main advantage of std_logic is with unknowns.
Booleans will initialize themselves to 'False', std_logic to 'U'.
Proving that your design does not depend on a lucky initialization
value happens when you use std_logic not booleans.

Kevin Jennings
______________________________
Newest Blog by Chris Felton: "The Spartans". Click here to read.

Re: Simulation of VHDL code for a vending machine - Gabor - 2010-01-18 08:49:00

On Jan 17, 7:49=A0pm, KJ <kkjenni...@sbcglobal.net> wrote:
> > In the end,
> > it more a matter of preference than anything. =A0If you like the format
> > of your code using Booleans, go ahead. =A0There are no real roadblocks
> > to using them.
>
> In the end, the main advantage of std_logic is with unknowns.
> Booleans will initialize themselves to 'False', std_logic to 'U'.
> Proving that your design does not depend on a lucky initialization
> value happens when you use std_logic not booleans.
>
> Kevin Jennings

Interestingly enough, for FPGA synthesis, the boolean will
more closely resemble the final hardware.  "Uninitialized"
logic in an FPGA generally defaults to zero, at least for
Xilinx XST.  There may be some architectures that don't
initialize every register and memory bit in the configuration
bitstream, but I haven't run across them yet.

Regards,
Gabor
______________________________
Newest Blog by Chris Felton: "The Spartans". Click here to read.

| 1 | 2 | 3 | next