Forum: FPGA, VHDL & Co. Problem mit VHDL-components


von ChristianS. (Gast)


Lesenswert?

Hallo,
kann mir vielleicht jemand sagen was ich hier falsch mache.
Der Syntaxcheck geht,beim synthesieren bekomme ich die
Fehlermeldung:multisource on signal led_o ????
Danke erst mal in voraus.

entity ttt is
    Port ( clk : in  STD_LOGIC;
          schalter : in STD_LOGIC;
           led_o : out  STD_LOGIC_VECTOR (3 downto 0));
end ttt;

architecture Behavioral of ttt is

  component Gatter is
    port (
       I  : in std_logic;
       I1 : in std_logic;
     O : out std_logic
        );
  end component;

signal input : std_logic := '1';
signal output : std_logic_vector (3 downto 0);
begin
Gatter1 : Gatter
  port map (
      I => Input,
    I1 => schalter,
    O => output(0)
    );
Gatter2 : Gatter
  port map (
      I => Input,
    I1 => schalter,
    O => output(1)
    );
Gatter3 : Gatter
  port map (
      I => Input,
    I1 => schalter,
    O => output(2)
    );
Gatter4 : Gatter
  port map (
      I => Input,
    I1 => schalter,
    O => output(3)
    );
process(clk)
begin
if rising_edge (clk) then
output(0) <= Input nand schalter;
output(1) <= Input nand schalter;
output(2) <= Input nand schalter;
output(3) <= Input nand schalter;
end if;
end process;

led_o <= output;
end Behavioral;

von TheMason (Gast)


Lesenswert?

die meldung "multisource" weist darauf hin das du versuchst von 2 
stellen aus auf ein register zuzugreifen (setzen oder rücksetzen).
auf der einen seite weist du deinem output über deine gatter einen wert 
zu, und vom prozess auf der anderen seite auch. das geht so nicht.
was soll das ganze genau machen ?

gruß
rene

von Christian P. (kron)


Lesenswert?

Output wird bei dir sowohl vom Prozess als auch von den
Instanzen vom Gatter geändert, daher Multisource.

von Falk (Gast)


Lesenswert?

@ChristianS.

>Fehlermeldung:multisource on signal led_o ????

Wie bereits von den anderen gesagt.
Ausserdem

>signal input : std_logic := '1';

Das wirkt nur in der Simulation, in der Synthese wird es igonriert, Bei 
Xilinx bekommst du ne Warnung und das Signal wird als '0' behandelt!

MfG
Falk

von ChristianS. (Gast)


Lesenswert?

Danke für die schnelle Hilfe.Das ganze soll erstmal nichtsweiter
machen,nur zum Test.Möchte Microblaze mal später einsetzen und
der soll dann aufn Spartan Board irgend ne Logik steuern.
Wenn ich im BSB Mb und bissl Peripherie einrichte und das als
Submodul in der ISE einsetze dann liefert das Programm mir
die Peripherie als solche Komponenten als VHDL.Daher versuch
ich erstmal mit dieser Beschreibungsweise umgehen zu können.
MFG
Christian

von ChristianS. (Gast)


Lesenswert?

Achso-vergessen!
Wie vermeide ich den Multisource? Noch ein Signal definieren,
nur für die NANDrealisierung und dann output-Signal zuordnen?
(Würd ich jetzt schlußfolgern aus euren Aussagen)

Christian

von Falk (Gast)


Lesenswert?

@ChristianS.

>Achso-vergessen!
>Wie vermeide ich den Multisource? Noch ein Signal definieren,
>nur für die NANDrealisierung und dann output-Signal zuordnen?

Deine Gatter sind doch wahrscheinlich schon die NANDs, die du haben 
willst. Also einfach den Ausgang der NANDs dn LEDs zuordnen.

process(clk)
begin
  if rising_edge (clk) then
    led_o <= output;
  end if;
end process;

MfG
Falk

von ChristianS. (Gast)


Lesenswert?

Glaub ich steh aufn Schlauch.Die Gatter sind ja die NANDS,aber
irgendwo muss ich doch auch die Logik realisieren.Und wenn ich das
mach bekommt ja output wieder ne Zuweisung->also Multisource.

von Falk (Gast)


Lesenswert?

@ChristianS.

>Glaub ich steh aufn Schlauch.Die Gatter sind ja die NANDS,aber

Wohl wahr. ;-)

>irgendwo muss ich doch auch die Logik realisieren.Und wenn ich das
>mach bekommt ja output wieder ne Zuweisung->also Multisource.

Was steckt denn in deinen Komponenten namens "Gatter" drin? Die haben 
zwei Eingänge und einen Ausgang. Die Funktion der Komponenten muss in 
einer zweiten Entity (normalerweise eine eigene Datei) beschrieben sein. 
Dort drin steht dann

O <= I NAND I1;

MFG
Falk

von ChristianS. (Gast)


Lesenswert?

Hab grad ne Idee.Darf man dass hier machen?
port map( I => Input,
          I1 =>schalter,
          O => output,
          O <= I nand I1
        );
output wird jetzt nicht mehr von 2 Seiten geändert oder?
(Hab zwar ein VHDL Buch aber das kann man vergessen)

von ChristianS. (Gast)


Lesenswert?

Ach so.Das hab ich schon mal gelesen,wollt das mit den 2 Entitys
umgehen(weis nämlich nicht wie man beide miteinander verbindet).
Naja,heißt wohl noch ein bisschen schlechte Bücher lesen.

von Falk (Gast)


Lesenswert?

@ChristianS.

>Hab grad ne Idee.Darf man dass hier machen?
>port map( I => Input,
>          I1 =>schalter,
>          O => output,

bis hierher OK.

>          O <= I nand I1

Logische Verknüpfungen in Instanzierungen sind nicht erlaubt. So ein 
Müll geht nur in C ;-)

>output wird jetzt nicht mehr von 2 Seiten geändert oder?

Genau.

>(Hab zwar ein VHDL Buch aber das kann man vergessen)

Das gilt leider für viele. Die klammern sich alle krampfhaft an 
dieakademisch Darstellung und kriegen keinen Fuss auf den Boden der 
Realität. Praxisbezug wird scheinbar als abwertend gesehen (in 
akademischen Kreisen).

>Ach so.Das hab ich schon mal gelesen,wollt das mit den 2 Entitys
>umgehen(weis nämlich nicht wie man beide miteinander verbindet).

Wirst du über kurz (nicht lang) vergessen können. Du brauchst 
Komponenten, sonst wirst du bald vom der Komplexität erschlagen. Ist 
aber alles kein Problem. Die meisten Tools (Webpack, Quartus) machen das 
fast automatisch. Einfach die Datei mit der Komponente ins Projekt 
einbinden.

MfG
Falk

von na (Gast)


Lesenswert?

So wie ich das verstehe, versuchst du NAND-Gatter zu definieren, die 
dann taktweise eine Ausgabe erzeugen? Oder wofür sind die Gatter da?
Das ganze würde ohne die Komponenten funktionieren, wenn es nur NAND 
rechnen soll. Aber du willst es zur Übung wahrscheinlich mit Komponenten 
versuchen, also machst du folgendes:
1. Eine entity "Gatter" in einer Datei erzeugen (wenn sie nicht schon da 
ist?) mit den von dir beschriebenen Ein- und Ausgängen. Libraries oben 
drüber nicht vergessen.

entity Gatter is
  port (
     I  : in std_logic;
     I1 : in std_logic;
     O : out std_logic
      );
end Gatter;

architecture behavioral of Gatter is

begin

O <= I nand I1;

end behavioral;

Damit hast du erstmal ganz einfach ein Nand-Gatter selbst geschrieben. 
Das kannst du nun instanziieren und damit für deine Funktion nutzen..

2. Nun schreibst du in eine neue Datei deine entity "ttt". Soweit lässt 
du die Komponenteninstanziierungen, musst allerdings
input <= '1';
noch nach dem begin setzen, da Standardwerte nicht synthesefähig sind. 
Du nutzt sicherlich eine Designumgebung (ISE o.ä.), diese wird dann 
automatisch erkennen, dass du die erste entity "Gatter" jetzt als 
Komponente der zweiten entity "ttt" verwendest (wenn du das mit "2 
entities verbinden" meinst).
Der process sieht folgendermaßen aus (output_reg vorher definieren):

process(clk)
begin
if rising_edge (clk) then
output_reg(0) <= output(0);
output_reg(1) <= output(1);
output_reg(2) <= output(2);
output_reg(3) <= output(3);
end if;
end process;

led_o <= output_reg;

Das bedeutet, dass du die Ausgänge der vier NAND-Gatter jeweils an einen 
Registereingang gelegt werden und zur steigenden Taktflanke dort 
reingeschrieben. Der Registerausgang wird mit deinem led_o verbunden. 
Aufpassen: Register sind Speicher die den Wert zur Taktflanke erst 
übernehmen, willst du eine sofortige Wirkung deines NAND ohne 
Taktverzögerung erreichen, dann das ganze ohne die Register (bzw. den 
process) schreiben.

von ChristianS. (Gast)


Lesenswert?

An Falk,na...

Danke nochmal für eure Antworten.Setzt mich gleich dran und
probiers mal aus.Mir wahr nicht klar das ISE automatisch 2 Dateien
aus 1Projekt miteinander verbinden und evtl.Abhängigkeiten be-
rücksichtigen kann.Aber ISE kann wahrscheinlich alles.
MFG
Christian

von Falk (Gast)


Lesenswert?

@ChristianS.

>rücksichtigen kann.Aber ISE kann wahrscheinlich alles.

Nein, aber schon einiges.

MFG
Falk

von ChristianS. (Gast)


Lesenswert?

Noch eine Frage hätte ich bzgl.der Komponentensyntax.
Wie kann ich mir die Verbindung der Komponenten untereinander im
folgenden Fall vorstellen:
...
component Mikroblaze is
    port (
      fpga_0_LEDs_8Bit_GPIO_d_out_pin : out std_logic_vector(0 to 7);

          );
  end component;

  component OBUF is
    port (
      I : in std_logic;
      O : out std_logic
          );
  end component;
...
...
mikroblaze_i : Mikroblaze
    port map (
 fpga_0_LEDs_8Bit_GPIO_d_out_pin => 
fpga_0_LEDs_8Bit_GPIO_d_out_pin_OBUF,
             );

  obuf_0 : OBUF
    port map (
      I => fpga_0_LEDs_8Bit_GPIO_d_out_pin_OBUF(0),

      O => fpga_0_LEDs_8Bit_GPIO_d_out_pin(0)
             );
...
(.._d_out_pin_OBUF ist auch ein 0-7Vektor)
Würde meinen so:   ___             I ______O
                ->|     |-----------> |      |---
               |  |_____|             |______|   |
               |   Mikrobl.             OBUF     |
                ---------------------------------

von na (Gast)


Lesenswert?

Du kannst bei ISE dein Design synthetisieren und dann auf "View RTL 
Schematic" klicken. Dort kannst du dir die Verdrahtung grafisch 
dargestellt anschauen. Wenn du auf eine Einheit dort doppelklickst, wird 
wiederum deren interner Aufbau angezeigt.

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.