Hallo, ich muss für Diagnosezwecke einen Jitter in ein Signal einbauen. Ich habe ein Digitales Signal im 30/60kHz Bereich, wo ich positiven und negativen Jitter einbauen muss. Positiver Jitte heisst, dass der Flankenwechsel in die positive Richtung (bei mir 33µs) verschoben werden muss. Negativer Jitte heisst, dass der Flankenwechsel in die negative Richtung (bei mir 33µs) verschoben werden muss. Da negativ ja nicht geht, ist meine Idee, die pos. um 66µs in die pos. Richtung zu verschieben und die neg. so zu belassen. Die pos. und neg. Jitter sollen beliebieg in das Signal eingebaut werden können. Z.B. über ein Register, wo eine 1 pos. bedeutet und eine 0 neg. Jitter bedeutet. Hat jemand eine Idee wie ich das angehen kann? Danke!!
herman2000 schrieb: > Ich habe ein Digitales Signal im 30/60kHz Bereich, wo ich positiven und > negativen Jitter einbauen muss. Die Periodendauer kann also im Mittel nicht verändert werden. Auf 3 neg. Jitter müssen also garantiert auch 3 pos. Jitter kommen! herman2000 schrieb: > Da negativ ja nicht geht, ist meine Idee, die pos. um 66µs in die pos. > Richtung zu verschieben und die neg. so zu belassen. Richtig. Du mußt also jede Signalflanke um 0, 33 oder 66 us verzögern. Das ist nicht allzu kompliziert... Oder andersrum: das Signal wird immer um 33us verzögert, das wäre dann "kein Jitter". Und jetzt kannst du noch wählen: Signal nicht verzögert = neg. Jitter Signal um weitere 33us verzögert = pos. Jitter herman2000 schrieb: > Z.B. über ein Register, wo eine 1 pos. bedeutet und > eine 0 neg. Jitter bedeutet. Wie das? Du hast doch selber definiert, dass es einen neg. Jitter nicht geben kann! > Z.B. über ein Register, wo eine 1 pos. bedeutet und > eine 0 neg. Jitter bedeutet. Unnötig, denn es ist ja schon klar, dass auf der Mittelwert der Jitter 0 sein muß. Denn sonst würdest du die Freuquenz des Signals ändern.
Vielen Dank für die Antwort! herman2000 schrieb: >> Ich habe ein Digitales Signal im 30/60kHz Bereich, wo ich positiven und >> negativen Jitter einbauen muss. >Die Periodendauer kann also im Mittel nicht verändert werden. >Auf 3 neg. Jitter müssen also garantiert auch 3 pos. Jitter kommen! Das war nur ein Beispiel, es gibt auch das Szenarium, das in 26 Octets lediglich 2 beliebige Flanken mit einem Jitter versehen werden. Es soll die Stabilität des Empfängers geprüft werden. Es handelt sich um ein Manchester codiertes Signal. herman2000 schrieb: >> Da negativ ja nicht geht, ist meine Idee, die pos. um 66µs in die pos. >> Richtung zu verschieben und die neg. so zu belassen. >Richtig. Du mußt also jede Signalflanke um 0, 33 oder 66 us verzögern. >Das ist nicht allzu kompliziert... >Oder andersrum: das Signal wird immer um 33us verzögert, das wäre dann >"kein Jitter". Und jetzt kannst du noch wählen: >Signal nicht verzögert = neg. Jitter >Signal um weitere 33us verzögert = pos. Jitter herman2000 schrieb: >> Z.B. über ein Register, wo eine 1 pos. bedeutet und >> eine 0 neg. Jitter bedeutet. >Wie das? Du hast doch selber definiert, dass es einen neg. Jitter nicht >geben kann! Das Register deshalb, weil eben an beliebigen Stellen ein Jitter hinzugefügt werden soll. WIe z.B. lediglich 5 Flanken eines ganzen Frames. >> Z.B. über ein Register, wo eine 1 pos. bedeutet und >> eine 0 neg. Jitter bedeutet. >Unnötig, denn es ist ja schon klar, dass auf der Mittelwert der Jitter 0 >sein muß. Denn sonst würdest du die Freuquenz des Signals ändern. Da es die Qualität der Empfängers testen soll, muss es individuell einstellbar sein, welche Flanken einen Jitter haben sollen und welche nicht. Evtl. ein Register für jede Flanke, wie z.B. eine 00 soll kein Jitter sein, eine 01 einen neg. Jitter und eine 10 der pos. Jitter. Da es sich um ein Manchester codiertes Signal handelt, muss die Jitterverteilung im Mittel nicht gleich sein.
herman2000 schrieb: > Da es sich um ein Manchester codiertes Signal handelt, muss die > Jitterverteilung im Mittel nicht gleich sein. Da es laut deiner Beschreibung ein Signal ist, das von einer externen Hardware kommt, müssen die Jitter zwangsläufig gleich verteilt sein, denn sonst müsstest du irgendwann in die Zukunft sehen können (=Jitter immmer verfrüht/negativ), oder einen großen Zwischenspeicher haben (=Jitter immer verspätet/positiv)... herman2000 schrieb: > 26 Octets = 26 Bytes?
ja genau 26 Bytes. Wie würdest du bei der Realisierung vorgehen? Ich bin in Sachen VHDL noch ziemlich am Anfang. Danke!
Mein erster Ansatz wäre:
1 | entity test is |
2 | Port ( IN_1 : in STD_LOGIC; |
3 | OUT_1 : out STD_LOGIC); |
4 | end test; |
5 | |
6 | architecture Behavioral of test is |
7 | |
8 | |
9 | begin
|
10 | P1:process (IN_1) |
11 | begin
|
12 | if (IN_1'event and IN_1 = '0') then |
13 | OUT_1 <= '1' after 1000 ms; |
14 | else
|
15 | OUT_1 <= '0' after 1000 ms; |
16 | end if; |
17 | end process; |
18 | |
19 | end Behavioral; |
herman2000 schrieb: > Mein erster Ansatz wäre:entity test is > OUT_1 <= '1' after 1000 ms; LOL, das ist jedermanns erster Ansatz für eine Verzögerung in VHDL... :-D Aber das geht nicht. In CPLDs/FPGAs gibt es nur Logik und Flipflops. Aber keine einstellbaren Verzögerungsglieder (ich schreibe ausdrücklich IN FPGAs, nichi aussen, in den IO-Zellen, wo solche Spezialitäten schon aml eingebaut sien können). Und desahlb muß jede Verzögerung über Speicherglieder und irgendwelche Fifos/Schieberegister realisiert werden. Dazu braucht es einen Takt (z.B. 50MHz), der die maximale Auflösung bestimmt und von sich aus einen Jitter (hier 1/50MHz = +-10ns) mitbringt... Zeichne mal eine Schaltung mit Logikgattern und Flipflops auf, die das machen würde, was du willst. Das ist die Denkweise die du für die Hardwarebeschreibung unbedingt brauchst.
einen richtigen Jitter wird man damit nicht hinbekommen - da zu "digital", denke ich.
Mr Hale schrieb: > einen richtigen Jitter wird man damit nicht hinbekommen - da zu > "digital", denke ich. Wenn man da die 33us z.B. mit 33ns (=33MHz) auflöst, kann man schon mal eine Granularität von 1 Promille erreichen, das dürfte idR. reichen...
Der FPGA wird mit 25MHz getaktet. Oh sorry, ich meinte 3.3µs. Das wird mal der erste Versuch sein, den ich ausprobiere:
1 | entity test is |
2 | Port ( IN_1 : in STD_LOGIC; |
3 | clk25MHz : in STD_LOGIC; |
4 | OUT_1 : out STD_LOGIC); |
5 | end test; |
6 | architecture Behavioral of test is |
7 | |
8 | constant DELAY : positive := 80; -- fix x Takte Delay |
9 | signal delay_line : std_logic_vector(DELAY-1 downto 0); |
10 | |
11 | |
12 | begin
|
13 | |
14 | process(clk25MHz) |
15 | begin
|
16 | if rising_edge(clk25MHz) then |
17 | delay_line <= delay_line(DELAY-2 downto 0) & IN_1; |
18 | end if; |
19 | end process; |
20 | |
21 | OUT_1 <= delay_line(DELAY-1); |
22 | |
23 | end Behavioral; |
Das ist ein Schieberegister mit einem 80er Mux dahinter. So hast du jetzt mal eine Verzögerung geschafft. Wenn du jetzt allerdings den Tap/Abgriff umschaltest, kann es sein, dass du Spikes bekommst, wenn du schlagartig von einer kurzen auf eine höhere Verzögerung umschaltest. Z.B. wenn du im Schieberegister das hast: delay_line 79 78 77 76 75 74 73 ........ 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 ... 0 0 0 1 1 1 1 1 1 Und du dann den Tap von 0 auf 75 umschaltest, dann wirst du nach einem 5 Takte dauernden '1' wieder 70 Takte '0' bekommen, und dann erst wieder das '1' von "vorher"...
Oh, das ist natürlich eine verfälschung des Signals und wird nicht mehr funktionieren.. Wüsstest du eine Lösung, wo ich das vermeiden kann? Vielen Dank!
herman2000 schrieb: > Wüsstest du eine Lösung, wo ich das vermeiden kann? Du musst einen (bzw. natürlich jeden) Flankenwechsel erkennen und unterschiedlich lang verzögern... 60kHz sind 16,6us, da kann in der maximalen Jitterzeit (+-3,2us) also jewils nur 1 Flanke auftreten. Deshalb sollte 1 Zähler ausreichen, der dann bei Ablauf einfach den Ausgang umschaltet. In der ausgefuchsteren Version würde ich, um falsche Pegel zu verhindern, den derzeit anliegenden Pegel an den Ausgang durchschalten. Oder mit 2 Zählern arbeiten, von denen einer die steigende und der andere die fallende Flanke bearbeitet. Wenn ich mir das so überlege, scheint mir die 2 Zähler-Methode am durchschaubarsten... ;-)
Ich hätte da mal was mit einem Zähler... ;-) Der Zufallswert kommt aus einem LFSR wie dort: http://www.lothar-miller.de/s9y/categories/38-LFSR Ich habe aus Gründen der Einfachheit mal nur einen 6-Bit Wert (1..63) genommen und muß deshalb für den Endwert 79-63+Zufallswert rechnen. Natürlich hätte ich auch einfach die Zähler nur bis 63 laufen lassen können...
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.