eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaFPGA, VHDL detekcja zbocza i problemyFPGA, VHDL detekcja zbocza i problemy
  • Data: 2009-05-22 14:20:42
    Temat: FPGA, VHDL detekcja zbocza i problemy
    Od: k...@g...com szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Witam, pracuje ostatnio nad urządzeniem pośredniczącym między
    kontrolerem IDE z komputera a dyskiem twardym. Całość testuje na
    płytce startowej altera cyclone II starter board (http://
    www.kamami.pl/?id_prod=4520400).

    Sygnały interfejsu ata idą do płytki startowej przez bufory 74lvc244
    (sygnały sterujące) oraz '245 (dwukierunkowe linie danych).

    Z podłączeniem wszystko okej, opisuje VHDLem prosty kawałek kodu który
    modyfikuje odpowiedź dysku na IDENTIFY DEVICE i to działa ładnie,
    transparentnie, bezproblemowo, ale mam problem, kiedy próbuje np.
    wykryć zbocze sygnału DIOR idącego z hosta.

    Sygnał ten zgodnie ze specyfikacją ATA może mieć okres minimum 120ns
    (mowa o trybie Multiword DMA2). Zegar taktujący układ to 50MHz
    przepuszczone przez wbudowane PLL (3*50MHz)=150MHz. Nie powinno być
    więc problemów z wykrywaniem zmian sygnału DIOR bo częstotliwość ta
    jest wielokrotnie wyższa....

    Niestety to tylko teoria, w praktyce prawie połowę zboczy sygnału
    HOST_DIOR_N "gubie", kiedy próbuje je wykrywać w procesie
    zsynchronizowanym z głównym zegarem...

    Prosty przykład:

    process(CLK,KEY0)
    begin
    if KEY0='0' then
    debug_cnt<=(others=>'0');
    dior_edge<='0';
    elsif CLK'event and CLK='1' then
    if HOST_DIOR_N='1' and dior_edge='0' then
    debug_cnt<=debug_cnt+1;
    dior_edge<='1';
    else
    dior_edge<='0';
    end if;
    end if;
    end process;

    Moim skromnym zdaniem powinno to zliczać w debug_cnt ilość wystąpień
    narastających zboczy sygnału HOST_DIOR_N, który jest kilkanaście razy
    wolniejszy od CLK... I co się okazuje? Zmienna debug_cnt zawiera około
    połowę mniejszą wartość niż powinna....

    Przykład drugi:

    process(HOST_DIOR_N,KEY0)
    begin
    if KEY0='0' then
    debug_cnt<=(others=>'0');
    elsif HOST_DIOR_N'event and HOST_DIOR_N='1' then
    debug_cnt<=debug_cnt+1;
    end if;
    end process;

    W tym przypadku debug_cnt zawiera już właściwą wartość, zgodną z
    ilością zboczy narastających sygnału HOST_DIOR_N. Ja potrzebuję jednak
    mieć synchronizację z CLK głównym więc nie mogę sobie pozwolić na
    takie rozwiązanie.

    Przepraszam za przydługiego posta i dziękuję za wytrwałość w czytaniu
    oraz ewentualną pomoc w rozwiązaniu problemu...

    pozdrawiam.

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: