Hallo Leute,
ich bastel gerade an einem FPGA-Projekt.
Nur mal kurz erklärt, es soll eine Uhr sein, die einen DCF77-Empfänger
ausliest, auswertet und sich damit setzt.
Da die Uhrzeit in BCD übertragen wird und der 7-Segmentanzeige in BCD
übergeben wird, versuche ich intern in BCD-Arithmetik zu rechen.
Das alles ist im Grunde kein Problem, auch wenn ich im Moment noch nicht
überall weiß, wie ich es lösen werde.
Mein Problem ist nur, dass sich mein Projekt bisher anstandslos
synthetisieren ließ und nun nicht mehr.
Was Ihr im Anhang seht ist bei weitem noch nicht fertig. Aber es ließ
sich so synthetisieren.
Ich hatte lediglich, etwas in der Clockwork.sch geändert, um weiter die
Arithmetik zu implementieren. Danach ließ sich das nicht mehr
synthetisieren.
Also machte ich die Änderung wieder rückgängig aber der Fehler blieb.
1
FATAL_ERROR:NgdBuild:Portability/export/Port_Main.h:159:1.6 - This application
Die Console liefert folgendes:
1
...
2
Checking expanded design ...
3
4
Partition Implementation Status
5
-------------------------------
6
7
No Partitions were found in this design.
8
9
-------------------------------
10
EXCEPTION:ConstraintSystem:Cs_ConstraintMgrImpl.c:279:1.202 - Unable to open
FATAL_ERROR:NgdBuild:Portability/export/Port_Main.h:159:1.6 - This application
13
has discovered an exceptional condition from which it cannot recover.
14
Process will terminate. For technical support on this issue, please open a
15
WebCase with this project attached at http://www.xilinx.com/support.
16
17
Process "Translate" failed
Daraus werde ich aber auch nicht schlau.
Wie gesagt, ich hatte nur in der Clockwork.sch etwas geändert.
Kennt jemand solche Fehler?
Weiß jemand, was da zutun ist? Wo könnte ich suchen?
Google wusste auch nicht viel zur Fehlermeldung.
Es wäre mir eine große Hilfe.
Danke!
Fabian
Nico ... schrieb:> Schonmal versucht die Projekt-Dateien zu löschen und neu zu> synthetiesieren?
Nein, noch nicht.
Rerun All war bisher das Ende meines Lateins.
Welches der Dateien soll ich denn löschen?
Oder soll ich besser ein neues Projekt erstellen die VHDL-Files und
Schematics über Add Source neu einbinden neue Symbole erstellen und neu
kompilieren?
Nico ... schrieb:> Du arbeitest doch mit ISE oder? Ich glaube im Menü "Project" gibt es den> Punkt "clean project files"!
Das kannte ich noch nicht. Danke!
Du bist mein Retter!
Hätte mich geärgert das Projekt neu aufbauen zu müssen um einen Fehler
zu umgehen, den man noch nicht mal genau kennt.
>> Bei wem hast Du VHDL, bei Prof. Liebmann?
Nein. Hta der etwa gute Materialien?
Gruß und tausend Dank
Fabian
Fabian Hoemcke schrieb:> Das kannte ich noch nicht. Danke!> Du bist mein Retter!>> Hätte mich geärgert das Projekt neu aufbauen zu müssen um einen Fehler> zu umgehen, den man noch nicht mal genau kennt.
Also ist das Problem so gelöst?
> Nein. Hta der etwa gute Materialien?
Zu meiner Zeit hatte der gute Materialien!
[open]
Ich muss diesen Thread leider wieder öffnen.
Es gibt wieder einen Fehler, zu dem diese Überschrift passt wie die
Faust aufs Auge. Deshalb wollte ich nicht extra einen weiteren Thread
auf machen.
Ich habe mal meine überarbeitete Schematic in den Anhang gepackt. (Ich
hoffe sie ist jetzt auch etwas übersichtlicher.)
"clean project files" habe ich selbstredend auch mehrmals ausprobiert.
Wenn ich sie jetzt versuche zu synthetisieren, tauchen folgende Fehler
auf:
1
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 140. Redeclaration of symbol hundredsYear.
2
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 143. Redeclaration of symbol onesDay.
3
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 144. Redeclaration of symbol onesHour.
4
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 145. Redeclaration of symbol onesMinute.
5
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 146. Redeclaration of symbol onesMonth.
6
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 147. Redeclaration of symbol onesSecond.
7
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 148. Redeclaration of symbol onesYear.
8
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 149. Redeclaration of symbol tensDay.
9
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 150. Redeclaration of symbol tensHour.
10
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 151. Redeclaration of symbol tensMinute.
11
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 152. Redeclaration of symbol tensMonth.
12
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 153. Redeclaration of symbol tensSecond.
13
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 154. Redeclaration of symbol tensYear.
14
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 155. Redeclaration of symbol thousandsYear.
15
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 190. Redeclaration of symbol hundredsYear.
16
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 207. Redeclaration of symbol onesDay.
17
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 216. Redeclaration of symbol onesHour.
18
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 225. Redeclaration of symbol onesMinute.
19
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 234. Redeclaration of symbol onesMonth.
20
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 243. Redeclaration of symbol onesSecond.
21
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 252. Redeclaration of symbol onesYear.
22
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 261. Redeclaration of symbol tensDay.
23
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 270. Redeclaration of symbol tensHour.
24
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 279. Redeclaration of symbol tensMinute.
25
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 288. Redeclaration of symbol tensMonth.
26
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 297. Redeclaration of symbol tensSecond.
27
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 306. Redeclaration of symbol tensYear.
28
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 315. Redeclaration of symbol thousandsYear.
Dabei muss man wissen, dass ich meine Modulo-Counter genauso benamt habe
wie die Busse an deren Ausgängen. Also onesSecond und so weiter.
Was aber eigentlich kein Problem sein sollte. Denn zuvor hatte ich das
ja auch gemacht und da ging es.
Wenn man auf den ersten Link klickt, landet man im folgenden File in der
gekennzeichneten Zeile. (140)
(Das ist nur ein Ausschnitt, den kompletten Source findet man hier falls
nötig: http://pastebin.com/vev2gnmR)
Das sind alles Generic Werte, die ich überschreibe.
Also dachte ich mir, benenne ich die Counter halt eben um.
Das habe ich gemacht und dabei folgenden Fehler erzeugt.
1
INTERNAL_ERROR:Xst:cmain.c:3464:1.56 - Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.
Das grenzt ja fast schon an Frechheit. Interner Fehler, /wenden Sie
sich ans Forum/! ^^
Das habe ich gemacht und es scheint wohl ein Problem zu sein, wenn man
einen Ausgang auf mehrere Eingänge legt. Etwas Konkretes habe ich aber
nicht gefunden.
Wenn das stimmt, stell ich mir die Fragen:
a) Warum lässt die erste Fehlermeldung sich dann über Namen aus?
b) Warum beschwert es sich dann auch bei Countern die keinen Resetter
haben? Wie etwa den Sekunden?
c) Wie kann ich denn einen OBUF für einen Bus einsetzen? OBUF4?
Ich denke mir, so kompliziert mir das auf den ersten Moment scheint, ich
habe hier irgendeine Designregel rigoros verletzt.
Ist das so und wenn ja, welche ist das?
Besten Dank für eure Hilfe
Fabian
Ich habe mal die Schematic in einer etwas besseren Auflösung
hochgeladen. Ich hoffe, man kann sie jetzt besser lesen.
Im übrigen heißt das File immer noch Clockwork.sch, die 2 war nur für
die Bilder.
Gruß
Fabian
Fabian Hoemcke schrieb:> a) Warum lässt die erste Fehlermeldung sich dann über Namen aus?
Du kannst in VHDL (nichts anderes ist das vhf) nicht ein Signal und ein
Untermodul mit gleichem Namen benennen. Wir hatten in der Vorlesung
immer wieder gehört: Vollständig und widerspruchsfrei!!! Das ist die
oberste Maxime bei HDL.
> c) Wie kann ich denn einen OBUF für einen Bus einsetzen? OBUF4?
Einfach das Symbol doppelklicken und bei Instance Name (3:0) dahinter
schreiben. Dann wird das Symbol auch fett dargestellt.
OBUF ist aber wirklich nur für Ausgänge die den Chip verlassen. Wenn du
intern ein Signal umbenennen willst, oder ein Signal, was an einen
Modul-Ausgang geht, auch intern verwenden willst, kannst du den normalen
BUF nehmen.
Hör doch bitte endlich auf mit dem Bastelmurks in Schematic. Bei VHDL
wärst du längst von selbst auf die Widersprüche gekommen.
Christian R. schrieb:> Du kannst in VHDL (nichts anderes ist das vhf) nicht ein Signal und ein> Untermodul mit gleichem Namen benennen.
Das ist komisch. Zuvor ging genau das! Aber Du hast sicher recht.
Jedoch erklärt es nicht, warum die Fehler dann auftreten, wenn die
Generics zugewiesen werden. Denn das geschieht ja immer mit den Namen
des Untermoduls und irgendwie scheint er sich genau dann zu beschweren.
Desweiteren hatte ich die Module auch umbenannt. Und dann Bockt ISE
WEBpack ja nur noch mit dem Verweis auf internen Fehler.
Aber gut, dass mit den doppelten Namen schreibe ich mir hinter die
Ohren.
Und danke für den Tipp mit dem OBUF. Auch wenn das hier nicht die Lösung
sein wird.
Christian R. schrieb:> Hör doch bitte endlich auf mit dem Bastelmurks in Schematic. Bei VHDL> wärst du längst von selbst auf die Widersprüche gekommen.
Wie gesagt, generell gerne. Habe auch keine Lust mehr mit diesem Editor.
Aber ich sitze nun mal nicht alleine an diesem Projekt.
Gruß und Danke
Fabian
Ich bin froh, dass ich den Krampf mit den Schematics nie angefangen
habe...
Das bisschen BCD-Zähler schreibe ich dir in 30 VHDL-Zeilen hin.
Interessanter wird dann die Monatsumschaltung (Schaltjahre...) aber mehr
als etwa 100 Zeilen sollten es trotzdem nicht werden.
Solche Fehler sind selten echte interne Fehler, meistens ist das die
Folge von einem anderen Fehler. Die Einzelprogramme hängen schon gerne
mal auf, wenn ein Fehler passiert. Wichtig ist dann das, was vorher an
Fehlern oder Warnungen ausgegeben wird.
Was sagt denn "Check Schematic"?
Lothar Miller schrieb:> Ich bin froh, dass ich den Krampf mit den Schematics nie angefangen> habe...
nee, Schematics als solches ist kein Krampf, sondern eigentlich die
Sprache der Elektroniker. Andere Leute entwickeln damit ganze
Leiterplatte und so. Allerdings ist der Schematics-Editor von Xilinx
nicht gerade gut zu nennen. Das ändert aber nix am Prinzip.
> Das bisschen BCD-Zähler schreibe ich dir in 30 VHDL-Zeilen hin.DAS möchte ich sehen !!!!! gerade mit VHDL...
Nee, mal ganz generell gesprochen: Dieses Projekt mag ja intellektuell
recht anspruchsvoll sein, aber es ist in seinen Grundfesten komplett
falsch angelegt. Für den DCF77, der seine Infos ja sequentiell im 1
Sekunden-Takt liefert, ist ein CPLD oder FPGA das falsche Mittel. Hier
hat jeder noch so kleine uC mehr Daseinsberechtigung. Ich hätte dafür
einfach einen kleinen PIC (oder die Atmel-fraktion einen Tiny AVR)
genommen und wäre damit in der Performance (Zuverlässigkeit usw.)
dramatisch besser gekommen.
Nicht jeder Chip ist für jede Aufgabe am besten geeignet...
W.S.
W.S. schrieb:> aber es ist in seinen Grundfesten komplett> falsch angelegt
Da gebe ich Dir sicher recht. Aber im Vordergrund stand nicht, wie löse
ich am besten das Problem eine Uhr zu bauen, die ich mit DCF77 setze,
sondern wir sollen ein FPGA-Projekt machen, dass wir uns aussuchen
dürfen.
So entschieden wir uns, dieses, recht einfache Thema, in FPGA
umzusetzen. Ergänzt werden soll das Thema mit einer Darstellung auf
einen Monitor. Das wird dann eng mit einem ATmega oder PIC.
Aber erstmal die Uhr hinbekommen.
Es wurde uns auch geraden, dann auf eine gute Doku zusetzen. Ich finde,
dass kann man bei diesem akademischen Thema recht gut, finde ich.
Gruß
Fabian
Ok, da war ein wenig Tricksen und Platzsparen angesagt... ;-)
Aber die Simulation sieht mal schon gar nicht so schlecht aus.
Muss ich jetzt die Monats- und die Schaltjahrgeschichte und das Setzen
der Register auch noch zeigen?
Lothar Miller schrieb:> Aber die Simulation sieht mal schon gar nicht so schlecht aus.
Soso. Dein Tag hat also 60 Stunden? Deswegen kannst Du hier soviel Zeit
im Forum verbringen ;-)
Duke
Duke Scarring schrieb:> Dein Tag hat also 60 Stunden?
Dammich, nein, nur 30... ;-)
Das war ja auch gerade so am Tagesüberlauf, da kann sowas schon mal
passieren....
Für die Korrektur hast du noch ein Zeile Reserve gelassen.
Und die Uhr geht fast noch 8000 Jahre. Wer weiss wie dann die Flip-Flops
aussehen.
Das war mal wieder Klasse.
Dose schrieb:> Für die Korrektur hast du noch ein Zeile Reserve gelassen.
Ich zitiere mich:
>> Das bisschen BCD-Zähler schreibe ich dir in 30 VHDL-Zeilen hin.
Also das, was da im großen Schaltplan vom ersten Post im
Beitrag "kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)" ist...
>> Interessanter wird dann die Monatsumschaltung (Schaltjahre...) aber mehr>> als etwa 100 Zeilen sollten es trotzdem nicht werden.
Ich habe also noch etwa 71 Zeilen Platz... ;-)
> Und die Uhr geht fast noch 8000 Jahre. Wer weiss wie dann die Flip-Flops> aussehen.
So wie in dem erwähnten Schaltplan eben auch...
Lothar Miller schrieb:> -- meine Monate haben jetzt mal alle 29 Tage... ;-)
Nicht nur das, sie werde auch auf 00, statt auf 01 zurück gesetzt. usw.
Das artet schnell in richtigem Sourcecode aus.
Aber ich glaube, in diesem Fall geht das alles noch.
Auf diese einfache Lösung wäre ich auch gerne gekommen. In C/C++/Jave
und Co wäre mir das sicher auch eingefallen. Hier sehe ich aber immer
Gatter vor meinem geistigen Auge. ;)
1
architectureBehavioralofBCD_Uhris
2
signalldm1,ldm10:bufferunsigned(3downto0):="0000");-- last day of month
-- define ldm1 and ldm10 (switch case of year and month)
23
endif;
24
endprocess;
Jede Sekunde wird zwar der letzte Tag des Monats errechnet, das ist zwar
ineffizent, besser aber als eine kompliziertere Rechnung jedes Mal wenn
der Monat hochgezählt wird. ;)
Danke für die Inspiration.
Gruß
Fabian
Dose schrieb:> Und die Uhr geht fast noch 8000 Jahre. Wer weiss wie dann die Flip-Flops> aussehen.>>> Das war mal wieder Klasse
Diese Punkte verstehe ich jetzt nicht.
Fabian Hoemcke schrieb:> Jede Sekunde wird zwar der letzte Tag des Monats errechnet, das ist zwar> ineffizent,
Jetzt hast du zu sehr die Sofwaresicht. Nur weil es VHDL ist, kann man
das nicht mit C etc vergleichen.
Die Hardware um die einzelenen Vergleiche ist egal wie due es
beschreibst immer vorhanden und auch aktiv, und wird nicht etwa jede
Sekunde neu erzeugt und dann wieder vergessen :-)
Wenn auch der Schematic Ansatz veraltet, ineffiezent und fehleranfällig
ist, ist er näher an dem was tatsächlich passiert und das sollte sich
auch bei Verwendung von VHDL immer vor Augen halten. Mit etwas Erfahrung
geht das dann aber von alleine.
Lattice User schrieb:> Die Hardware um die einzelenen Vergleiche ist egal wie due es> beschreibst immer vorhanden und auch aktiv, und wird nicht etwa jede> Sekunde neu erzeugt und dann wieder vergessen :-)
Das es wieder vergessen wird, habe ich auch gar nicht behauptet. Sondern
nur, dass es jede Sekunde neu zugewiesen wird. Was beispielsweise
31*24*60*60 unnütz oft passiert.
Fabian Hoemcke schrieb:> Sondern nur, dass es jede Sekunde neu zugewiesen wird.
Aber es wird nicht "neu berechnet", sondern es ist einfach "immer da".
Hardware eben...
Fabian Hoemcke schrieb:>> Jede Sekunde wird zwar der letzte Tag des Monats errechnet> Was beispielsweise 31*24*60*60 unnütz oft passiert.
Eben genau das nicht. Ob ich das concurrent oder in einem mit 100MHz
getakteten Prozess mache, ändert nichts: es ist exakt die selbe
Hardware.
Und weil die Hardware nach einer Änderung des Monats erst am Ende dieses
Monats den nächsten "letzten Tag" braucht, hat die Kombinatorik dafür
einen extremen Multicycle-Pfad von gut 30 Tagen... ;-)
Fabian Hoemcke schrieb:> Das es wieder vergessen wird, habe ich auch gar nicht behauptet. Sondern> nur, dass es jede Sekunde neu zugewiesen wird. Was beispielsweise> 31*24*60*60 unnütz oft passiert.
Das ist irrelevant und kostet nichts.
>> Das war mal wieder Klasse>> Diese Punkte verstehe ich jetzt nicht.
Da kennst du das Forum noch nicht, Lothar ist unser virtueller
Nationalkader.
Er hat immer noch ein Schuss auf Lager. Mit simplen Lösungen die er
immer wieder vorstellt, bringt er alle zum staunen.
Hatte Ihm eine Zeile Vorsprung für sein nächstes Werk eingeräumt, was
sicher nicht lang warten wird. Nein das hat Ihm nicht gereicht.
@ Lothar:
Es ist einfach krass, wie Du in ein paar Minuten mal so eben den
kompletten Code aufstellst. Respekt.
Leider bleibt es uns nur, deinen Code zu nehmen. Denn unsere ersten
Ideen zu verfolgen würde nur heißen, es schlechter zu machen.
Da bleibt uns nur zu versuchen, es durch Kommentare wieder rauszuholen,
um zu zeigen, dass wir es verstanden haben. Denn unser Prof. wird das
hier höchst wahrscheinlich finden! ;)
Wir werden noch die Werktage ermitteln, wie sie in Wikipedia ermittelt
wird. http://de.wikipedia.org/wiki/Zellers_Kongruenz
Aber bitte greif uns da nicht auch noch vor. Werde vielleicht mal
unseren Versuch hier posten. :D
Eine Frage hätte ich noch. Wir wollen noch 4-Bit-Busse zum Setzen der
Werte verwenden.
1
Port(signalset_s1:inunsigned(3downto0));
Reicht es da aus, einfach auf diese Busse zu reagieren?
1
Set:process(set_s1)begin
Oder brauchen wir noch ein enable-Wire? (set_s1_en)
Ich stelle mir vor, wenn, meinetwegen m1 auf 5 gestellt wurde, dann der
Wert nicht mehr stimmt und rein zufällig wieder bei der Minute 5 den
Wert gesetzt werden soll. Wenn der Wert sich nicht ändert, aber neu
zugewiesen werden muss, brauche ich doch ein Enable, richtig?
Danke an Alle
Fabian
Fabian Hoemcke schrieb:> Leider bleibt es uns nur, deinen Code zu nehmen.
Nur zu. aber ich empfehle eine "anschaulichere" Formatierung der
if-Abfragen. Und dabei aufpassen, dass if und das zugehörige elsif auf
der selben Ebene stehen, weil sie nur 1 end if haben. Etwa so:
> Denn unser Prof. wird das hier höchst wahrscheinlich finden! ;)
Ich sag nur Guttenberg...
> Reicht es da aus, einfach auf diese Busse zu reagieren?
Probiers aus. Das geht so sowieso nicht...
Als Info: die Sensitivliste ist nur und ausschließlich für die
Simulation interessant. Der Synthesizer schert sich nicht um diese
Liste. Du kannst also damit nichts "steuern".
> Reicht es da aus, einfach auf diese Busse zu reagieren?
Nein. Du brauchst zwingend ein "die Daten sind gültig" Signal. Denn
sonst würden (an der Stelle, wo ichs vermerkt habe) z.B. 50000000 mal
pro Sekunde die Daten übernommen.
Und weil du (hoffentlich) sowieso das ganze Design synchron machst,
hat in der Sensitivliste nur der Takt was zu suchen.
Such mal nach "VHDL Postulate" hier im Forum... ;-)
https://www.mikrocontroller.net/search?query=vhdl+postulate
Und leih dir mal die Bücher da aus:
Beitrag "Re: Einige Fragen zu VHDL"
Also ich habe es versucht und beiße mir an VHDL gerade erheblich die
Zähne aus!
Ich packe hier mal meinen Code rein, von meinem BCDclockwork.
Ich arbeite auch noch an anderen Punkten an meinem Projekt, zum beispiel
versuche ich lediglich ein paar Punkte oder Ziffern, wenn gewünscht
blinken zu lassen. (Das ist jetzt nur ein Beispiel und jetzt nicht
wichtig.) Jeder noch so kleine Handgriff scheint aber immer in einem
Handstand samt Klimmzug zu münden.
Hier erstmal mein Code. Weiter Unten gibt es ein paar Fragen, wäre super
wenn Ihr darauf ein paar Antworten hättet.
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
useIEEE.NUMERIC_STD.ALL;
7
8
-- Uncomment the following library declaration if instantiating
9
-- any Xilinx primitives in this code.
10
--library UNISIM;
11
--use UNISIM.VComponents.all;
12
13
entityBCDclockworkis
14
Port(clk,EN:inSTD_LOGIC;-- Takt z.B. 50MHz, Clock-Enable mit 1 Hz
Frage 1) Warum kann man in der Architecture multiplexen mittels
1
withSELECTORselect
2
Ziel<=Quelle1whenBEDINGUNG1,
3
<=Quelle2whenBEDINGUNG2,
4
<=Quellenwhenothers;
aber demultiplexen muss man in einem Process wie oben?
1
caseSELECTORis
2
whenBEDINGUNG1=>Ziel1<=Quelle;
3
whenBEDINGUNG2=>Ziel2<=Quelle;
4
whenothers=>Zieln<=Quelle;
5
endcase;
Frage 2) Für when others habe ich eine Variable deklariert, die mir
den Wert auf nimmt damit irgendwas passiert.
Denn VHDL will ja dass immer irgendwas passiert, auch für die Fälle die
einen gar nicht interessieren. Gibt es eine Möglichkeit, diese Zuweisung
durch sowas wie NOP zu ersetzen? Damit kann dann auch die ungeliebte
Variable wegfallen.
Frage 3) Multiple Source. Die erfahrenen VHDL-Programmierer haben
sicher schon erkannt, dass sich das nicht synthetisieren oder
kompilieren lässt. Da die internen Signale wie S_1 und D_10 mehrfach
zugewiesen werden.
Dabei habe ich die Zuweisungen extra mit If else getrennt. Dies müsste
ja wie ein Multiplexing funktionieren, das ist jedoch ISE WEBpack so
ziemlich egal. Wie kann man das denn lösen? Ich meine, bei der
Errechnung der Zeit und des Datums sind ja auch Mehrfachzuweisungen
getrennt durch Kontrollstruckturen. Und da geht es auch.
*EDIT*: Die Frage ist gestrichen. Ich Esel hatte vergessen die
Unterstriche zu setzen und damit nicht die internen Signale genutzt. Ich
nehme an, damit kann auch das IF ELSE wegfallen an der Stelle.
Frage 4) Was bedeutet das unsigned mit Apostroph?
1
+unsigned'("000"&cly);
Ich kenne das nur als Operator um auf Argumente zuzugreifen. In diesem
Kontext konnte ich im Internet nichts finden.
Frage 5) Wie weiter oben von mir befürchtet artet dieser VHDL-Code in
Spagetti-Code aus und das Modul ist längst noch nicht fertig.
Bald bedarf es zwei mal mehr Kommentare als Code um es auch morgen noch
verstehen zu können. spätestens ab hier, wäre mir ein guter
Schematic-Editor lieber. Und spätenstens ab hier kann ich Anmerkungen à
la "Wenn Du damit professionell arbeitest, wirst Du nur noch VHDL
schreiben..." nicht verstehen.
Wie schreibt Ihr denn euren Code, dass er leserlich bleibt? Ich meine,
ich habe die Berechnung der Zeit und des Datum deshalb so kompakt
gelassen um etwas von der Lesbarkeit zu erhalten.
Wäre super, wenn ich wieder ein Mü weiter käme
Danke
Fabian Hoemcke schrieb:
Zu allererst: Der Code ist grausam!
> Frage 1) Warum kann man in der Architecture multiplexen mittelswith SELECTOR
select
> Ziel <= Quelle1 when BEDINGUNG1,> <= Quelle2 when BEDINGUNG2,> <= Quellen when others;aber demultiplexen muss man in einem Process wie
oben?case SELECTOR is
> when BEDINGUNG1 => Ziel1<=Quelle;> when BEDINGUNG2 => Ziel2<=Quelle;> when others => Zieln<=Quelle;> end case;
Weil es da eben in VHDL den Unterschied zwischen 'concurrent' und
'process' gibt. Ist halt so, man kann sich darueber aufregen aber das
aendert nunmal nix daran...
> Frage 2) Für when others habe ich eine Variable deklariert, die mir> den Wert auf nimmt damit irgendwas passiert.> Denn VHDL will ja dass immer irgendwas passiert, auch für die Fälle die> einen gar nicht interessieren. Gibt es eine Möglichkeit, diese Zuweisung> durch sowas wie NOP zu ersetzen? Damit kann dann auch die ungeliebte> Variable wegfallen.
when others => null hilft da vlt. weiter. Aber auch daran denken, dass
ein Simulator mehr als nur '0' und '1' kann, da gibt es 'Z', 'U', 'X',
...
>> Frage 3) Multiple Source.
???
> Frage 4) Was bedeutet das unsigned mit Apostroph?+ unsigned'("000"&cly);Ich
kenne das nur als Operator um auf Argumente zuzugreifen. In diesem
> Kontext konnte ich im Internet nichts finden.
??? Generell beschreibt der Apostroph ein Attribut
> Frage 5) Wie weiter oben von mir befürchtet artet dieser VHDL-Code in> Spagetti-Code aus und das Modul ist längst noch nicht fertig.> Bald bedarf es zwei mal mehr Kommentare als Code um es auch morgen noch> verstehen zu können. spätestens ab hier, wäre mir ein guter> Schematic-Editor lieber. Und spätenstens ab hier kann ich Anmerkungen à> la "Wenn Du damit professionell arbeitest, wirst Du nur noch VHDL> schreiben..." nicht verstehen.
Also ohne deine HW-Beschreibung da oben jetzt wirklich genau angeschaut
und verstanden zu haben: Sowas wuerde ich nie schreiben! Kann man das
vlt. auch verstaendlicher/uebersichtlicher/strukturierter machen?
> Wie schreibt Ihr denn euren Code, dass er leserlich bleibt? Ich meine,> ich habe die Berechnung der Zeit und des Datum deshalb so kompakt> gelassen um etwas von der Lesbarkeit zu erhalten.
Na, ganz offensichtlich hat das nur suboptimal funktioniert...
Du scheinst ja ein paar Probleme mit VHDL (und in Verilog waere es
aehnlich) zu haben. Schematics haben m.M. nach in ganz wenigen Faellen
einen Vorteil der besseren Uebersichtlichkeit. Aber sieh's mal so: Deine
(laut eigener Meinung) unuebersichtliche Beschreibung der Funktion oben,
die wirst du auch im Schematic nicht besser verstaendlich
rueberbringen...
Fabian Hoemcke schrieb:> Wie schreibt Ihr denn euren Code, dass er leserlich bleibt? Ich meine,> ich habe die Berechnung der Zeit und des Datum deshalb so kompakt> gelassen um etwas von der Lesbarkeit zu erhalten.
Der Code ist doch nur deswegen unleserlich weil jemand Lothar dazu
herausgefordert hat, das ganze in 30 Zeilen zu machen.
Formatiere das anständig und schon sieht es viel übersichtlicher aus.
Fabian Hoemcke schrieb:> Gibt es eine Möglichkeit, diese Zuweisung> durch sowas wie NOP zu ersetzen?
Da ist doch schon sowas im Einsatz:
when others => null;
> Frage 4) Was bedeutet das unsigned mit Apostroph?
Das ist ein Qualifier:
http://www.lothar-miller.de/s9y/archives/82-Qualifier.html> Frage 5) Wie weiter oben von mir befürchtet artet dieser VHDL-Code in> Spagetti-Code aus und das Modul ist längst noch nicht fertig.> Bald bedarf es zwei mal mehr Kommentare als Code um es auch morgen noch> verstehen zu können.
Du musst ja nicht die ganze Welt in ein einziges VHDL-Modul
reinpacken...
> spätestens ab hier, wäre mir ein guter Schematic-Editor lieber.
Nur zu Erinnerung: in deinem riesigen Schaltplan oben hattest du nur
einen klitzekleinen Bruchteil der Funktionalität, die da jetzt auf 2
Bilschirmseiten halbwegs leserlich beschrieben ist. Da haben z.B. die
Stunden- und Tagesüberläufe nicht richtig funktioniert, das mit dem
Laden der Register war nur laut angedacht, und von einer
Schaltjahrberechnung war weit&breit nichts zu sehen...
> Wie schreibt Ihr denn euren Code, dass er leserlich bleibt? Ich meine,> ich habe die Berechnung der Zeit und des Datum deshalb so kompakt> gelassen um etwas von der Lesbarkeit zu erhalten.
In sinnvollen Gruppen. Wenn mich die Schaltjahrberechnung interessiert,
dann schere ich mich nicht um den Zähler. Wenn du die Übernahme
beschreibst, dann lässt du die Schaltjahrberechnung links liegen...
berndl schrieb:> Also ohne deine HW-Beschreibung da oben jetzt wirklich genau angeschaut> und verstanden zu haben: Sowas wuerde ich nie schreiben!
Ich auch nicht. Nur, wenns jemand unbedingt drauf ankommen lassen will,
und mir nur 30 Zeilen gibt... ;-)
Das ist, wie wenn mich jemand auf dem Weg von&zur Arbeit auf den
Kreisverkehren meiner Haus- und Hofstrecke herausfordert: er wird
verlieren, weil er nicht weiß, welchen der 9 Kreisel er wie schnell an-
und durchfahren kann. Aber im Normalfall rase ich durch die Dinger auch
nicht so durch...
> Kann man das> vlt. auch verstaendlicher/uebersichtlicher/strukturierter machen?
Einen Anstatz zur schöneren Formatierung der if-Abfragen habe ich shcon
nachgeliefert.
Lothar Miller schrieb:>> spätestens ab hier, wäre mir ein guter Schematic-Editor lieber.> Nur zu Erinnerung: in deinem riesigen Schaltplan oben hattest du nur> einen klitzekleinen Bruchteil der Funktionalität, die da jetzt auf 2> Bilschirmseiten halbwegs leserlich beschrieben ist
Um das etwas zu unterstreichen im Anhang der Schaltplan den Synplify Pro
(in Diamond) generiert. Der basiert auf Logik (and,or, etc),
Multiplexer, Register, Addierer und Vergleicher.
Zugegeben da automatisch erzeugt das Gegenteil von übersichtlich, aber
auch manuell wird man sich da sehr schwer tun.
Lothar Miller schrieb:> process (mt1, mt10, y1, y10, y100, y1k)> begin> cly <= '0';> case "000"&y10(0)&y1 is -- alle 4 Jahre korrigieren> when x"00" => cly <= '1';> when x"04" => cly <= '1';> when x"08" => cly <= '1';> when x"12" => cly <= '1';> when x"16" => cly <= '1';> when others => null;> end case;> if (y10&y1=x"00") then -- alle hundert Jahre nicht korrigieren> cly <= '0';> end if;> case "000"&y1k(0)&y100 is -- alle 400 Jahre doch wieder korrigieren> when x"00" => cly <= '1';> when x"04" => cly <= '1';> when x"08" => cly <= '1';> when x"12" => cly <= '1';> when x"16" => cly <= '1';> when others => null;> end case;> if (mt10&mt1 /= x"02") then -- und überhaupt nur den Februar korrigieren> cly <= '0';> end if;> end process;
Hey danke Lothar.
Dein Code funktioniert super. Hast uns echt weiter geholfen.
Leider ist Dir hier bei der Schaltjahrberechnung ein kleiner Fehler
unterlaufen. Die Berechnung des 400sten Jahres muss man in den IF THEN
Zweig für die 100 Jahre packen. Sonst ist 2001 auch ein Schaltjahr. Erst
2101 wäre dann keines mehr.
So funktioniert es dann richtig:
1
process(mt1,mt10,y1,y10,y100,y1k)
2
begin
3
cly<='0';
4
case"000"&y10(0)&y1is-- alle 4 Jahre korrigieren
5
whenx"00"=>cly<='1';
6
whenx"04"=>cly<='1';
7
whenx"08"=>cly<='1';
8
whenx"12"=>cly<='1';
9
whenx"16"=>cly<='1';
10
whenothers=>null;
11
endcase;
12
if(y10&y1=x"00")then-- alle hundert Jahre nicht korrigieren
13
cly<='0';
14
case"000"&y1k(0)&y100is-- alle 400 Jahre doch wieder korrigieren
15
whenx"00"=>cly<='1';
16
whenx"04"=>cly<='1';
17
whenx"08"=>cly<='1';
18
whenx"12"=>cly<='1';
19
whenx"16"=>cly<='1';
20
whenothers=>null;
21
endcase;
22
endif;
23
if(mt10&mt1/=x"02")then-- und überhaupt nur den Februar korrigieren
24
cly<='0';
25
endif;
26
endprocess;
Hatten eine ganze weile grübeln müssen um den Fehler zu finden. ;)
Gruß
Fabian
Fabian Hoemcke schrieb:> Hey danke Lothar.
De nada.
> Leider ist Dir hier bei der Schaltjahrberechnung ein kleiner Fehler> unterlaufen.
Ich behaupte einfach: das war gewollt, damit ihr auch was zu tun habt...
;-)
> Hatten eine ganze weile grübeln müssen um den Fehler zu finden. ;)
Diesen Prozess nennt man "Lernen". Viel Spass beim Weiterlernen...