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://
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.