Forum: FPGA, VHDL & Co. UART - Rx und Testbench


von Felix O. (felixanius)


Angehängte Dateien:

Lesenswert?

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?

von Achim S. (Gast)


Lesenswert?

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).

von Fpgakuechle K. (Gast)


Lesenswert?

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,

von Felix O. (felixanius)


Lesenswert?

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!

von Daniel__m (Gast)


Lesenswert?

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

von Felix O. (felixanius)


Lesenswert?

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!

von Felix O. (felixanius)


Angehängte Dateien:

Lesenswert?

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);

von Felix O. (felixanius)


Angehängte Dateien:

Lesenswert?

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

von Achim S. (Gast)


Lesenswert?

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'

von Felix O. (felixanius)


Lesenswert?

Ahhhh, na endlich funktionierts, vielen Dank Achim!

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.