bko schrieb:> Welchen Wert hat "COUNTER" in deiner Simulation?> Ich meine da fehlt entweder ein Reset oder ein init-wert.
Du meinst richtig. Denn "UUUU"+1 ergibt "UUUU".
Pit schrieb:> COUNTER <= STD_LOGIC_VECTOR(unsigned(COUNTER) + 1);
Nimm zum zählen doch besser einen integer, dann wird das viel
übersichtlicher und du kannst auf "normale Zahlen" vergleichen. Oder
mach ihn wenigstens unsigned, wenn du den (impliziten) Überlauf nach
16 Takten brauchst. Dann steht da:
> Hier der Code:
Nimm zum Posten von VHDL-Code besser [vhdl] statt [pre]
Und: schreib Signalnamen klein, evtl. mit einem großen
Anfangsbuchstaben, DENN SONST BEKOMMST DU BALD DIE KRÄTZE ANS AUGE, UND
DU MUSST JEDES WORT ZWEIMAL LESEN, WEIL DAS GEHIRN DIESE DAUERNDE
GROSSSCHREIBEREI NICHT GEWÖHNT IST.
Erstmal Danke für die Tipps. Ich probiere das auch gleich mal alles aus.
Aber irgendwie werd ich das Gefühl nicht los, daß ich ein ganz anderes
Problem habe.
Folgendes ist Zweck der Übung:
Gegeben sind vier Pins, die als inout definiert sind. Innerhalb der
StateMAchine soll genau einmal von diesen Pins gelesen werden. Der
gelesene Wert soll gespeichert werden und dann innerhalb der
StateMAchine im weiteren Verlauf als Konstante verwendet werden.
Nachdem dieser Wert (die Konstante) gelesen wurde, schalten alle Pins
auf Ausgang, d.h. ab sofort werden über die Pins nur noch Werte
ausgegeben.
Mein Problem ist, egal was ich mache, entweder lese ich nur 'UUUU' von
den Pins oder die gewünschte Konstante wechselt den Wert, sobald ich
Anfange Werte über die Pins auszugeben.
Mein prinzipielles Vorgehen:
-STEP0 (Konstante einlesen):
INOUT <= "ZZZZ"
KONSTANTE <= INOUT
-STEP1 (Konstante verwenden):
if KONSTANTE = "1010" then
INOUT <= "1111"
else
INOUT <= "0000"
end if
Naja, wie gesagt da kommt nur Käse dabei raus.
Hey,
nur so am Rande, solltest du nicht VOR dem Auslesen der inouts diese auf
'Z' setzen? (mind. 1 takt vorher?) Wenn mich nicht alles täuscht
passiert das bei dir alles beim selben Takt, bzw beim READ_DATA'event
... Ich bin selber nicht so vertraut damit, ich simuliere es mal eben
Hmm, scheint auch so zu gehen. Kann mir jemand in einem Satz erklären
warum?
Bleiben wir aber beim Thema, also bei mir funktioniert es (es tut
zumindest etwas, ob es das Richtige ist... naja), sofern ich dem counter
nen Startwert gebe und in der Testbench mit 'H' und 'L' arbeite,
anstelle von '0' und '1'. Ich meine H/L bedeuten soviel wie externe
PullUps / Pulldowns, kollidiert also nicht mit einem entgegengesetztem
internen Zusatnd (wenn inout nicht als Eingang arbeitet). Glaube so war
das, oder?
Pit schrieb:> Mein Problem ist, egal was ich mache, entweder lese ich nur 'UUUU' von> den Pins oder die gewünschte Konstante wechselt den Wert, sobald ich> Anfange Werte über die Pins auszugeben.
Mein Glückwunsch, du hast die Latency entdeckt.
Das hier
READ_DATA <= '1';
MAX_COUNT <= DATA_IN;
bedeutet in der Hardware:
Genau mit dem oder gar wegen dem nächsten Takt wird MAX_COUNT
eingelesen, und ein paar ps später (Signallaufzeit bis zum
Ausgangstreiber) wird der Eingang hochohmig geschaltet.
Pit schrieb:> DATA_OUT nicht zugewiesen?
Läuft dein Zähler?
Wird der irgendwann mal "0000"?
Pit schrieb:> Mein Problem ist, egal was ich mache, entweder lese ich nur 'UUUU' von> den Pins oder die gewünschte Konstante wechselt den Wert, sobald ich> Anfange Werte über die Pins auszugeben.
Screenshot möglich?
Die gute Nachricht vorab: Es macht was ich will.
>Welchen Wert hat "COUNTER" in deiner Simulation?
und
>Du meinst richtig. Denn "UUUU"+1 ergibt "UUUU".
Ich dacht, es ist egal, ob ich da was initialisiere oder nicht, da ich
den Wert erst nach der ersten Zuweisung verwende. Falsch gedacht.
>und in der Testbench mit 'H' und 'L' arbeite
Das hilft, da ich nach dem Einlesen nur noch den Ausgangstreiber habe.
Änderung in der Testbench von
1
DATA_INOUT <="1001" after 100 ns;
auf
1
DATA_INOUT <="1001" after 100 ns, "HHHH" after 200 ns;
Fragen bleiben trotzdem. So wie im folgenden habe ich es jetzt und so
funktioniert es.
1
process (CLK,...)
2
if enable = '1' then
3
if busy = '0' then
4
if my_constant = 0 then
5
my_constant <= to_integer(unsigned(data_in));
6
end if;
7
8
busy <= '1';
9
data_read = '0';
10
11
else --busy
12
--StateMAchine mit verschiedenen data_out -Zuweisungen unter Verwendung von my_constant
13
...
14
end if; --busy
15
else --enable
16
my_constant = 0;
17
data_read = '1';
18
19
end if; --enable
20
end process;
21
22
data_in <= data_inout;
23
24
process(data_read, data_out, data_inout)
25
begin
26
if data_read = '1' then
27
data_inout <= ( others => 'Z' );
28
else
29
data_inout <= data_out;
30
end if;
31
end process;
Fragen bleiben trotzdem:
1. Wenn ich die Prüfung auf 'my_constant = 0' vor der Zuweisung von
my_constant weglasse, dann erhalte ich wieder nur Käse für my_constant.
Warum? Etwa deshalb, weil my_constant fest verdrahtet mit data_in ist?
Also nicht so wie beim Programmieren, wo nur bei der Zuweisung der Wert
geändert wird? Ich frage deshalb, weil der Zuweisungspfad ja in jedem
Fall nur einmal durchlaufen wird.
2. Wenn ich den zweiten Prozess wie folgt ändere, funktioniert das Ganze
auch (die Zeile 'data_in <= data_inout;' ist jetzt innerhalb des
Prozesses).
1
process(data_read, data_out, data_inout)
2
begin
3
if data_read = '1' then
4
data_inout <= ( others => 'Z' );
5
data_in <= data_inout;
6
else
7
data_inout <= data_out;
8
end if;
9
end process;
Aber ich erhalte eine Warnung von wegen Latch und so und man sollte das
vermeiden. Wie relevant ist diese Warnung und was hat das zu bedeuten?
Und natürlich Danke für Eure Hilfe!