Forum: Mikrocontroller und Digitale Elektronik unklares Signalverhalten eines SPI-Moduls


von noips (Gast)


Angehängte Dateien:

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!

von noips (Gast)


Lesenswert?

uuups! Entschuldinung! Habe in den falschen Bereich gepostet! Gehört 
natürlich in "FPGA, VHDL & Co."

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von noips (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von noips (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.