Elektroda.pl
Elektroda.pl
X
PCBwayPCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Testy rzeczywiste FIFO Block-RAM w ISE Xilinx

23 Lis 2007 22:28 1815 4
  • Poziom 10  
    Witam,
    poniewaz mam problemy z moim projektem, postanowilem rozlozyc go na czesci pierwsze i przeanalizowac.

    Wybor padl na kolejke FIFO wygenerowana w CoreGenerator. Wersja z dwoma zegarami (dla zapisu i odczytu). Przestowalem dwie wersje: jedna z registered outputs (bez opoznienia) i bez registered outputs.

    Potraktowalem ja ponizszym kodem:

    Code:
    process(P_I_CLK,P_I_RESET_N)
    
    variable v_state : integer := 0;
    variable licznikX : integer range 0 to 255 := 0;
             
             
    begin                  
    if P_I_RESET_N = '0' then
    v_state :=0;

    elsif P_I_CLK'event and P_I_CLK = '1' then
    sig_set_counter<='0';
    case v_state is

       when 0 =>
       
       sig_dane_do_fifo <= sig_counter;
       sig_set_counter<='1';
       sig_push_fifo <= '1';
       sig_pop_fifo <= '0';
       v_state := 1 ;

       when 1 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '1';
       sig_pop_fifo <= '0';
       v_state := 2 ;
       
       when 2 =>
       sig_dane_do_fifo <= sig_counter;
       
       sig_push_fifo <= '0';
       sig_pop_fifo <= '1';
       v_state := 3 ;
       
       when 3 =>
       sig_dane_do_fifo <= sig_counter;
       
       sig_push_fifo <= '0';
       sig_pop_fifo <= '1';
       v_state := 4 ;            
       
       
       when 4 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '0';
       sig_pop_fifo <= '1';
       v_state := 5 ;

       

       

          when 5 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '1';
       sig_pop_fifo <= '1';
       v_state := 6 ;

       

       

       when 6 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '1';
       sig_pop_fifo <= '1';
       v_state := 7 ;

       

       

       when 7 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '0';
       sig_pop_fifo <= '1';
       v_state := 8 ;

       

       when 8 =>
       sig_dane_do_fifo <= sig_counter;
       sig_push_fifo <= '0';
       sig_pop_fifo <= '1';
       v_state := 0 ;
       
       when others =>
       sig_dane_do_fifo <= sig_counter;
       
       sig_push_fifo <= '0';
       sig_pop_fifo <= '0';
       v_state := 0 ;

    end case;
    end if;   
    end process ;


    no i uruchomilem ChipScopePro i podejrzalem co sie dzieje wewnatrz FPGA.

    Sygnal sig_counter to wyjscie licznika.

    Wykresy na zalaczonych pdfach. Generalnie chcialbym sie skupic na wersji z opoznieniem. Tej drugiej nie do konca pojmuje.

    O ile dane wypluwane na wyjsciu wygladaja w porzadku, to nie moge wyczaic sposobu ustawiania sie sygnalu EMPTY. Jakos troche niekonsekwentnie jest to robione. Czy ktos moglby mnie uspokoic ze wszystko jest dobrze?

    W projekcie docelowo w przypadku gdy EMPTY jest = 0 ma sie wywolywac okreslone dzialanie, wiec sygal ten jest dla mnie wazny.

    Zegar to 50 Mhz.

    Pozdrawiam i dziekuje
    zlootawy
  • PCBwayPCBway
  • Poziom 10  
    nie no dostaje juz goraczki od tego...

    zrobilem podobny test na innym fpga, tez na virtex 2 pro i to empty zaswieca sie jeszcze inaczej w tej samej sytuacji..

    moze robie cos nie tak w ustawieniach projektu...

    uzywam ise xilinx. co trzeba ustawic zeby bylo dobrzE?

    jedyne co ustawilem to odpalilem ograniczenia czasowe i we wszystkich globalach wykrytych przez system (glowny zegar i dwa jakies dziwne sygnaly) ustawilem odpoiedi okres (rowny zegarowi).

    czy cos jeszcze tam trzeba wpisac? moze to z tego wynika problem, ze place and route jest zle robiony?

    czy jeszcze jakies ograniczenia dla innych na przyklad linii trzeba ustawic?

    dreczy mnie to, bo tu nie ma zadnego mojego kodu jeszcze... to core wygenerowany, a wiec raczej zakaldam ze jest bardzo dobry.

    Dodano po 47 [minuty]:

    hmmmm.... po kolejnych testach wyglada na to, ze to wersja z dwoma zegarami mi tak wariuje.... w przypadku wersji z jednym zegarem empty zachowuje sie prawidlowo... a zapis i odczyt i tak moze byc w jednym momencie. wiec niech tak zostanie :)
  • PCBwayPCBway
  • Pomocny post
    Poziom 28  
    zlootawy napisał:
    moze robie cos nie tak w ustawieniach projektu...
    uzywam ise xilinx. co trzeba ustawic zeby bylo dobrzE?

    sadze, ze jest dobrze, ze xilinx przetestowal swoje rozwiazanie
    setki razy;
    nie studiowalem szczegolowo twojego przypadku, ale moze kilka ogiolnych
    slow o fifo;
    w czym jest problem: fifo musi monitorowac ilosc wpisanych i odczytanych
    slow do pamieci, jesli wpis i odczyt zachodzi z asynchronicznymi zegarami,
    to sprawa ustawiania flag full i empty sprowadza sie do [trudnego]
    problemu porownania wartosci 2 licznikow [licznik wpisow i licznik odczytow];
    trudnego, bo przeciez liczniki licza asynchronicznie;
    flaga empty jest [chyba z oczywistych powodow] synchronizowana do
    zegara czytajacego, flaga full odwrotnie;
    zwykle [a moze zawsze] logika ustawiajaca te flagi jest 'ostrozna',
    to znaczy sygnal empty przechodzi w stan nieaktywny [fifo nie-empty]
    w takim czasie, by fifo na pewno nie bylo puste - co w praktyce
    oznacza, ze najczesciej pozniej niz trzeba;
    jesli zegary odczyt/zapis jsa synchroniczne, problem znika
    i flagi full/empty odzwierciedlaja prawdziwy stan kolejki z dokladnoscia
    do czyklu zegarowego;

    witam wszystkich po wakacjach :)
    JA
  • Pomocny post
    Poziom 18  
    J.A napisał:

    trudnego, bo przeciez liczniki licza asynchronicznie;
    flaga empty jest [chyba z oczywistych powodow] synchronizowana do
    zegara czytajacego, flaga full odwrotnie;
    zwykle [a moze zawsze] logika ustawiajaca te flagi jest 'ostrozna',
    to znaczy sygnal empty przechodzi w stan nieaktywny [fifo nie-empty]
    w takim czasie, by fifo na pewno nie bylo puste - co w praktyce
    oznacza, ze najczesciej pozniej niz trzeba;
    jesli zegary odczyt/zapis jsa synchroniczne, problem znika
    i flagi full/empty odzwierciedlaja prawdziwy stan kolejki z dokladnoscia
    do czyklu zegarowego;

    Ja do końca nie wiem dlaczego fifo Xilinx-a z dwoma zegarami ma takie opóźnienie na empty, bo Xilinx nie publikuje kodu(jak się dowiem czegoświęcej to odświeżę ten wątek), ale żeby przejść z jednej domeny zegarowej do drugiej wystarczy zatrzasnąć sygnał raz góra dwa zegarem z nowej domeny. Mi zawsze wydawało sie że to pipeline na komparatorze adresów wprowadza takie opoźnienie, ostatnio słyszałem wersje ze to konwersja na kod Gray'a. Jeśli empty jest krytyczne to zwykle wstawiam fifo własnej produkcji, bo zwykle wówczas inne parametry są mniej istotne.

    Jeśli da radę to polecam fifo na jednym zegarze, ewentualnie z przejściem do nowej domeny "wlasnej produkcji".

    Witam po wakacjach.
  • Pomocny post
    Poziom 28  
    [g.d] napisał:
    Ja do końca nie wiem dlaczego fifo Xilinx-a z dwoma zegarami ma takie
    opóźnienie na empty/.../

    ja tez nie, ale wierze, ze nie pracuja tam nowicjusze, ze wiedza co robia;
    [g.d] napisał:
    ale żeby przejść z jednej domeny zegarowej do drugiej wystarczy zatrzasnąć sygnał
    raz góra dwa/.../

    raczej 'gora dwa' jesli pamieta sie o zjawisku metastabilnosci;
    [g.d] napisał:
    /.../słyszałem wersje, ze to konwersja na kod Gray'a./.../

    watpie, konwersja gray<->bin to pojedyncze ns dla licznikow o rozsadnych dlugosciach,
    wiec nawet dla 200MHz nie wprowadzalaby extra opoznienia o cykl zegara;
    J.A