>> Q <= (others => '0');
Umgkehrt gefragt, was für Nachteile hat es wenn man es so macht ?
Q <= "00000";
Ganz einfach, änderst du dir Deklaration von Q, sprich der Vektor hat
später mal mehr oder weniger Bits, dann musst du die zweite Zuweisung
jedesmal mit ändern, das kann nerven. Bei der ersten Deklaration werden
einfach alle Bits des Vektore auf '0' gesetzt, automatisch zur
aktuellen Breite des Vektors.
>> Was bringt es denn für einen Vorteil, wenn der Reset asynchron ist
?
Das sofort und solange der Reset aktiv ist intern sich nichts rühren
kann. Schau mal wenn Reset == '1' ist dann wird der komplette elsif
Teil mit der Clock garnicht mehr ausgeführt. Das hat noch einen
weiteren ganz wichtigen Vorteil: du der nachfolgende Clock Code wird
vereinfacht und kann durch den Fitter nun sehr einfach in getaktete
FF's umgesetzt werden, denn Clock ist der Takteingang für den Zähler
und Reset ist der asynchrone Reset des gleichen Zählers. So wie du es
gemacht hast benötigt der Fitter zusätzliche Logik, da der ansychrone
Reset der FF's eben nun synchron zur Clock ist. Das benötigt
mindestens ein AND zusätzlich.
>> Warum steht die zuweisung: CLK_Out <= CLK_Temp; außerhalb des
prozesses ?
Damit sie asynchron wird und so eventuell Makrozellen einspart. Also
für CLK_Temp benötigst du schon ein FF das den Status speichert. Jeden
Ausgangspin den du nun nur innerhalb eines synchronen Clock Prozesses
anspricht hat "zeitlich" eine Lücke in der die Daten gehalten werden
müssen, man benötig im ungünstigsten Falle also einen Buffer->ergo ein
FF zusätzlich. Das ist aber garnicht nötig da ja CLK_Temp schon den
Inhalt für den CLK_Out Ausgang enthält. Mit der externen asynchronen
Zuweisungist sichergestellt das CLK_Out immer zu jedem Zeitpunkt mit
CLK_Temp verknüpft ist.
Schwierig zu erklären, bin selber noch Anfänger.
Gruß Hagen