[AD2] Analog Discovery 2 odczyt pamięci ROM 27C256
: sobota 04 lut 2017, 19:04
Sprzęt
Może się zdarzyć sytuacja, że potrzebujemy odczytać zwartość pamięci ROM a nie mamy programatora. Pokażę jak to zrobić przy użyciu AD2 na przykładzie pamięci 27C256.
Aby odczytać komórkę pamięci musimy ją najpierw zaadresować, w przypadku układu 27C256 potrzebujemy 15 linii adresowych i 8 linii danych, AD2 nie posada aż tylu wyprowadzeń dla analizatora stanów logicznych. Skoro mamy odczytać wszystkie komórki pamięci po kolei, zaadresujemy pamięć wykorzystując licznik. Wykorzystałem 2 układy 74LS393, w każdym takim układzie znajdują się dwa 4 bitowe liczniki binarne. Podłączamy je tak aby uzyskać jeden 16 bitowy licznik, czyli ostatnie wyjście 4 bitowego licznika podłączamy do wejścia następnego 4 bitowego licznika.
Po podpięciu zbudowanego licznika do pamięci, podłączamy całość do AD2, wyjście z pamięci do kabelków 0-7, wejście licznika do kabelka 15, reset licznika do kabelka 14. Na wejściach pamięci oznaczonych OE i CE wymuszamy stan niski podpinać je do masy.
Oprogramowanie
Poniższy skrypt uruchamiany w środowisku WaveForms, odczytuje zawartość pamięci i zapisuje w pliku tekstowym, każdy odczytany bajt jest zapisany w formie dziesiętnej oraz w jednej linii zapisuje 8 bajtów oddzielonych od siebie spacją. Miejsce zapisu pliku i jego nazwę określa linia 9 skryptu:
var file = File("C:/temp/rom.txt");
Układ 27C256, posiada pojemność 256kb (kilobitów), czyli 32kB (kilobajtów), żeby odczytać całą zawartość musimy wykonać 32x1024 razy odczyt. W programie są dwie zagnieżdżone pętle, wewnętrzna pętla odczytuje po 8 bajtów, w związku z czym zewnętrzna pętla musi być wykonana 8 razy mniej (4*1024).
Odczytaną zawartość można skonwertować to postaci szesnastkowej lub binarnej i wykorzystać do zaprogramowania innego układu, sam odczyt w/w programem trwa kilka minut, zalecam odczytanie 2 krotne i sprawdzenie poprawności odczytu po przez porównanie plików.
Może się zdarzyć sytuacja, że potrzebujemy odczytać zwartość pamięci ROM a nie mamy programatora. Pokażę jak to zrobić przy użyciu AD2 na przykładzie pamięci 27C256.
Aby odczytać komórkę pamięci musimy ją najpierw zaadresować, w przypadku układu 27C256 potrzebujemy 15 linii adresowych i 8 linii danych, AD2 nie posada aż tylu wyprowadzeń dla analizatora stanów logicznych. Skoro mamy odczytać wszystkie komórki pamięci po kolei, zaadresujemy pamięć wykorzystując licznik. Wykorzystałem 2 układy 74LS393, w każdym takim układzie znajdują się dwa 4 bitowe liczniki binarne. Podłączamy je tak aby uzyskać jeden 16 bitowy licznik, czyli ostatnie wyjście 4 bitowego licznika podłączamy do wejścia następnego 4 bitowego licznika.
Po podpięciu zbudowanego licznika do pamięci, podłączamy całość do AD2, wyjście z pamięci do kabelków 0-7, wejście licznika do kabelka 15, reset licznika do kabelka 14. Na wejściach pamięci oznaczonych OE i CE wymuszamy stan niski podpinać je do masy.
Oprogramowanie
Poniższy skrypt uruchamiany w środowisku WaveForms, odczytuje zawartość pamięci i zapisuje w pliku tekstowym, każdy odczytany bajt jest zapisany w formie dziesiętnej oraz w jednej linii zapisuje 8 bajtów oddzielonych od siebie spacją. Miejsce zapisu pliku i jego nazwę określa linia 9 skryptu:
var file = File("C:/temp/rom.txt");
Układ 27C256, posiada pojemność 256kb (kilobitów), czyli 32kB (kilobajtów), żeby odczytać całą zawartość musimy wykonać 32x1024 razy odczyt. W programie są dwie zagnieżdżone pętle, wewnętrzna pętla odczytuje po 8 bajtów, w związku z czym zewnętrzna pętla musi być wykonana 8 razy mniej (4*1024).
Kod: Zaznacz cały
function ReadROM(){
print("Running ReadROM script");
StaticIO.Channel1.DIO[7].checked = 0;
StaticIO.Channel1.DIO[6].checked = 1; //reset
wait(0.1);
StaticIO.Channel1.DIO[6].checked = 0;
var file = File("C:/temp/rom.txt");
for(var idx=0; idx<4*1024; idx++){
var row = "";
for(var i = 0; i < 8; i++){
row = row + StaticIO.Channel0.Input.value + " ";
StaticIO.Channel1.DIO[7].checked = 1;
wait(0.01);
StaticIO.Channel1.DIO[7].checked = 0;
wait(0.01);
}
print(row);
file.appendLine(row);
}
}
if(!('StaticIO' in this)) {
throw("Please open a StaticIO instrument");
}
ReadROM();
Odczytaną zawartość można skonwertować to postaci szesnastkowej lub binarnej i wykorzystać do zaprogramowania innego układu, sam odczyt w/w programem trwa kilka minut, zalecam odczytanie 2 krotne i sprawdzenie poprawności odczytu po przez porównanie plików.