www.mikrocontroller.net

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


Autor: noips (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: noips (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
          if(( c_status = ST_TRANS ) and (tx_flag1 = '0') and ( clock_cnt = CLOCK_SEL )) then
              tx_flag1 <= '1';
          elsif((c_status = ST_TRANS) and (tx_flag1 = '1') and (clock_cnt = CLOCK_SEL)) then
              SCLK_MASTER_xhdl8 <= not SCLK_MASTER_xhdl8;
          elsif((tx_flag1 = '1') and (n_status = ST_TURNAROUND)) then
              tx_flag1 <= '0';
          end if;
Evtl. ist hier ja gerade   clock_cnt = CLOCK_SEL
dann kommt er gar nicht bis zu diesem elsif...    :-o

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.