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