Formatieren wir das mal erst schön, und machen Nummern dazu:
1 | Lesen_Pro:
|
2 | process (IFCLK, Zustand) begin
|
3 | if Zustand = warten then -- (1)
|
4 | iCounter2 <= 0;
|
5 | elsif IFCLK='1' and IFCLK'event then -- (2)
|
6 | if Zustand = lesen then
|
7 | RX_BUFFER(RX_COUNTER)<=DATA_BUS;
|
8 | iCounter2 <=RX_COUNTER+1;
|
9 | end if;
|
10 | else -- (3)
|
11 | iCounter2 <=RX_COUNTER;
|
12 | end if;
|
13 |
|
14 | RX_COUNTER <= iCounter2; -- (4)
|
15 | end process Lesen_Pro;
|
(1) Naja, das kann arg ins Auge gehen: ein Asynchroner Reset...
(2) Jetzt kommt der getaktete Teil des Prozesses. Der Name IFCLK deutet
darauf hin, dass du in anderen Teilen deines Designs nohc andere Takte
hast. Da wirst du später noch lustige Effekte erleben...
(3) Jetzt wirds krass: Wenn keine steigende Taktflanke da ist soll
dieser Teil ausgeführt werden. Weil aber per Definition die Dauer einer
Taktflanke = 0 ist, sollte dieser Teil an und für sich immer ausgeführt
werden. Das kann so niemals gehen, so eine Beschreibung wirst du
nirgends finden.
(4) Und zum guten Schluss wird zum Ende des Prozesses dem RX_COUNTER ein
Wert zugewiesen. Weil ein Prozess laut VHDL-Definition in
Nullkommanichts (Durchlaufzeit = 0) von oben her abgearbeitet wird, gilt
zum Schluss nur diese Zuweisung.
Zur Bewertung:
(1) ist sehr schlechter Designstil.
(2) kann man so machen, wenn das der einzige Takt ist, oder andere
Taktdomänen einsynchronisiert werden.
(3) kann in einem FPGA nicht implementiert werden.
(4) macht alles Vorhergehende unnötig.
So, fertig gemacht :-/
Jetzt wieder Aufbauarbeit. Wie wärs damit:
1 | process (IFCLK) begin
|
2 | if rising_edge(IFCLK) then
|
3 | if (Zustand = warten) then
|
4 | RX_COUNTER <= 0;
|
5 | elsif (Zustand = lesen) then
|
6 | RX_BUFFER(RX_COUNTER) <= DATA_BUS;
|
7 | RX_COUNTER <= RX_COUNTER+1;
|
8 | else -- eigentlich unnötig
|
9 | RX_COUNTER <= RX_COUNTER; -- dito
|
10 | end if;
|
11 | end if;
|
12 | end process;
|
Mein Tipp:
Du solltest echt mal ein gutes Buch zum Thema lesen.