-- TestBench Template 

  LIBRARY ieee;
  USE ieee.std_logic_1164.ALL;
  USE ieee.numeric_std.ALL;

  ENTITY testbench IS
  END testbench;

  ARCHITECTURE behavior OF testbench IS 
  signal x, y, z : Real;
  BEGIN
     tb : PROCESS
	  -- variable x, y, z : Real;
	  variable delta, alpha : Real;
	  variable x0, y0 : Real;
	  variable theta : Real;
	  variable xnext, ynext, znext : Real;
     BEGIN 
	  theta := 0.7854;  -- pi/4 , 45degree
	  x0 := 0.6073;
	  y0 := 0.0;
	  x  <= x0; y  <= y0; z  <= 0.0;
	  for I in 0 to 13 loop
	    wait for 10 ns;
	    -- alpha, delta		 
		 case I is
		   when 0      => alpha := 0.7854;     delta := 1.0;
			when 1      => alpha := 0.4636;     delta := 0.5;
			when 2      => alpha := 0.2450;     delta := 0.25;
			when 3      => alpha := 0.1244;     delta := 0.125;
			when 4      => alpha := 0.0624;     delta := 0.0625;
			when 5      => alpha := 0.0312;     delta := 0.03125;
			when 6      => alpha := 0.0156;     delta := 0.015625;
			when 7      => alpha := 0.0078;     delta := 0.0078125;
			when 8      => alpha := 0.0039;     delta := 0.00390625;
			when 9      => alpha := 0.0020;     delta := 0.001953125;
			when 10     => alpha := 0.00097656; delta := 0.00097560;
			when 11     => alpha := 0.00048828; delta := 0.00048828;
			when 12     => alpha := 0.00024414; delta := 0.00024414;
			when others => alpha := 0.00012207; delta := 0.00012207;
		 end case;
		 -- z > theta HIKAKU
		 if z > theta then
		   delta := - delta;
			alpha := - alpha;
		 end if;
		 -- CORDIC COMPUTATION
		 xnext := x - delta * y;
		 ynext := y + delta * x;
		 znext := z + alpha;
		 --
		 x <= xnext; y <= ynext; z <= znext;
	  end loop;
        wait; -- will wait forever
     END PROCESS tb;
  --  End Test Bench 

  END;
