Hi @ all
Ich habe ein VHDL-Programm geschrieben. Die Simulation war sehr
erfolgreich und ein Fehler wurde bei der Synthese auch nicht entdeckt.
Jedoch kommen beim Routen Warnmeldungen die mich beunruhigen.
WARNING:Par:276 - The signal AD_Converter_Modul/add_10/cout has no
load
WARNING:Par:276 - The signal Create_Bit_Stream_Modul/add_197/cout has
no load
WARNING:Par:276 - The signal Create_Bit_Stream_Modul/add_89/cout has no
load
WARNING:Par:276 - The signal Create_Bit_Stream_Modul/add_232/cout has
no load
Das Problem ist, das die Signale andersheißen und ich somit nicht weiß
wo die Fehler liegen.
Kann mir jemand einen Tip geben?
Grüsse
Michael
Mit was für einem Programm hast du synthetisiert? Ich bekomme noch
diverve Fehlermeldungen, wenn ich die Datei durch die ISE laufen lassen
will...
Gruß Jörn
Projekt ist mit Protel DXP 2004 erstellt worden. Dies ist auch nur ein
Teil des Programms.
Konnte den Fehler selber beheben. Durch das neue Service Pack 4 ist ein
neuer Synthesizer "Altium Synthesizer" hinzugekommen. Mit diesem
werden die Warnungen angezeit. Benutze ich jedoch den Alten Synthesizer
"DXP Synthesizer" dann werden die Warnungen nicht mehr angezeigt.
Vielleicht ist es ja noch ein Bug der behoben werden muss.
Grüsse
Michael
Hallo Michael,
also einen groben Fehler habe ich schon in Deinem Code gesehen, aber
ich weiß nicht, ob der irgendwas mit den Fehlermeldungen zu tun hat.
Bei einem "ge-clock-ten" Prozess, erkennbar an:
... elsif(CLK'event and CLK = '1')then ...
, steht in der sensitivity list nur Clock und die Reset-Bedingung, also
z.B. bei Deinem 2. Prozess:
process (CLR,CLK)
und NICHT
process (CLR,CLK,GATE,S_RESET,S_ONE_TIME,S_RESET_CONFIG)
Gruß
Ines
Ich glaube nicht das dies richtig ist. In dieser Liste müssen alle
Eingänge und Signale, die an den Prozess übergeben werden aufgelistet
sein. Ansonsten funktioniert dies nicht.
Wo hast Du denn eigentlich diese Information her?
Grüsse Michael
Ich programmiere halt schon eine Weile in VHDL. Es ist so, in der
sensitivity list müssen sie Signale aufgelistet werden, bei deren
Änderung der Prozess abgearbeitet werden soll. Und wann willst Du
arbeiten? Bei Clear oder bei einer steigenden Clock-Flanke unabhängig
davon, was die anderen Signale tun.
Ines
Hallo Michael
In der sensitivity list brauchen nur die Signale / Eingänge
aufgelistet werden, die in dem Prozess ein Ereignis auslösen.
Es können auch alle Signale aufgelistet werden, dass ist im übrigen
aber nicht gerade sinnvoll, da bei jeder Änderung eines dieser Signale
der Prozess im Simulator abgearbeitet wird.
Für die Synthese hat diese Liste keine Bedeutung, da das
Synthesewerkzeug aus der Beschreibung die spätere logische Verknüpfung
bilden muss.
MfG
Holger
nur ein gut gemeinter Rat:
Du hast in Deinem Design 3 Signale, die asynchrone
Set / Reset Aktionen durchführen:
CLR
RESET_ADC_A
GATE
Diese werden immer wieder in anderen Kombinationen
abgefragt, teilweise auch auf unterschiedliche Pegel.
Ich weiss nicht wo die Signale herkommen und wie
schnell das Timing ist, aber sowas kann durchaus
zu Fehlern führen, an denen man wochenlang rumsucht.
Idealerweise sollte max. 1 asynchroner Reset vorhanden
sein, der dann entweder IMMER auf 1 oder IMMER auf 0
abgefragt wird (was anderes ergibt auch wenig Sinn)
Vielleicht kannst Du das Rücksetzen der Register in den
vielen Prozessen synchron machen, das könnte mögl. viel
Ärger ersparen
(in einer funktionalen Simulation sieht man die Probleme nicht)
Erst einmal vielen Dank für die Tips. Habe wieder etwas dazu gelernt.
:-)
Zu den asynchronen Resets: Bei mir muss die Logik an unterschiedlichen
Stellen zurückgesetzt werden. Deshalb benutze ich 3 Resets. Diese
werden nicht asynchrone ausgeführt, sondern werden von einem anderen
Prozess, den ich nicht mit angegeben habe, synchrone erzeugt. Ich
dachte das dies einfacher ist.
Grüsse
Michael
Hallo Michael,
also meiner Meinung nach wäre es wie folgt schöner (am Beispiel Deines
1. Prozesses):
process (CLR,CLK)
begin
if(CLR = '1' or Gate = '0')then
S_ONE_TIME <= '0';
elsif(CLK'event and CLK = '1')then
if(Gate = '0')then
S_ONE_TIME <= '0';
else
if(S_REGB(17) = '1')then
S_ONE_TIME <= '1';
end if;
end if;
end if;
end process;
Wobei CLR ein asynchroner Reset wäre und Gate ein synchroner, den Du
aber nicht schon vorher mit einem anderen Prozess erzeugst.
Ines
FPGA User vielleicht hast Du ein Headset dann kann man sich über Skype
oder ICQ besser unterhalten.
Ich werde mal einen Account einrichten und es wäre super geil wenn wir
dann mal eine Konferenzschaltung aufmachen könnten. :-)
Grüsse Michael
process (CLR,CLK)
begin
if(CLR = '1' or Gate = '0')then
S_ONE_TIME <= '0';
elsif(CLK'event and CLK = '1')then
if(Gate = '0')then
S_ONE_TIME <= '0';
else
if(S_REGB(17) = '1')then
S_ONE_TIME <= '1';
end if;
end if;
end if;
end process;
Das lässt sich vereinfachen, da im synchronen Clock Bereich Gate
niemals == '0' sein kann:
process (CLR,CLK)
begin
if(CLR = '1' or Gate = '0')then
S_ONE_TIME <= '0';
elsif(CLK'event and CLK = '1')then
if(S_REGB(17) = '1')then
S_ONE_TIME <= '1';
else
S_ONE_TIME <= '0';
end if;
end if;
end process;
Bei der if Abfrage S_REGB(17) implementiere ich nach Möglichkeit immer
beide If Zweige, sprich den If Part und auch else Part.
Diese If Abfrage kann eventl. vereinfacht werden:
S_ONE_TIME <= S_REGB(17);
Allerdings wird dies zu einem anderen Fitting führen und je nach dem
entweder besser oder schlechter im Resoucenverbrauch sein und sich
ebenfalls das Gesatmtiming verändern.
gruß hagen