Forum: FPGA, VHDL & Co. Brauche Hilfe bei VHDL Code


von Razdraz (Gast)


Lesenswert?

Hallo,
da ich demnächst eine Prüfung schreiben muss in der ein wenig VHDL 
gefordert wird, hab ich mir mal Active HDL heruntergeladen um mich ein 
wenig einzuarbeiten.

Doch jetzt komm ich grad ums verrecken nicht mehr weiter.

Mein Ziel ist es eine ganz simple Schaltung, bestehend aus 2 Invertern, 
welche hintereinander geschaltet werden, zu programmieren.

Ich will einen Inverter benutzen den ich zuvor schon folgenermaßen 
programmiert habe:
1
entity inverter is      --Entity eines einzelnen Inverters
2
    port( a : in bit;
3
    b : out bit);
4
end inverter;
5
6
7
8
architecture inv_bhv of inverter is --Verhalten des Inverters
9
    begin
10
      b <= NOT a AFTER 1 ns;
11
end inv_bhv;
Dann habe ich folgendes für "Hauptprogramm" geschrieben:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
ENTITY invinv IS                  
5
    port(D_IN : IN BIT :='0';
6
    D_OUT : OUT BIT :='0');
7
END invinv;
8
9
10
11
architecture netlist of invinv is
12
  signal out_1 : std_logic :='1';
13
14
  component inv              
15
    port(a: IN BIT; b : OUT BIT);
16
  end component;
17
18
  begin
19
    INV_1 : inv
20
    port map (D_IN, out_1);
21
    INV_2 : inv
22
    port map (out_1, D_OUT);
23
end netlist;
24
25
26
27
configuration konfi OF invinv is
28
    for netlist
29
        for INV_1, INV_2 : inv USE ENTITY
30
            work.inverter(inv_bhv);
31
        end for;
32
    end for;
33
end konfi;

Habe diesen Code aus dem Skript der Vorlesung zusammengestellt. Dort war 
ein Beispiel eines RS-FF mit 2 NAND-Gattern beschrieben.

Ich bekomme bei meinem Code einige Fehlermeldungen:
# Compile Architecture "netlist" of Entity "invinv"
# Warning: ELAB1_0026: INVINV.vhd : (19, 0): There is no default binding 
for component "inv".(No entity named "inv" was found).
# Error: COMP96_0100: INVINV.vhd : (20, 18): Actual parameter type in 
port map does not match the port formal type "b".
# Error: COMP96_0100: INVINV.vhd : (22, 12): Actual parameter type in 
port map does not match the port formal type "a".
# Compile Configuration "konfi"
# Error: COMP96_0209: INVINV.vhd : (28, 6): Unknown architecture name 
used in configuration declaration.

Ich werd nicht schlau draus, zumal ich einige ähnliche Beispiele gesehen 
habe, die genau so programmiert waren(auf Papier).
Ich bin mir acuh nicht sicher mit dem "work" aus 
"work.inverter(inv_bhv);", da es diese library in mienen Augen gar nicht 
gibt. Allerdings erstellt die "Create testbench" Funktion ebenfalls 
diesen code Abschnitt mit der library "work".
Der letzte Fehler is mir dann völlig unklar...ich hab doch eine 
architecture mit dem richtigen Namen im Code O.o ??

Ich hoffe, mir kann jemand Helfen.

Danke, razdraz

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>  (No entity named "inv" was found).
Ja, die gibt es auch nicht, die heißt ja ganz anders:
1
entity    inverter    is      --Entity eines einzelnen Inverters

Zu dem hier:
1
  signal out_1 : std_logic :='1';
Wie soll das denn auf ein BIT passen:
1
    INV_1 : inv
2
    port map (D_IN, out_1);
3
    INV_2 : inv
4
    port map (out_1, D_OUT);
Du kennst offenbar noch nicht die strenge Typprüfung von VHDL?
Als Tipp: verwende nur std_logic. Nicht diese obskuren Bits.


Mit dem hier gehts (einfach alles in 1 Datei):
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity inv is      --Entity eines einzelnen Inverters
5
    port( a : in bit;
6
    b : out bit);
7
end inv;
8
9
architecture inv_bhv of inv is --Verhalten des Inverters
10
    begin
11
      b <= NOT a AFTER 1 ns;
12
end inv_bhv;
13
14
15
16
library ieee;
17
use ieee.std_logic_1164.all;
18
19
ENTITY invinv IS                  
20
    port( D_IN : IN BIT :='0';
21
          D_OUT : OUT BIT :='0');
22
END invinv;
23
24
architecture netlist of invinv is
25
  signal out_1 : bit :='1';
26
27
  component inv              
28
    port(a: IN BIT; b : OUT BIT);
29
  end component;
30
31
  begin
32
    INV_1 : inv
33
    port map (D_IN, out_1);
34
    INV_2 : inv
35
    port map (out_1, D_OUT);
36
end netlist;

von ´Dr.Schmock (Gast)


Lesenswert?

Merkwürdig, dass die Configuration nicht funktioniert.
Sie ist eigentlich wie im Lehrbuch gemacht.

Ich habs bei mir mit der Xilinx-ISE ausprobiert. Die Entity findet er 
vom Namen nach, aber die Ports werden nicht gemappt.
"Formal port d_i does not exist in ENTITY"
"Formal port d_o does not exist in ENTITY"

Komisch.
Klar, die Configuration weglassen und die Entity direkt einbinden ist 
ohnehin die gebräuchlichere Lösung, das geht auf jeden Fall.

...aber irgendwie wurmt es doch, wenn etwas nicht funktioniert, was 
eigentlich (scheinbar) fehlerfrei ist. ;)

von Duke Scarring (Gast)


Lesenswert?

´Dr.Schmock schrieb:
> Merkwürdig, dass die Configuration nicht funktioniert.

Dafür gibt es den "XST User Guide", Chapter "XST VHDL Language Support".
Und da findet man da sowas:

– Configuration
Supported only with the all clause for instances list. If no clause is 
added, XST looks for the entity
or architecture compiled in the default library

Duke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>> wenn etwas nicht funktioniert, was eigentlich fehlerfrei ist. ;)
Das wird dir im realen VHDL-Synthese-Leben noch einige Male passieren:
der VHDL-Standard erlaubt etwas, was die Synthese nicht in Hardware 
umsetzen kann.

Bei sowas Einfachem (was zudem in fast jedem Buch zu finden ist) geht es 
schon los:
1
   b <= a after 10ns;
2
   c = d/5;
Ein FPGA kann solche Verzögerungen nicht umsetzen.

Oder sowas:
1
   c = d/5;
Es kann nur durch Zweierpotenzen (weil das nur ein Shift bzw. eine 
Umverdrahtung ist).

> Dafür gibt es den "XST User Guide", Chapter "XST VHDL Language Support".
Und so ähnlich wird es für Active HDL auch sein...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.