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.
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:
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.