Hallo Leute, es klappt nicht so wie es soll, weiß aber nicht wo mein Fehler leigt. Bei der Simulation bekomme ich kein zusammengesetztes data heraus, sondern nur Xse.. Kann da einer mal bitte rüberschauen?
was machen denn deine Zähler in der Simulation (scale, index)? Bleiben die auf dem Init-Wert, zählen sie hoch oder stehen sie auf X? Erreicht index irgendwann den Wert 10, damit data_sn nach data übernommen wird? (könnte schwierig werden, weil index als integer im Bereich 0..9 deklariert ist).
In der zeile: if (scale = "101000101100") ist der Bitvector zu kurz (12 bits statt 13 (12 downto 0)). Deshalb ist der vergleich nie true. MfG,
Achim S. schrieb: > was machen denn deine Zähler in der Simulation (scale, index)? Bleiben > die auf dem Init-Wert, zählen sie hoch oder stehen sie auf X? > > Erreicht index irgendwann den Wert 10, damit data_sn nach data > übernommen wird? (könnte schwierig werden, weil index als integer im > Bereich 0..9 deklariert ist). Du hast recht, Index muss natürlich bis 10 gehen, sonst kommt der eine else-Pfad gar nicht zustande! Die Skala und der Index laufen auch, ich glaube, ich habe in der Testbench falsche Zeiten benutzt, habe das schonmal ein bischen geändert und werde es hoffentlich bald ganz gelöst haben, ich melde mich nochmal :) Fpga Kuechle schrieb: > In der zeile: > if (scale = "101000101100") > > ist der Bitvector zu kurz (12 bits statt 13 (12 downto 0)). > Deshalb ist der vergleich nie true. > > MfG, Vielen Dank für den Hinweis!
Ich hätte da zwei Anmerkungen: 1. Rx_line sollte dringend einsynchronisiert werden 2. warum schreibst du den scale-Vergleich nicht als integer-vergleich?
1 | If scale = 2604 then |
Daniel__m schrieb: > Ich hätte da zwei Anmerkungen: > 1. Rx_line sollte dringend einsynchronisiert werden > 2. warum schreibst du den scale-Vergleich nicht als integer-vergleich? >
1 | > If scale = 2604 then |
2 | >
|
Habs einsynchronisiert und zu Integer geändert. Das mit dem unsigned benutzen ist Angewohnheit, weil wir das in einem Uni-Einführungskurs immer so gemacht hatten, aber integer scheint "sauberer" bzw einfacher zu sein. Und der Mensch sieht was gemeint ist, danke für den Hinweis!
Achim S. schrieb: > Erreicht index irgendwann den Wert 10, damit data_sn nach data > übernommen wird? (könnte schwierig werden, weil index als integer im > Bereich 0..9 deklariert ist). Achne das stimmt doch so wie ich das hatte. Die if Bedingung
1 | if (index < 9) then |
2 | index <= index + 1; -- index erhöhen |
ist erfüllt bis index 9 ist, dann wird in den else Pfad gesprungen und data übernimmt das data_sn:
1 | else
|
2 | if (data_sn(0) = '0' and data_sn(9) = '1') then -- wenn Start- und Stopbit richtig erkannt |
3 | data <= data_sn(8 downto 1); |
Achim S. schrieb: > Erreicht index irgendwann den Wert 10, damit data_sn nach data > übernommen wird? (könnte schwierig werden, weil index als integer im > Bereich 0..9 deklariert ist). Achne das stimmt doch so wie ich das hatte. Die if Bedingung
1 | if (index < 9) then |
2 | index <= index + 1; -- index erhöhen |
ist erfüllt bis index 9 ist, dann wird in den else Pfad gesprungen und data übernimmt das data_sn:
1 | else
|
2 | if (data_sn(0) = '0' and data_sn(9) = '1') then -- wenn Start- und Stopbit richtig erkannt |
3 | data <= data_sn(8 downto 1); |
Also ich habe jetzt nochmal meinen verbesserten Code rangehängt. Scale und Index laufen wie geplant, nur wenn dann Index 9 ist und die Bedingung mit Start- und Stoppbit geprüft wird, dann setzt der Simulator data auf "00000000", obwohl er eigentlich die 8 bits von data_sn übernehmen sollte...
Felix O. schrieb: > Achne das stimmt doch so wie ich das hatte. Die if Bedingungif (index < > 9) then > index <= index + 1; -- index erhöhen > > ist erfüllt bis index 9 ist, dann wird in den else Pfad gesprungen und > data übernimmt das data_sn:else > if (data_sn(0) = '0' and data_sn(9) = '1') then -- wenn > Start- und Stopbit richtig erkannt > data <= data_sn(8 downto 1); Im ursprünglichen Code hattest du den Vergleich auf index<10, was sich mit dem Wertebereich von Index gebissen hat. Mit dem neuen Code (Vergleich auf index<9) funktioniert zwar der Einsprung in den else-Zweig, aber jetzt wir die Zuweisung data_sn(9) <= rx_line_syn; nicht wirksam. Denn data_sn ist ein Signal, keine Variable. Die Zuweisung würde erst im nächsten Takt wirksam, du versuchst aber data_sn(9) schon in diesem Takt abzufragen. Also: entweder index wieder bis 10 zählen (und den Wertebereich entsprechend erweitern). Oder die bessere Lösung: Index wie im neuen Code gezeigt bis 9 zählen lassen, im else-Zweig das Stopbit aber nicht über data_sn(9)='1' abfragen sonder über rx_line_syn='1'
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.