Forum: FPGA, VHDL & Co. Illegal connection of instance output to entity input


von Chris2k (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

Ich habe ein kleines Problem mit meinem VHDL-Code. Und zwar möchte ich 
zu Übungszwecken folgende Schaltung realisieren:

1. Einen 4 Bit-Counter, der mit einem Clock hochzählt
2. Einen Block, der zwei 4 Bit breite Eingänge A und B besitzt, einen 
Steuereingang S sowie einen 4 Bit breiten Ausgang Y besitzt. Mit Pin S 
soll es möglich sein, das Ausgangssignal entweder mit A oder B zu 
verschalten (ich nenn das ganze Ding mal einfach Multiplexer).
3. Der Counter ist an den Eingang A des Multiplexers angeschlossen, der 
Eingang B bleibt offen bzw. wird anderweitig beschaltet.

Ich habe mal meine Lösung im Anhang hinterlegt. Aber irgendwie will das 
nicht, ich bekomme die Fehlermeldung "Illegal connection of instance 
output q to entity input/constant a0". Darf man eine Entity nicht mit 
einer instanziierten Komponente verschalten? Ist bestimmt nur ein 
einfacher Fehler, ich komme aber im Selbststudium nicht weiter...

Vielen Dank.

von P. K. (pek)


Lesenswert?

Chris2k schrieb:
> "Illegal connection of instance output q to entity input/constant a0".

Wie die Fehlermeldung schon sagt, hängst du innerhalb der 
MUX-Architektur den Zählerausgang auf die MUX-Eingänge.

Da hast Du in der Hierarchie was durcheinander gebracht. Du brauchst 
eine übergeordnete Architektur, welche sowohl Zähler als auch MUX 
instantiert.

von Chris2k (Gast)


Lesenswert?

Danke, das probiere ich aus.

Ich hatte diesbezüglich mit jemandem gesprochen, und der meinte, dass 
das so einfach gehe, also innerhalb des Multiplexers den Zähler zu 
instanziieren und beide Sachen direkt so verwenden zu können. Da gab es 
wohl dann ein Missverständnis.

von P. K. (pek)


Lesenswert?

Das ginge schon, nur kommt dann der Eingang A halt vom Zähler. In dem 
Fall müsstest Du den MUX-Eingang A aus der Entity entfernen.

Der MUX-Eingang darf jedenfalls nicht sowohl vom Zähler als auch vom 
Entity-Eingang getrieben sein.

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


Lesenswert?

1
  port(A3,A2,A1,A0: in std_logic;
2
       B3,B2,B1,B0: in std_logic;
3
  :
4
              q(3) => A3,
5
              q(2) => A2,
6
              q(1) => A1,
7
              q(0) => A0);
8
  ;
9
  a <= (A3,A2,A1,A0);
10
  b <= (B3,B2,B1,B0);
Wie wärs mit Vektoren?
Dann sparst du dir sehr viel Tipperei...
1
  port(Ain: in std_logic_vector (3 downto 0);
2
       Bin: in std_logic_vector (3 downto 0);
3
  :
4
              q => Ain);
5
  ;
6
  a <= Ain;
7
  b <= Bin;


Am Rande:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
Nimm besser aktuelle Libs zum Rechnen:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

von Chris2k (Gast)


Angehängte Dateien:

Lesenswert?

Danke euch beiden für die Hinweise. Ich denke, ich hab den Grundsatz nun 
verstanden (hat mich dennoch etwas Kniffelei gekostet ;)).

Ich hab eure Verbesserungen umgesetzt, denke ich. Siehe Anhang. Ich 
wollte das Konstrukt mal auf meinem Eval-Board laufen lassen, aber beim 
Mappen der Pins tauchen meine "clock"- und "reset"-Eingänge nicht auf, 
beim Übersetzen kommt die Warnung "Port [clock|reset] dies not connect 
to any buffers". Die anderen Ports (Bin, S und Yout) sind vorhanden. 
Ähem. Clock und Reset wollte ich als Pins aus dem FPGA (MachXO2-Board 
von Lattice) herausführen. Wo ist da nun noch der Fehler?

Ist mein zweiter Versuch nach dem Knight Rider-Lauflicht :)

von P. K. (pek)


Lesenswert?

Kenne den MachXO2 nicht im Detail. :-(

Stimmen Deine Constraints/Assignments? Clock und Reset müssen 
möglicherweise an ganz bestimmte Pins gelegt werden, brauchen vielleicht 
spezielle Buffer etc. Hier führt nichts am leidigen RTFM vorbei...

von voodoofrei (Gast)


Lesenswert?

Chris2k schrieb:
> Clock und Reset wollte ich als Pins aus dem FPGA (MachXO2-Board
> von Lattice) herausführen. Wo ist da nun noch der Fehler?

Stell mal dein LPF-File rein (mit den Portmappings) - wird überhaupt ein 
externer Takt verwendet?

von Chris2k (Gast)


Angehängte Dateien:

Lesenswert?

LPF-File ist im Anhang. Das wird doch automatisch erzeugt, oder? Ich 
habe im Spreadsheet View in Diamond die Ports Bin_3 .. Bin_0 und S an 
die von mir gewünschten Pins gemapped. Yout_3 .. Yout_0 habe ich noch 
offengelassen, weil ich mich zunächst über den fehlenden Rest 
(clock/reset) gewundert habe.

Als Clock für den Zähler wollte ich einen Signalgenerator verwenden. 
Aber wie beschrieben erscheint clock und reset nicht (ss.png).

Genauso war ich auch beim Lauflicht vorgegangen, da hatte ich aber keine 
Eingangssignale verwenden müssen. 
(Beitrag "Re: Infos zum Umgang mit "Lattice Diamond"?"). Die Ports hatte 
ich da auf die Pins vom FPGA gelegt, wo die LEDs angeschlossen sind. 
"Eigentlich ganz einfach", dachte ich mir ;)

von voodoofrei (Gast)


Lesenswert?

versuchs mal manuel im LPF:

LOCATE COMP "CLOCK" SITE "3" ;

(anstelle der 3 halt den Pin definieren, den du verwenden willst)

Reset dito!

(ich werf aber bei Gelegenheit noch mal einen genaueren Blick drauf!)

von Chris2k (Gast)


Lesenswert?

Ich habs mal so probiert, die lpf-Datei per Hand zu bearbeiten. Die 
Meldung "does not connect to any buffers" bleibt bestehen, und es kommen 
noch zusätzliche Warnungen zum Vorschein. Also eigentlich müssten die 
Ports der entity zaehl_mul im spreadsheet erscheinen. Ich versteh's 
nicht.

Peter K. schrieb:
> Clock und Reset müssen
> möglicherweise an ganz bestimmte Pins gelegt werden, brauchen vielleicht
> spezielle Buffer etc. Hier führt nichts am leidigen RTFM vorbei...

An bestimmte Pins? Wenn es so ist, sollte doch Diamond so schlau sein, 
mir eine Bank vorzuschreiben o.ä. Aber die Ports erscheinen ja 
nichteinmal, sodass ich tool-gesteuert irgendwelche Zuweisungen 
vornehmen könnte :(

von Lattice User (Gast)


Lesenswert?

Hat mit der Pinzurodung nichts zu tun. Solche Fehler enstehen meistens 
(bei mir zumindestens) wenn der Synthesiser der Meinung ist er müsste 
wegen einen kleinen Fehler alles wegoptimieren.

Das spuckt Synplify aus:
1
W  CL169  Pruning register Qint(3 downto 0)    zaehler.vhd (17)  Test5.srr (22)  19:20:56 Fri May 11  compilerReport
2
W  CL240  q is not assigned a value (floating) -- simulation mismatch possible.   zaehler.vhd (8)  Test5.srr (21)  19:20:56 Fri May 11  compilerReport

In zaehler.vhd wird den Ausgangsports q nichts zugewiesen.

von voodoofrei (Gast)


Lesenswert?

Lattice User schrieb:
> In zaehler.vhd wird den Ausgangsports q nichts zugewiesen.

Stimmt - da der Prozess keine Ausgangssignale zuweist, wird alles 
gnadenlos wegoptimiert.

von voodoofrei (Gast)


Lesenswert?

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity zaehler is
  port(clk: in std_logic;
       reset: in std_logic;
       q: out std_logic_vector(3 downto 0));
end entity zaehler;

architecture zaehler_rtl of zaehler is
  signal Qint: unsigned(3 downto 0);

begin
  process (reset,clk)
  begin
    if(reset = '1') then Qint <=x"0";
    elsif(clk = '1') and clk'event then
      if(Qint > x"8") then Qint <= x"0";
      else Qint <= Qint+1;
      end if;
    end if;
  end process;

  q <= Qint;

end architecture zaehler_rtl;

btw:
1
elsif rising_edge(clk = '1') then

gefällt mir persönlich besser ;)

Beitrag "CLK'event oder rising_edge(clk)"

Der MachXO2 hat übrigens auch einen internen Oszillator

von Chris2k (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich danke euch, das war der Fehler. Jetzt bin ich auch auf sowas 
sensibilisiert. :)

Das ganze hab ich jetzt simuliert und auch in der Praxis getestet, 
funktioniert :) Die Verbesserungen mit rising_edge(clk) hab ich noch 
eingepflegt, den internen Oszillator hab ich schon unter 
Beitrag "Re: Infos zum Umgang mit "Lattice Diamond"?" zum Testen 
ausprobiert.

Quelltext noch anbei für Interessierte.

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.