unklares Signalverhalten eines SPI-Moduls

Gast #1955081
Lesenswert?

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!
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1955099
Lesenswert?

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
Gast #1955123
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren