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.
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.
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.
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.
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"
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 :)
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...
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?
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 ;)
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!)
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 :(
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.
Lattice User schrieb: > In zaehler.vhd wird den Ausgangsports q nichts zugewiesen. Stimmt - da der Prozess keine Ausgangssignale zuweist, wird alles gnadenlos wegoptimiert.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.