Hallo zusammen, hab von Lattice VHDL-Code für ein SPI-Modul genommen und an einigen Stellen für meine Anwendung angepasst. Beim Simulieren entsteht an einer Stelle ein Verhalten, dass ich nicht verstehe. Ich habe nur sehr wenig Erfahrung in VHDL-Programmierung. Vielleicht sieht jemand von euch sofort, was falsch ist und kann mir einen Hinweis geben. Im angehängten Code in der Zeile 457 wird bei der Bedungung elsif((tx_flag1 = '1') and (n_status = ST_TURNAROUND)) then das Signal tx_flag1 zurückgesetzt. In der Simulation tritt das Rücksetzen aber nicht ein, obwohl man an dem Signalverlauf (siehe Bild)klar sieht, dass die Bedingung eintritt. Kurz vor der positiven Taktflanke (wo der rote Cursor steht) ist Signal tx_flag1 = 1 und n_status = 4 (4 entspricht ST_TURNAROUND, wie aus dem Code ersichtlich). Ich würde also erwarten, dass mit der nächsten steig. Flanke nach Cursor das Signal tx_flag1 auf '0' geht, was aber nicht passiert! Wo ist der Grund für so ein Verhalten? Ich simuliere mit Active-HDL 8.2. Wäre für Hinweise dankbar!
uuups! Entschuldinung! Habe in den falschen Bereich gepostet! Gehört natürlich in "FPGA, VHDL & Co."
noips schrieb: > Im angehängten Code in der Zeile 457 wird bei der Bedungung > elsif((tx_flag1 = '1') and (n_status = ST_TURNAROUND)) then > das Signal tx_flag1 zurückgesetzt. > In der Simulation tritt das Rücksetzen aber nicht ein... Klar, weil das Ganze ja so aussieht:
1 | if(( c_status = ST_TRANS ) and (tx_flag1 = '0') and ( clock_cnt = CLOCK_SEL )) then |
2 | tx_flag1 <= '1'; |
3 | elsif((c_status = ST_TRANS) and (tx_flag1 = '1') and (clock_cnt = CLOCK_SEL)) then |
4 | SCLK_MASTER_xhdl8 <= not SCLK_MASTER_xhdl8; |
5 | elsif((tx_flag1 = '1') and (n_status = ST_TURNAROUND)) then |
6 | tx_flag1 <= '0'; |
7 | end if; |
Evtl. ist hier ja gerade clock_cnt = CLOCK_SEL dann kommt er gar nicht bis zu diesem elsif... :-o
> Evtl. ist hier ja gerade clock_cnt = CLOCK_SEL
Ja, clock_cnt ist in meinem Fall immer gleich CLOCK_SEL, weil ich
CLOCK_SEL auf 0 gesetzt habe, und clock_cnt zählnt nur hoch wenn
CLOCK_SEL größer ist als 0.
Aber ich verstehe es trotzdem nicht. Wenn er zum dem letzten elsif nicht
kommt, muss ja eine der Bedingungen in den weiter oben liegenden
Abfragen zutreffen. Und die oberen Abfragen setzen ja c_status =
ST_TRANS (ST_TRANS entspricht 3) voraus, wegen der UND-Verknüpfung in
der Abfrage. c_status ist hier aber nicht 3 sondern 4, also
ST_TURNAROUND. Somit kann keiner der oberen Zweige ausgeführt werden.
Oder verstehe ich etwas falsch??
noips schrieb: > c_status ist hier aber nicht 3 sondern 4, also ST_TURNAROUND. An der roten Linie ist c_status = 3, und damit würde ich sagen: er nimmt (bei rot) die mittlere Zeile und ändert das tx_flag1 nicht. Und jetzt kommts: bei der nächsten steigenden Taktflanke ist n_status schon weiter auf 5... :-o
oh, klar doch!!! ich bin irgend wie auf n_status fixiert, aber in denn ersten beiden Abfragen steht ja c_status. Hm, so was Dummes von mir! Vielen Dank!!!
noips schrieb: > ich bin irgend wie auf n_status fixiert, > aber in denn ersten beiden Abfragen steht ja c_status. Unter anderem deshalb nehme ich lieber die 1 Prozess Schreibweise... ;-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.