dostęp do SRAM

Jul 12, 2007 12 Replies

Witam,



Nie do końca działa mi dostęp do pam SRAM 15 ns. Pamięć musi pracować min w jednym takcie zegara 25MHz odczyt w drugim zapis. Poniżej zamieściłem kod:



process(clk_50MHz,clk_cnt) begin



if rst = '0' then data_IO <= "ZZZZZZZZ"; elsif(clk_50MHz'event and clk_50MHz = '1') then if(clk_cnt = "11") then OE <= '0'; addr_out <= addr_vga; data_IO <= "ZZZZZZZZ"; r_w <= '1'; elsif(clk_cnt = "00") then temp <= data_O; elsif(clk_cnt = "01") then OE <= '1'; addr_out <= adres; data_IO <= data; r_w <= '0';



elsif(clk_cnt = "10") then OE <= '1'; addr_out <= adres; data_IO <= data; r_w <= '0'; end if; end if;



end process;



Krótkie wyjaśnienie używam oscylatora 50MHZ, clk_cnt zlicza impulsy i w zależności od wartości steruje zapisem/odczytem, rej temp jest po to żeby zapisać odczytaną daną. Za wszelkie uwagi z góry dziękuje.



Pozdrawiam, Tomasz O.


A jak zmniejszysz zegar to dziala ?

Nie wiem co masz za pamiec, ale one maja rozne wymagania timingowe - np adres i data musza byc ustawione na liniach na dlugo zanim

-WE zmienimy na zero.

J.

a co nie dziala ? jakie objawy ?

< if(clk_cnt = "11") then < OE <= '0'; < addr_out <= addr_vga; < data_IO <= "ZZZZZZZZ"; < r_w <= '1'; < elsif(clk_cnt = "00") then < temp <= data_O;

to wyglada na odczyt z pamieci, chyba powinno byc temp <= data_IO ?

nie zakladaj, ze kompilator jest inteligentny; dopisz w elsif co ma zrobic z data_IO, OE i r_w dla clk_cnt = 00; moze z powodow optymalizacyjnych zmienil OE na '1' ? albo otworzyl bufory danych ?

jesli jest jakis problem z timingiem [mozesz to sprawdzic jakims symulatorem ?] wtedy albo recznie umiesc rejestry adresu OE r_w kolo pinow wyjsciowych, albo w procesie zmien clk_50MHz na ~clk_50MHz;

JA

Objawy są takie, że podczas wyświetlania na monitorze pojawiają się śmieci, sprawa wygląda lepiej jeśli tylko odczytuje(obraz jest stabilniejszy) ale np. zamiast świecenie konkretnego piksela świeci kilka w linii.

Pozdrawiam Tomasz O.

to jest pamiec synchroniczna, prawda ? te 15ns tak by sugerowaly; inaczej ten rtl co go wkleiles nie ma sensu;

masz jakis dowod na to, ze to ten kawalek kodu, ktory przestawiles jest powoduje klopoty, a nie zrodlo sygnalu badz to, co wysyla dane do monitora ?

jesli poslugujesz sie programem xilinxa czy altery, to za pomoca wbudowanego analizatora logicznego mozesz przesledzic przeplyw danych do/z pamieci; mozesz przesymulowac swoj rtl; [wlasciwie to od tego powinno sie zaczac]

w najgorszym wypadku trzeba wziac oscyloskop i sprawdzic co sie dzieje na pinach miedzy fpga a pamieca; zmieniajac kontroler w taki sposob, by pisal do pamieci na zmiane FF 00 [jakis inny latwy do rozpoznania wzor] bedziesz w stanie stosunkowo latwo stwierdzic oscyloskopem, czy wpis jest poprawny; potem przelacz kontroler na odczyt tylko, by zobaczyc, ze odczytujesz to samo, co wpisales; no i sprawdz timing adresu, wr, oe wzgledem clock;

'wylacz pamiec' i slij do monitora konkretny pattern, np. zmien linie:

na temp <= temp + 1;

jesli dalej na monitorze smieci, to problem nie w komunikacji z pamiecia; itd - manipulujac kodem mozesz okreslic dosc dokladnie ktory kawalek dziala wadliwie;

JA

Tomasz O. <olek snipped-for-privacy@o2.pl napisał(a):

Z tresci wnioskuje ze to ma byc VRAM. Z opisu wyglada na problemy timmingowe, a pierwszym podejrzanym sa sygnaly wchodzac/wychodzace do pamieci:

  1. Upewnij sie ze sygnaly wyjsciowe/wejsciowe sa ztrzaskiwane w samych IO blokach.
  2. Sprobuj zwiekszyc wydajnosc pradowa i ewentualnie "slew rate" IO bloków.
  3. Sprawdz czy standardy napiec sie zgadzaja.

  1. Sprawdz czy jest constraint na okres zegara clk_cnt.

bo? skad wynika ze to ma byc VRAM (VRAM to pamieci z dwoma portami - rownolegly tak jak w klasycznym RAM i drugi szeregowy dla CRTC)

Z góry przepraszam za nieobecność ale do poniedziałku nie ma mnie w domu. Urządzenie to karta graficzna VGA. Pamięć dokładnie to UMC UM61256-15 i ma ona "symulować" pamięć dwuportową (niestety ciężko o dokumentacje ale mam dokumentację odpowiednika bodajże 65256 ale nie jestem pewien ponieważ jestem poza domem). W poniedziałek postaram się odpowiedzieć na wszystkie pytania i zastosuję się do podanych wskazówek. Bardzo mi zależy żeby to działało bo to praca dyplomowa.

Pozdrawiam Tomasz O.

IMO problemy zlego timingu - wez na spokojnie datasheet do SRAM i popatrz na zaleznosci czasowe (szczegolnie na wszystkie czasy ustalania adresow i strobow zapisu/odczytu)

Czemu nie ma sensu i jak powinien wyglądać dla pamięci asynchronicznej ??

gdy zajmowalem sie jeszcze async. s-ramami, to pamiec zatrzaskiwala sobie adres opadajacym zboczem sygnalu 'write_enable', u ciebie to jest r_w jesli sie nie myle, a dane rosnacym zboczem tejze linii; nie sadze, by teraz bylo inaczej;

w twoim kodzie zegar systemowy aktywuje jednoczesnie i adres i linie 'wpisz' wiec tylko dzieki zbiegowi okolicznosci, dzieki przypadkowo odpowiednim opoznieniom w fpga moze zostac zachowany wymagany przez pamiec setup time dla adresu; podobnie ma sie sprawa z danymi, tym razem mozesz miec problem z hold time;

na przyklad tak: krok 0 - wpisz adres i dane do buforow wyjsciowych krok 1 - przepusc clk_50MHz jako r_w / np. write_gate <= 0; --to ma byc rejestr r_w = write_gate OR clk_50MHz; -- to ma byc bramka, nie rejestr, musi byc poza 'process'; slabo znam vhdl, wiec nie sugeruj sie znaczkami: "<=", "=", "OR"; "OR" to tylko oznaczenie funkcji, a "=" i "<=" dla rozroznienia miedzy FF a bramka / krok 2 - ustaw adres do odczytu, zamknij bramke write_gate / write_gate <= 1; / ustaw bufory danych w tri-state; krok 3 - przepisz dane z pamieci do rejestrow temp;

oczywiscie to tylko generalna idea, ktorej w zaden sposob nie sprawdzilem;

JA

to chyba nieodpowiednie okreslenie; powinno byc raczej: nie jest poprawny :)

JA

JA pisze:

:) nic nie szkodzi. Przerabiam kod do podanych wskazówek i mam nadzieje że w najbliższym czasie karta zacznie działać.

Tomasz O.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required