Illegal recursive instantiation

Guest #3770417
Rate this post
• ▲ useful
▼ not useful
Hi guys,

I am having problems with my program and wonder if anyone can help me 
out.
The errormessage i am getting is:
ERROR:HDLCompiler:1171 - Line 30: Illegal recursive instantiation of 
test(rtl)

does anyone know how to solve this?


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
library work;
use work.convert_pack.all;

entity test is --line 30
    Port (
   clk_o : out  STD_LOGIC;
   output : inout std_logic;
   clk : inout std_logic;
   index : inout  std_logic_vector(0 downto 0)

   );
end test;

architecture rtl of test is


    component test
        PORT(
     output  : out std_logic;
     clk : in std_logic;
    index : in  std_logic_vector(0 downto 0)
      );
    END COMPONENT;



BEGIN

   bla: test
  PORT MAP (
  clk => clk,
  index  => index,
  output => output
  );


   clk_process :process(clk, index, output)
   begin


  clk <= not(clk);

  if (rising_edge(clk) and clk = '1') then
  index <= u2slv(slv2u(index)+1);
  end if;

  if  index = 89 and output = '1'then --
  index <= (others => '0');
  output <='0';
  end if;

  if  index = 34 and output = '0'then --
  index <= (others => '0');
  output <='1';
  end if;

clk_o <= output;

end process;



end rtl;





PS: I am working on a Spartan-6 Atlys Board in case this information is 
needed.
#3770422
Rate this post
• ▲ useful
▼ not useful
Your Toplevel Entity and the component you try to instantiate are both 
named test, so you have to rename one
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
use IEEE.STD_LOGIC_ARITH.ALL;
5
use IEEE.STD_LOGIC_SIGNED.ALL;
6
library work;
7
use work.convert_pack.all;
8

9
entity test_top is --line 30
10
    Port (
11
   clk_o : out  STD_LOGIC;
12
   output : inout std_logic;
13
   clk : inout std_logic;
14
   index : inout  std_logic_vector(0 downto 0)
15

16
   );
17
end test_top;
18

19
architecture rtl of test_top is
20

21

22
    component test
23
        PORT(
24
     output  : out std_logic;
25
     clk : in std_logic;
26
    index : in  std_logic_vector(0 downto 0)
27
      );
28
    END COMPONENT;
29

30

31

32
BEGIN
33

34
   bla: test
35
  PORT MAP (
36
  clk => clk,
37
  index  => index,
38
  output => output
39
  );
40

41

42
   clk_process :process(clk, index, output)
43
   begin
44

45

46
  clk <= not(clk);
47

48
  if (rising_edge(clk) and clk = '1') then
49
  index <= u2slv(slv2u(index)+1);
50
  end if;
51

52
  if  index = 89 and output = '1'then --
53
  index <= (others => '0');
54
  output <='0';
55
  end if;
56

57
  if  index = 34 and output = '0'then --
58
  index <= (others => '0');
59
  output <='1';
60
  end if;
61

62
clk_o <= output;
63

64
end process;
65

66
end rtl;

should work (not tested)

PS: don't use the obsolete
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
Guest #3770435
Rate this post
• ▲ useful
▼ not useful
thanks for the hint, i got now this error message:
Line 71: found '0' definitions of operator "=", cannot determine exact 
overloaded matching definition for "="


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.convert_pack.all;

entity test is
    Port (
   clk_o : out  STD_LOGIC;
   output : inout std_logic;
   clk : inout std_logic;
   index : inout  std_logic_vector(0 downto 0)

   );
end test;

architecture rtl of test is


    component ntest
        PORT(
     output  : out std_logic;
     clk : in std_logic;
    index : in  std_logic_vector(0 downto 0)
      );
    END COMPONENT;



BEGIN

   bla: ntest
  PORT MAP (
  clk => clk,
  index  => index,
  output => output
  );


   clk_process :process(clk, index, output)
   begin


  clk <= not(clk);

  if (rising_edge(clk) and clk = '1') then
  index <= u2slv(slv2u(index)+1);
  end if;

  if  index = 89 and output = '1'then --line 71
  index <= (others => '0');
  output <='0';
  end if;

  if  index = 34 and output = '0'then --
  index <= (others => '0');
  output <='1';
  end if;

clk_o <= output;

end process;



end rtl;
Moderator (Company: Titel) #3771253
Rate this post
• ▲ useful
▼ not useful
Pls use the VHDL tags (to be found in the "Formatting options" a few 
lines under "Reply Rules — please read before posting")!

Iluvatar wrote:
> thanks for the hint, i got now this error message:
> Line 71:  found '0' definitions of operator "=", cannot determine exact
> overloaded matching definition for "="
1
  if index = 89 and output = '1' then
VHDL has a very strict data type handling. You cannot compare a vector 
with an integer. Those two are COMPLETELY different. And therefore the 
operator '=' don't "know" hao to handle those two operands.
Two solutions:
1. You must compare the same data types
2. you must overload the '=' funktion (yes, its only a function in VHDL)

This here is a stupid lazy "trick":
1
output : inout std_logic;
2
clk : inout std_logic;
3
index : inout std_logic_vector(0 downto 0)
Every beginner thinks to be neat defining ports as inout to read them 
"back". But this is the most easy way to dig holes in the structure of a 
VHDL description. Beeing your boss or your teacher I would degrade you 
for that...  :-o

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.