mikrocontroller.net

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


Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Peters (kron)
Datum:

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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ChristianS.

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

Nein, aber schon einiges.

MFG
Falk

Autor: ChristianS. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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     |
                ---------------------------------

Autor: na (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.