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;
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
Output wird bei dir sowohl vom Prozess als auch von den Instanzen vom Gatter geändert, daher Multisource.
@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
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
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
@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
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.
@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
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)
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.
@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
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.
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
@ChristianS.
>rücksichtigen kann.Aber ISE kann wahrscheinlich alles.
Nein, aber schon einiges.
MFG
Falk
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 | ---------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.