Forum: FPGA, VHDL & Co. Jitter in Signal einfügen


von herman2000 (Gast)


Angehängte Dateien:

Lesenswert?

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

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


Lesenswert?

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.

von herman2000 (Gast)


Lesenswert?

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.

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


Lesenswert?

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?

von herman2000 (Gast)


Lesenswert?

ja genau 26 Bytes.

Wie würdest du bei der Realisierung vorgehen? Ich bin in Sachen VHDL 
noch ziemlich am Anfang.

Danke!

von herman2000 (Gast)


Lesenswert?

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;

von ??? (Gast)


Lesenswert?

herman2000 schrieb:
> after 1000 ms;
Lässt sich das in Hardware abbilden?

von Christian R. (supachris)


Lesenswert?

??? schrieb:
>> after 1000 ms;
> Lässt sich das in Hardware abbilden?

Natürlich nicht!

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


Lesenswert?

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.

von herman2000 (Gast)


Lesenswert?

Ok, vielen Dank!

von Mr Hale (Gast)


Lesenswert?

einen richtigen Jitter wird man damit nicht hinbekommen - da zu 
"digital", denke ich.

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


Lesenswert?

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

von herman2000 (Gast)


Lesenswert?

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;

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


Lesenswert?

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

von herman2000 (Gast)


Lesenswert?

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!

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


Lesenswert?

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

von herman2000 (Gast)


Lesenswert?

Super, vielen Dank!

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


Angehängte Dateien:

Lesenswert?

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

von herman2000 (Gast)


Lesenswert?

Genial, vielen vielen Dank!!

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.