mikrocontroller.net

Forum: FPGA, VHDL & Co. kruder Fehler bei FPGA-Programmierung (ISE WEBpack-Schematic)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.
FATAL_ERROR:NgdBuild:Portability/export/Port_Main.h:159:1.6 - This application

Die Console liefert folgendes:
...
Checking expanded design ...

Partition Implementation Status
-------------------------------

  No Partitions were found in this design.

-------------------------------
EXCEPTION:ConstraintSystem:Cs_ConstraintMgrImpl.c:279:1.202 - Unable to open
   project repository file 'xlnx_auto_0_xdb/cst.xbcd'
FATAL_ERROR:NgdBuild:Portability/export/Port_Main.h:159:1.6 - This application
   has discovered an exceptional condition from which it cannot recover. 
   Process will terminate. For technical support on this issue, please open a
   WebCase with this project attached at http://www.xilinx.com/support.

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

Autor: Nico .. (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schonmal versucht die Projekt-Dateien zu löschen und neu zu 
synthetiesieren?

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Nico .. (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du arbeitest doch mit ISE oder? Ich glaube im Menü "Project" gibt es den 
Punkt "clean project files"!

Bei wem hast Du VHDL, bei Prof. Liebmann?

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Nico .. (nico123)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nico ... schrieb:
> Also ist das Problem so gelöst?
Jap! Hatte es ausprobiert und es hat funktioniert!
Besten Dank!

[Close]

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
[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:
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 140. Redeclaration of symbol hundredsYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 143. Redeclaration of symbol onesDay.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 144. Redeclaration of symbol onesHour.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 145. Redeclaration of symbol onesMinute.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 146. Redeclaration of symbol onesMonth.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 147. Redeclaration of symbol onesSecond.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 148. Redeclaration of symbol onesYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 149. Redeclaration of symbol tensDay.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 150. Redeclaration of symbol tensHour.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 151. Redeclaration of symbol tensMinute.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 152. Redeclaration of symbol tensMonth.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 153. Redeclaration of symbol tensSecond.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 154. Redeclaration of symbol tensYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 155. Redeclaration of symbol thousandsYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 190. Redeclaration of symbol hundredsYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 207. Redeclaration of symbol onesDay.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 216. Redeclaration of symbol onesHour.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 225. Redeclaration of symbol onesMinute.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 234. Redeclaration of symbol onesMonth.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 243. Redeclaration of symbol onesSecond.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 252. Redeclaration of symbol onesYear.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 261. Redeclaration of symbol tensDay.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 270. Redeclaration of symbol tensHour.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 279. Redeclaration of symbol tensMinute.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 288. Redeclaration of symbol tensMonth.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 297. Redeclaration of symbol tensSecond.
ERROR:HDLParsers:1202 - "C:/Users/fabian/HSD/DCF77/DCF77.vhf" Line 306. Redeclaration of symbol tensYear.
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)
attribute highestValue of DaysReset : label is "31";
   attribute startValue of DaysReset : label is "1";
   attribute highestValue of HoursReset : label is "23";
   attribute modValue of hundredsYear : label is "1010"; --<--!!!
   attribute highestValue of Monthsreset : label is "12";
   attribute startValue of Monthsreset : label is "1";
   attribute modValue of onesDay : label is "1010";
   attribute modValue of onesHour : label is "1010";
   attribute modValue of onesMinute : label is "1010";
   attribute modValue of onesMonth : label is "1010";
   attribute modValue of onesSecond : label is "1010";
   attribute modValue of onesYear : label is "1010";
(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.
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

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Markus F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in der neuen 13.4 auch dauern komische Fehler, die 
offensichtlich auf Probleme der tool chain hindeuten.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe noch die 13.3. Aber die dürfte kaum besser sein.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lothar: Müsstest Du den Fehler nicht auch in VHDL haben?
Aber was kann ich denn generell bei solch einer Fehlermeldung tun?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"?

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> DAS möchte ich sehen !!!!!  gerade mit VHDL...
Schitteböhn, 29 Zeilen und 15 Minuten später:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity BCD_Uhr is
    Port ( clk, einhertz : in  STD_LOGIC;  -- Takt z.B. 50MHz, Clock-Enable mit 1 Hz
          s1, s10, m1, m10, h1, h10, d1, d10, mt1, mt10, y1, y10, y100, y1000  : buffer unsigned (3 downto 0) := "0000");
end BCD_Uhr;
architecture Behavioral of BCD_Uhr is
begin
  process begin 
    wait until rising_edge(clk);
    if einhertz='1' then s1 <=s1+1;
      if s1=9 then s1<="0000"; s10<=s10+1;
        if s10=5 then s10<="0000"; m1<=m1+1;
          if m1=9 then m1<="0000"; m10<=m10+1;
            if m10=5 then m10<="0000"; h1<=h1+1;
              if h1=9 then h1<="0000"; h10<=h10+1;
                if h10=5 then h10<="0000"; d1<=d1+1;
                  if d1=9 then d1<="0000"; d10<=d10+1;     -- hier wäre noch die Monats- und Schaltjahresgeschichte interessant
                    if d10=2 then d10<="0000"; mt1<=mt1+1; -- meine Monate haben jetzt mal alle 30 Tage... ;-)
                      if mt1=9 then mt1<="0000"; mt10<=mt10+1;
                        if mt10=1 and mt1=1 then mt1<="0000"; mt10<="0000"; y1<=y1+1;
                          if y1=9 then y1<="0000"; y10<=y10+1;
                            if y10=9 then y10<="0000"; y100<=y100+1;
                              if y100=9 then y100<="0000"; y1000<=y1000+1;
                                if y1000=9 then y1000<="0000";
    end if; end if; end if;  end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if;
  end process;
end Behavioral;
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?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Autor: Dose (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;)
architecture Behavioral of BCD_Uhr is
signal ldm1, ldm10 : buffer unsigned (3 downto 0) := "0000"); -- last day of month
begin
  process begin 
    wait until rising_edge(clk);
    if einhertz='1' then s1 <=s1+1;
      if s1=9 then s1<="0000"; s10<=s10+1;
        if s10=5 then s10<="0000"; m1<=m1+1;
          if m1=9 then m1<="0000"; m10<=m10+1;
            if m10=5 then m10<="0000"; h1<=h1+1;
             if h1=9 then h1<="0000"; h10<=h10+1;
              if h10=2 AND h1=3 then h10<="0000"; h1<="0000"; d1<=d1+1;
               if d1=9 then d1<="0000"; d10<=d10+1;
                if d10=ldm10 AND d1=ldm1 then d10<="0000"; d1<="0001"; m1<=m1+1; -- ldm = last day of month; declared as signal
                 if m1=9 then m1<="0000"; m10<=m10+1;
                  if m10=1 AND m1=2 then m10<="0000"; m1<="0001"; y1<=y1+1;
                   if y1=9 then y1<="0000"; y10<=y10+1;
                    if y10=9 then y10<="0000"; y100<=y100+1;
                     if y100=9 then y100<="0000"; y1000<=y1000+1;
                      if y1000=9 then y1000<="0000";
      end if; end if; end if;  end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; 
      -- define ldm1 and ldm10 (switch case of year and month)
    end if;
  end process;

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.

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...   ;-)

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Ich habe also noch etwa 71 Zeilen Platz...  ;-)
Da bleiben sogar noch ein paar über...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity BCD_Uhr is
    Port ( clk, einhertz : in  STD_LOGIC;  -- Takt z.B. 50MHz, Clock-Enable mit 1 Hz
           s_1, s_10, m_1, m_10, h_1, h_10, 
           d_1, d_10, mt_1, mt_10, y_1, y_10, y_100, y_1000 : out unsigned (3 downto 0));
end BCD_Uhr;

architecture Behavioral of BCD_Uhr is
signal s1   : unsigned (3 downto 0) := "0000";
signal s10  : unsigned (3 downto 0) := "0000";
signal m1   : unsigned (3 downto 0) := "0000";
signal m10  : unsigned (3 downto 0) := "0000";
signal h1   : unsigned (3 downto 0) := "0000";
signal h10  : unsigned (3 downto 0) := "0000";
signal d1   : unsigned (3 downto 0) := "0001";
signal d10  : unsigned (3 downto 0) := "0000";
signal mt1  : unsigned (3 downto 0) := "0001";
signal mt10 : unsigned (3 downto 0) := "0000";
signal y1   : unsigned (3 downto 0) := "0000";
signal y10  : unsigned (3 downto 0) := "0000";
signal y100 : unsigned (3 downto 0) := "1001";
signal y1k  : unsigned (3 downto 0) := "0001";

type lastdayofmonth is array (1 to 12) of unsigned (7 downto 0); 
constant ldm : lastdayofmonth := (x"31", x"28", x"31", x"30", x"31", x"30", x"31", x"31", x"30", x"31", x"30", x"31");
signal ldm1  : unsigned (3 downto 0);                             
signal ldm10 : unsigned (3 downto 0);                             
signal cly : std_logic := '0';   -- correct leapyear
begin
  s_1    <=  s1;  s_10   <=  s10; 
  m_1    <=  m1;  m_10   <=  m10; 
  h_1    <=  h1;  h_10   <=  h10; 
  d_1    <=  d1;  d_10   <=  d10; 
  mt_1   <=  mt1; mt_10  <=  mt10;
  y_1    <=  y1;  y_10   <=  y10; y_100  <=  y100;  y_1000 <=  y1k; 

  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;

  ldm10 <= ldm(to_integer(mt10*10 + mt1))(7 downto 4);
  ldm1  <= ldm(to_integer(mt10*10 + mt1))(3 downto 0) + unsigned'("000"&cly);
  
  process begin 
    wait until rising_edge(clk);
    if einhertz='1' then       s1 <=s1+1; 
    -- Sekunden
    if s1=9   then             s1 <="0000";                s10<=s10+1;       
    if s10=5  then             s10<="0000";                m1<=m1+1;         
    -- Minuten
    if m1=9   then             m1 <="0000";                m10<=m10+1;       
    if m10=5  then             m10<="0000";                h1<=h1+1;         
    -- Stunden
    if h1=9   then             h1 <="0000";                h10<=h10+1;       
    elsif h10=2 and h1=3 then  h10<="0000"; h1<="0000";    d1<=d1+1;            
    -- Tage
    if d1=9 and not(d10=ldm10 and d1=ldm1) then d1 <="0000"; d10<=d10+1;       
    elsif d10=ldm10 and d1=ldm1 then d10<="0000"; d1<="0001"; mt1<=mt1+1;       
    -- Monate
    if mt10=1 and mt1=2 then   mt10<="0000"; mt1<="0001";  y1<=y1+1;          
    elsif mt1=9  then          mt1<="0000";                mt10<=mt10+1;  
    -- Jahre
    if y1=9   then             y1  <="0000";               y10<=y10+1;       
    if y10=9  then             y10 <="0000";               y100<=y100+1;     
    if y100=9 then             y100<="0000";               y1k<=y1k+1;       
    if y1k=9  then             y1k <="0000";                                  
    end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; 

  -- und z.B. hier koennte ganz einfach das Laden der Daten aus dem DCF77 Empaenger erfolgen...

  end process;
  
end Behavioral;
90 Zeilen mit lokalen Signalen (die buffer haben mir eh' nicht so 
gefallen). Und diesmal hat der Tag auch die nötigen 24 Stunden... ;-)

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> 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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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.
Port (signal set_s1 : in unsigned(3 downto 0));
Reicht es da aus, einfach auf diese Busse zu reagieren?
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

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
 process begin 
    wait until rising_edge(clk);
    if einhertz='1' then       s1 <=s1+1; 
      -- Sekunden
      if s1=9   then             s1 <="0000";                s10<=s10+1;       
        if s10=5  then             s10<="0000";                m1<=m1+1;         
           :
              -- Stunden
              if h1=9   then             h1 <="0000";                h10<=h10+1;       
              elsif h10=2 and h1=3 then  h10<="0000"; h1<="0000";    d1<=d1+1;            
                -- Tage
                if d1=9 and not(d10=ldm10 and d1=ldm1) then d1 <="0000"; d10<=d10+1;       
                elsif d10=ldm10 and d1=ldm1 then d10<="0000"; d1<="0001"; mt1<=mt1+1;       
                  :
                          if y100=9 then             y100<="0000";               y1k<=y1k+1;       
                            if y1k=9  then             y1k <="0000";         
                            end if; 
                          end if; 
                   :
                end if; 
              end if; 
            end if; 
         :
      end if; 
    end if; 
> 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"

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity BCDclockwork is
Port ( clk, EN : in  STD_LOGIC;  -- Takt z.B. 50MHz, Clock-Enable mit 1 Hz
     s1, s10, m1, m10, h1, h10, D1, D10, MT1, MT10, Y1, Y10, Y100, Y1k : out unsigned (3 downto 0);
     setValue : in unsigned (3 downto 0);  -- 
     setValue_takeover : in unsigned (3 downto 0));
     
end BCDclockwork;

architecture Behavioral of BCDclockwork is

signal s_1, s_10, m_1, m_10, h_1, h_10, D_10, MT_10, Y_1, Y_10, Y_100 : unsigned (3 downto 0) := "0000";
signal D_1, MT_1 : unsigned (3 downto 0) := "0001";
signal Y_1k : unsigned (3 downto 0) := "0010";

type lastdayofmonth is array (1 to 12) of unsigned (7 downto 0); 
constant ldm : lastdayofmonth := (x"31", x"28", x"31", x"30", x"31", x"30", x"31", x"31", x"30", x"31", x"30", x"31");
signal ldm1 : unsigned (3 downto 0) := "0001"; -- last day of month - 1
signal ldm10: unsigned (3 downto 0) := "0011"; -- last day of month - 2
signal cly : std_logic := '0';   -- correct leapyear

begin
  s1    <= s_1;    s10  <= s_10;
  m1    <= m_1;    m10  <= m_10;
  h1    <= h_1;    h10  <= h_10;
  D1    <= D_1;    D10  <= D_10;
  MT1  <= MT_1;    MT10  <= MT_10;
  Y1    <= Y_1;    Y10  <= Y_10;    Y100  <= Y_100;  Y1k  <= Y_1k;
  
Count:  process 
variable void : unsigned(3 downto 0); -- to avoid values
begin 
    wait until rising_edge(clk);
   if setValue_takeover /= "0000" then
     case setValue_takeover is
        when "0001" => s1<=setValue;
        when "0010" => s10<=setValue;
        when "0011" => m1<=setValue;
        when "0100" => m10<=setValue;
        when "0101" => h1<=setValue;
        when "0110" => h10<=setValue;
        when "0111" => D1<=setValue;
        when "1000" => D10<=setValue;
        when "1001" => MT1<=setValue;
        when "1010" => MT10<=setValue;
        when "1011" => Y1<=setValue;
        when "1100" => Y10<=setValue;
        when "1101" => Y100<=setValue;
        when "1110" => Y1k<=setValue;
        when others => void:=setValue;
      end case;
   else
     if EN='1' then s_1 <=s_1+1;
      if s_1=9 then s_1<="0000"; s_10<=s_10+1;
        if s_10=5 then s_10<="0000"; m_1<=m_1+1;
         if m_1=9 then m_1<="0000"; m_10<=m_10+1;
          if m_10=5 then m_10<="0000"; h_1<=h_1+1;
           if h_1=9 then h_1<="0000"; h_10<=h_10+1;
            elsif h_10=2 AND h_1=3 then m_1<="0000"; m_10<="0000"; h_10<="0000"; h_1<="0000"; d_1<=d_1+1;
            if D_1=9 AND NOT (D_10=ldm10 AND D_1=ldm1) then D_1<="0000"; D_10<=D_10+1;
             elsif D_10=ldm10 AND D_1=ldm1 then D_10<="0000"; D_1<="0001"; MT_1<=MT_1+1; -- ldm = last day of month; declared as signal
              if MT_1=9 then MT_1<="0000"; MT_10<=MT_10+1;
              elsif MT_10=1 AND MT_1=2 then MT_10<="0000"; MT_1<="0001"; Y_1<=Y_1+1;
               if Y_1=9 then Y_1<="0000"; Y_10<=Y_10+1;
                if Y_10=9 then Y_10<="0000"; Y_100<=Y_100+1;
                if Y_100=9 then Y_100<="0000"; Y_1k<=Y_1k+1;
                 if Y_1k=9 then Y_1k<="0000";
      end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if; end if;
    end if;
end process Count;

process (MT_1, MT_10, Y_1, Y_10, Y_100, Y_1k) 
  begin
      cly <= '0';
      case "000"&Y_10(0)&Y_1 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 (Y_10&Y_1=x"00") then      -- alle hundert Jahre nicht korrigieren
        cly <= '0';
      end if;
      case "000"&Y_1k(0)&Y_100 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 (MT_10&MT_1 /= x"02") then -- und überhaupt nur den Februar korrigieren
        cly <= '0';
      end if;
  end process;

  ldm10 <= ldm(to_integer(MT_10*10 + MT_1))(7 downto 4);
  ldm1  <= ldm(to_integer(MT_10*10 + MT_1))(3 downto 0) + unsigned'("000"&cly);
  
end Behavioral;

Frage 1) Warum kann man in der Architecture multiplexen mittels
with 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;

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?
+ 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

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Lattice User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Lattice User (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian H. (Firma: Technische Universität Berlin) (brein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
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';
        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;
      end if;
      if (mt10&mt1 /= x"02") then -- und überhaupt nur den Februar korrigieren
        cly <= '0';
      end if;
  end process;

Hatten eine ganze weile grübeln müssen um den Fehler zu finden. ;)

Gruß
Fabian

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.