EmbDev.net

Forum: FPGA, VHDL & Verilog VHDL (GHDL): can't have multiple entities in file?


Author: Edmund (Guest)
Posted on:

Rate this post
0 useful
not useful
Hello, this is my first post. I'm very new to digital logic and VHDL. I 
started by making some VHDL for just a clock, which I was able to 
compile with VHDL just fine, and simulate, and view the output in 
gtkwave.

What I was hoping to do next is just an 8-bit ripple adder. However, I'm 
stuck on an error. The following VHDL:

library ieee;
use ieee.std_logic_1164.all;

entity and_gate is
    port (
        a, b: in std_logic;
        a_and_b: out std_logic
    );
end;

architecture behavior of and_gate is
begin
    process (a, b)
    begin
        a_and_b <= a and b;
    end process;
end;

entity xor_gate is
    port (
        a: in std_logic;
        b: in std_logic;
        a_xor_b: out std_logic
    );
end;

Fails with the errors:
$ ghdl -a 8_bit_adder.vhdl
8_bit_adder.vhdl:23:15: no declaration for "std_logic"
8_bit_adder.vhdl:24:15: no declaration for "std_logic"
8_bit_adder.vhdl:25:22: no declaration for "std_logic"
ghdl: compilation error

The error goes away if I delete the "xor_gate" entity. I'm surprised at 
the error as I don't know why I wouldn't be able to use the same type 
(std_logic) several times. Please help! :)

Author: Lothar M. (lkmiller) (Moderator)
Posted on:

Rate this post
0 useful
not useful
Edmund wrote:
> library ieee;
> use ieee.std_logic_1164.all;
Thats missing before the second entity. Each VHDL module starts with the 
used libraries...

Author: Edmund (Guest)
Posted on:

Rate this post
0 useful
not useful
That was it!

Thank you.

Author: Edmund (Guest)
Posted on:

Rate this post
0 useful
not useful
Unfortunately, I've run into another error that I don't know how to 
interpret.

The following VHDL:
library ieee;
use ieee.std_logic_1164.all;

entity and_gate is
    port (
        a: in std_logic;
        b: in std_logic;
        a_and_b: out std_logic
    );
end;

architecture behavior of and_gate is
begin
    process (a, b)
    begin
        a_and_b <= a and b;
    end process;
end;

library ieee;
use ieee.std_logic_1164.all;

entity xor_gate is
    port (
        a: in std_logic;
        b: in std_logic;
        a_xor_b: out std_logic
    );
end;

architecture behavior of xor_gate is
begin
    process (a, b)
    begin
        a_xor_b <= a xor b;
    end process;
end;

library ieee;
use ieee.std_logic_1164.all;

entity half_adder is
    port (
        a: in std_logic;
        b: in std_logic;
        sum: out std_logic;
        carry: out std_logic
    );
end;

architecture structure of half_addr is
    component and_gate is
        port (
            a: in std_logic;
            b: in std_logic;
            a_and_b: out std_logic
        );
    end component;

    component xor_gate is
        port (
            a: in std_logic;
            b: in std_logic;
            a_xor_b: out std_logic
        );
    end component;
begin
    g1: xor_gate port map (
        a => a,
        b => b,
        a_xor_b => sum
    );
    g2: and_gate port map (
        a => a,
        b => b,
        a_and_b => carry
    );
end;
Yields:
$ ghdl -a 8_bit_adder.vhdl
8_bit_adder.vhdl:53:14: entity 'half_addr' was not analysed
ghdl: compilation error

It is probably obvious that this is my first structural VHDL 
architecture, I'm having trouble finding a good resource on VHDL 
syntax/semantics. Thank you in advance.

: Edited by Moderator
Author: Edmund (Guest)
Posted on:

Rate this post
0 useful
not useful
Oh uh.. nevermind. "half_addr" versus "half_adder".

Author: Lothar M. (lkmiller) (Moderator)
Posted on:

Rate this post
0 useful
not useful
Edmund wrote:
> Oh uh.. nevermind
Ok, but in the next post with VHDL code try that (its to be found a few 
lines above the edit box):
Formatting options
[vhdl]VHDL code[/vhdl]

: Edited by Moderator
Author: Danial Sadiq (Guest)
Posted on:

Rate this post
0 useful
not useful
Hi, I was trying to combine my 4:1 mux and register together. By using 
the method above, where in the code should i put my processes of both 
the components? in the port map?

Author: Lothar M. (lkmiller) (Moderator)
Posted on:

Rate this post
0 useful
not useful
Danial Sadiq wrote:
> By using the method above
There you can see two entities and_gate and xor_gate which are used as 
components in a top level entity half_adder.

> in the port map?
In a port map you have to put the ports of the entity. And that 
entity afterwards is instantiated as a component in a top level entity.
You can see, that the two processes in the two entities and_gate and 
xor_gate do not show up in any port map.

> I was trying to combine my 4:1 mux and register together.
Which mux and which registers? I can't see no code with that...
Post your code (wrap it as described with the [vhdl] tags), then we can 
discuss your particular problem.

Author: René D. (Company: www.dossmatik.de) (dose)
Posted on:

Rate this post
0 useful
not useful
Please use in one VHDL-file only one entry.
Your code will be better readable.
Half-add and full-add are only simple demonstrators. The VHDL-language 
has for this the operator +  for signed and unsigned signal.

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [vhdl]VHDL code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.