Forum: FPGA, VHDL & Co. Frage zu LFSR


von Cihan K. (lazoboy61)


Lesenswert?

Hallo,

ich will eine LFSR programmieren, um einen DDR2 RAM (2GB) mit 
Zufallszahlen zu füllen. Dabei soll sowohl beim Füllen bzw. Erzeugen der 
Zufallszahlen ein CRC berechnet werden, der dann, nachdem der RAM 
vollgeschrieben war, mit dem CRC des vom RAM wieder ausgelesenen 
verglichen werden.

Ziel dabei ist es festzustellen, ob auf meinem Custom Board die 
Anbindung zum DDR2 Speicher sauber funktioniert. Da habe ich mir ebend 
dann vorgestellt, dass ich Zufallszahlen reinschreibe, beim Schreiben 
ebend den CRC berechne, dann wieder auslese und den CRC berechne und 
vergleiche ob die CRC´s übereinstimmen. Mir ist klar, dass wenn ein 
Fehler auftretet, dass ich den Fehler nicht über den CRC-Vergleich 
rausbekomme, aber zumindest weiss ich dann, dass ich ins Detail rein 
muss, um den Fehler zu finden. Wenn ich dann ebend den RAM 100 mal 
vollgeschrieben habe und 100 mal ausgelesen habe, dabei immer den 
CRC-Vergleich gemacht habe, kann ich ja feststellen wie oft der CRC 
nicht stimmt. Soviel zum Ziel.

Vorgehensweise:
Habe einen DDR2 Speicher mit dem Virtex 5 angesteuert, d.h. die Schreib- 
und Leseroutinen funktionieren. Jetzt will ich eine LFSR programmieren 
und habe mir dabei den Link von Lothar angeguckt:
http://www.lothar-miller.de/s9y/categories/38-LFSR

Dort sieht man z.B. für eine 32-Bit LFSR:
1
rnd32(31 downto 1) <= rnd32(30 downto 0) ;
2
rnd32(0) <= not(rnd32(31) XOR rnd32(22) XOR rnd32(2) XOR rnd32(1));

Wenn ich mir die Appl. Note von Xilinx angucke
http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

steht auf Seite 5 in der Tabelle für 32 Bit folgende Tabs, die mit XNOR 
verknüpft werden sollen:
32Bit: 32,22,2,1
Natürlich für ein Vektor von 1 bis 32.

Im Quellcode von Lothar wurde ein Vektor von 31 downto 0 benutzt, also 
müssten die Tabs laut Tabelle Xilinx folgende sein: 31, 21, 1, 0.
Kann mir jemand erklären warum im Lothars Quellcode nun 31, 22, 2, 1 
benutzt wurde? Habe ich etwas verpasst :-|

Ich will selber eine LFSR mit 64 Bit realisieren, also in VHDL:
1
LIBRARY IEEE;
2
USE IEEE.STD_LOGIC_1164.ALL;
3
4
ENTITY Top_Module IS
5
  PORT (
6
        CLK:  IN STD_LOGIC;
7
        RST:  IN STD_LOGIC;
8
        DEBUG:  OUT STD_LOGIC
9
  );
10
END Top_Module;
11
12
ARCHITECTURE BEHAVIORAL OF Top_Module IS
13
SIGNAL  RANDOM_DATA: STD_LOGIC_VECTOR(63 DOWNTO 0):= (OTHERS => '0');
14
15
BEGIN
16
17
PROCESS(CLK)
18
BEGIN
19
20
IF CLK = '1' AND CLK'EVENT THEN
21
  IF RST = '1' THEN
22
    RANDOM_DATA <= (OTHERS => '0');
23
  ELSE
24
    RANDOM_DATA(63 DOWNTO 1) <= RANDOM_DATA(62 DOWNTO 0);
25
    RANDOM_DATA(0) <= NOT( RANDOM_DATA(63) XOR RANDOM_DATA(62) XOR RANDOM_DATA(61) XOR RANDOM_DATA(60) );
26
    IF RANDOM_DATA = (RANDOM_DATA'range => '0') THEN
27
      DEBUG <= '1';
28
    ELSE
29
      DEBUG <= '0';
30
    END IF;
31
  END IF;
32
END IF;
33
34
END PROCESS;
35
36
END BEHAVIORAL;

Das Debug Signal ist nur für Chipscope gedacht, damit mein Vektor nicht 
wegoptimiert wird, da ich ihn ja benutze um debug zu setzen. Weiterhin 
kommt später auf jeden Fall noch ein Enable Signal rein, um die LFSR zu 
steuern.

Außer der Frage oben würde es mich interressieren, ob ich mit der 
Überprüfung meines DDR2 Speichers mit einer LFSR und CRC Berechnung auf 
dem richtigen Weg bin. Sollte man es irgendwie anders testen oder ist 
der Test schon in Ordnung?

Vielen Dank im voraus für eure Antworten.

Gruß Cihan

von DuArte (Gast)


Lesenswert?

Wieso vergleichst du nicht direkt die geschriebenen mit den gelesenen 
Daten?
Du musst hierfür lediglich den gleichen Daten-Generator zweimal 
instaniieren.


DuArte

von Cihan K. (lazoboy61)


Lesenswert?

Dann müsste ich ja einen Zufallsgenerator starten, den DDR2 komplett 
füllen und stück für Stück auslesen, dabei natürlich den 
Zufallsgenerator von neu Starten und bspl.weise Byte für Byte 
vergleichen, verstehe ich das Richtig? Dann könnte ich ja auch den 
Fehler im Detail sehen, wenn sich einer bemerkbar macht.

Und was ist mit der LFSR? (Die Frage oben)

von Christoph (Gast)


Lesenswert?

Cihan Kalayci schrieb:
> Im Quellcode von Lothar wurde ein Vektor von 31 downto 0 benutzt, also
> müssten die Tabs laut Tabelle Xilinx folgende sein: 31, 21, 1, 0.
> Kann mir jemand erklären warum im Lothars Quellcode nun 31, 22, 2, 1
> benutzt wurde? Habe ich etwas verpasst :-|

Da ist es relativ egal was du wie verXoderst - auch wenn du nur 2 Bits 
wirst du Zufallszahlen bekommen. Wie gut, etc. die sind sollte ja bei 
deinem Fall keine Rolle spielen

von namenlos (Gast)


Lesenswert?

noch'n Tip zum Nachlesen: http://outputlogic.com

unter "Scrambler Generator" kannst Du Dir dann auch VHDL-Code für eine 
64-Bit-Zufallszahl generieren lassen

von Cihan K. (lazoboy61)


Lesenswert?

namenlos schrieb:
> noch'n Tip zum Nachlesen: http://outputlogic.com
>
> unter "Scrambler Generator" kannst Du Dir dann auch VHDL-Code für eine
> 64-Bit-Zufallszahl generieren lassen

Danke für den Tip. Die Seite habe ich auch für meinen LFSR benutzt 
gehabt.

Cihan

von P. K. (pek)


Lesenswert?

Cihan Kalayci schrieb:
> Und was ist mit der LFSR? (Die Frage oben)

Das wäre dann die Basis für den von DuArte zitierten Zufallsgenerator.

Es fragt sich aber, ob Du statt der Zufallszahlen nicht gezielt Patterns 
(checkerboards, walking 1,0 etc.) benutzen willst (einen BIST 
sozusagen). Bei Altera gibt's so ein rudimentäres Device zum DDR-I/F-IP 
dazu (Example driver), vielleicht bei Xilinx auch?

von DuArte (Gast)


Lesenswert?

>verstehe ich das Richtig?

Ja

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.