FPGA, VHDL detekcja zbocza i problemy

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Witam, pracuje ostatnio nad urzB1%dzeniem poB6%redniczB1%cym miEA%dzy
kontrolerem IDE z komputera a dyskiem twardym. CaB3%oB6%E6 testuje na
pB3%ytce startowej altera cyclone II starter board (http://
www.kamami.pl/?id_prod3D%4520400).

SygnaB3%y interfejsu ata idB1% do pB3%ytki startowej przez bufory 74lvc244
(sygnaB3%y sterujB1%ce) oraz '245 (dwukierunkowe linie danych).

Z podB3%B1czeniem wszystko okej, opisuje VHDLem prosty kawaB3%ek kodu kt=
F3%ry
modyfikuje odpowiedBC% dysku na IDENTIFY DEVICE i to dziaB3%a B3%adnie,
transparentnie, bezproblemowo, ale mam problem, kiedy prF3%buje np.
wykryE6% zbocze sygnaB3%u DIOR idB1%cego z hosta.

SygnaB3% ten zgodnie ze specyfikacjB1% ATA moBF%e mieE6% okres minimum 120n=
s
(mowa o trybie Multiword DMA2). Zegar taktujB1%cy ukB3%ad to 50MHz
przepuszczone przez wbudowane PLL (3*50MHz)3D%150MHz. Nie powinno byE6%
wiEA%c problemF3%w z wykrywaniem zmian sygnaB3%u DIOR bo czEA%stotliwoB6%
E6% ta
jest wielokrotnie wyBF%sza....

Niestety to tylko teoria, w praktyce prawie poB3%owEA% zboczy sygnaB3%u
HOST_DIOR_N "gubie", kiedy prF3%buje je wykrywaE6% w procesie
zsynchronizowanym z gB3%F3wnym zegarem...

Prosty przykB3%ad:

    process(CLK,KEY0)
    begin
        if KEY03D%'0' then
             debug_cnt<3D%(others3D%>'0');
            dior_edge<3D%'0';
        elsif CLK'event and CLK3D%'1' then
            if HOST_DIOR_N3D%'1' and dior_edge3D%'0' then
                debug_cnt<3D%debug_cnt+1;
                dior_edge<3D%'1';
            else
                dior_edge<3D%'0';
            end if;
        end if;
    end process;

Moim skromnym zdaniem powinno to zliczaE6% w debug_cnt iloB6%E6 wystB1%pie=
F1%
narastajB1%cych zboczy sygnaB3%u HOST_DIOR_N, ktF3%ry jest kilkanaB6%cie ra=
zy
wolniejszy od CLK... I co siEA% okazuje? Zmienna debug_cnt zawiera okoB3%o
poB3%owEA% mniejszB1% wartoB6%E6 niBF% powinna....

PrzykB3%ad drugi:

    process(HOST_DIOR_N,KEY0)
    begin
        if KEY03D%'0' then
            debug_cnt<3D%(others3D%>'0');
        elsif HOST_DIOR_N'event and HOST_DIOR_N3D%'1' then
            debug_cnt<3D%debug_cnt+1;
        end if;
    end process;

W tym przypadku debug_cnt zawiera juBF% wB3%aB6%ciwB1% wartoB6%E6, zgodn=
B1% z
iloB6%ciB1% zboczy narastajB1%cych sygnaB3%u HOST_DIOR_N. Ja potrzebujEA% j=
ednak
mieE6% synchronizacjEA% z CLK gB3%F3wnym wiEA%c nie mogEA% sobie pozwoli=
E6% na
takie rozwiB1%zanie.

Przepraszam za przydB3%ugiego posta i dziEA%kujEA% za wytrwaB3%oB6%E6 w cz=
ytaniu
oraz ewentualnB1% pomoc w rozwiB1%zaniu problemu...

pozdrawiam.

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

HOST_DIOR_N jest synchroniczny z Twoim zegarem? Nie? To masz hazard.
Daj przerzutnik D na noge Altery i opiero potem do 'if' - pomoze.
Niestety wyjdzie Ci latencja 1CLK, i na to nie ma rady (chyba ze
asynchronicznie wszystko zrobisz).

Quoted text here. Click to load it

Tutaj HOST_DIOR_N nie musi byc synchronicznie z Twoim zegarem - dlatego
dziala.

--
Jerry1111

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

Mógłbyś rozwinąć?? Bo szczerze mówiąc jeśli czas trwania "jedynki" w
HOST_DIOR_N jest dłuższy niż okres zegara CLK, fakt synchroniczności
zegarów nie ma tu nic do rzeczy! Tzn ma, bo ten kod jest napisany źle,
ale to wyjaśniłem w innym poście w tym wątku. Nie wiem, czy chodziło Ci
o to samo co mnie, czy nie bardzo??
Ja w każdym bądź razie nie widzę problemów, aby zliczać impulsy jednego
sygnału synchronizując się innym sygnałem zegarowym, pod warunkiem, że
będzie spełniona zależność czasowa:
t_wejście_aktywne > Tclk :)

Pozdrawiam!!
Konop

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

Nie bardzo. To o czym ja pisze wyjdzie tylko czasami - jest zalezne od
sposobu optymalizacji i kompilacji. Optymalizator zalozy (chyba ze
bedziesz mial jakies d-cell czy inne kurestwo bezposrednio na pinach) ze
sygnal jest synchroniczny. Moga sie przez to dziac rozne (czesto
nieoczywiste) cuda. Np: licznik do enkodera nie dziala ;-)

Inna sprawa - jak na to spojrzalem, to potem juz nie chcialo mi sie
dalej analizowac. Inna sprawa, ze jak HOST_DIOR_N bedzie trwal 10
impulsow, to licznik policzy do 5 (w oryginalnym poscie). Tu az sie
prosi o prosciutkie state-machine (szybciej to, niz myslec nad trzema
if-ami).

Quoted text here. Click to load it

Zobaczysz, zobaczysz... ino czasu troche potrzeba ;-) Czasami naprawde
dziwne hazardy wychodza, np: dziala tylko z signal-tapem.

Quoted text here. Click to load it

Rowniez!

--
Jerry1111

Re: FPGA, VHDL detekcja zbocza i problemy
On 23 Maj, 01:02, Jerry1111

Quoted text here. Click to load it

Witam, przepraszam za wprowadzenie w blad. Podany przyklad pisaB3%em "z
palca" BF%eby pokazaE6% problem i faktycznie siEA% pomyliB3%em z poB6%piech=
u. W
Quartusie jednak napisaB3%em tamto wykrywanie zbocza w sposF3%b podobny do
Konopa no i skutek jest taki jak opisaB3%em powyBF%ej. Powoli koncza mi
sie pomysly i bedzie trzeba isc i zaobserwowac jak wygladaja te
sygnaly na jakims rejestratorze, bo wyglada to tak jakby DIOR_N mial
jednak okres porownywalny lub wrecz mniejszy od czestotliwosci CLK.
Wedlug specyfikacji taka sytuacja nigdy nie powinna miec miejsca. No
nic, dziekuje za rady w kazdym razie. Sprobuje jeszcze powalczyc sam :)

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

Ja tu widzę inny (niż widzi Jerry) problem. Nie wiem, czy on powoduje to
o czym piszesz... teoretycznie może (przepełnienie ;))... Sam napisałeś,
że sygnał HOST_DIOR_N jest *kilkanaście* *razy* *wolniejszy* od sygnału
CLK. Rozumiem, że ma po prostu dłuższy okres i stan aktywny HOST_DIOR_N
trwa ponad 1 cykl zegara CLK, tak?? To teraz przeanalizuj co się będzie
działo w przypadku, gdy będziesz miał HOST_DIOR_N = 1 przez 10 taktów
CLK. Kolejne numerki to kolejne zbocza narastające CLK
1) dior_edge = 0, więc dodajemy 1 i dajemy dior_edge<=1
2) poniewaz warunek HOST_DIOR_N='1' _and_ dior_edge='0' NIE JEST
spełniony, "wykonywane" jest dior_edge<=0 !!
3) identyczny z 1)
itd: 2=4=6=810% i 1=3=5=7=9 :)...

Efekt - zliczasz 5 impulsów, a chciałeś 1 ;)... wystarczy tego enda
rozbić na dwa ify i będzie po sprawie ;)...

if HOST_DIOR_N='1'
    if dior_edge='0' then debug_cnt<=debug_cnt+1;****
    dior_edge<='1';
else
    dior_edge<='0';
end if;
W lini z **** na końcu nie jestem pewny czy nie trzeba dawać end if, nie
pamiętam po prostu dokładnie składni VHDLa ;)...

Quoted text here. Click to load it

Fakt, że zmienna powinna zawierać zdecydowanie większą wartość niż
powinna, ale może przepełnienie robi swoje?? ;)... Nie wiem jak
deklarujesz tę zmienną i ile teoretycznie możesz tam zliczać ;)...

Pozdrawiam
Konop

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

Sam sobie odpowiem!! Można to zrobić jeszcze tak:
process(...)
if HOST_DIOR_N='1' and dior_edge='0' then
    debug_cnt<=debug_cnt+1;****
end if;
dior_edge<=HOST_DIOR_N;
end process;

Wówczas możnaby nawet zmienić nazwę dior_edge na previous_dior albo
last_dior czy coś w tym stylu ;)... W każdym bądź razie to takie
"typowe" wykrywanie zobczy - mamy 1, a było 0, to jest zbocze ;)...


Pozdrawiam
Konop

Re: FPGA, VHDL detekcja zbocza i problemy
snipped-for-privacy@gmail.com wrote:

Quoted text here. Click to load it

A probowales obejrzec go oscyloskopem ?

Moze juz dawno nie ma 120ns ...


J.


Re: FPGA, VHDL detekcja zbocza i problemy
WyglB1%da na to, BF%e zsynchronizowanie zewnEA%trznego sygnaB3%u poprzez
przerzutnik D zaB3%atwiB3%o sprawEA%:

signal dior_n:std_logic;

HDD_DIOR_N<3D%dior_n;

process(CLK)
begin
    if clk'event and clk3D%'1' then
          dior_n<3D%HOST_DIOR_N;
    end if;
end process;

i teraz w kolejnym procesie liczB1%c zbocza dior_n (tak jak w
poprzednich postach), mam wB3%aB6%ciwB1%
iloB6%E6.... Gdybym natomiast liczyB3% bezpoB6%rednio HOST_DIOR_N w proces=
ie
zaleBF%nym od
CLK to dalej siEA% krzaczy.

MoBF%e ktoB6% mi to z czystej ciekawoB6%ci racjonalnie wyjaB6%ni co dokB3%a=
dnie
siEA% dzieje, w ktF3%rym miejscu hazard, BF%e gubie zbocza gdy nie stosuje
przerzutnika?

pozdrawiam i dziekuje za zainteresowanie tematem

Re: FPGA, VHDL detekcja zbocza i problemy
Quoted text here. Click to load it

Sygnal z pina idzie do wiecej niz jednej bramki/przerzutnika. Jesli
wezmiesz pod uwage opoznienia propagacji (a moga byc mocno rozne dla
dwoch roznych sciezek sygnalu), to czesto wychodzi ze jeden blok widzi
zbocze Twojego sygnalu przed, a inny po zdarzeniu CLK. I cala logika
glupieje, bo to jest stan 'zakazany'. Przez 'zakazany' tutaj rozumiem
to, ze VHDL moze zachowac sie dowolnie - tego nic ani nikt nie sprawdza,
na to nie ma optymizacji, nic absolutnie (nawet nie musi sie poprawnie
zachowac w nastepnym okresie zegara). Wstaw se SignalTap i popatrz na
wariant bez i z przerzutnikiem (moze byc problem - to nie zawsze idzie
zobaczyc; a jak Signaltap zmodyfikuje uklad to moze nawet zaczac dzialac).

Jest to klasyczny przyklad przechodzenia miedzy dwoma domenami zegarowymi.


--
Jerry1111

Re: FPGA, VHDL detekcja zbocza i problemy


/.../
Quoted text here. Click to load it
/.../

moga wystepowac co najmniej 2 efekty, pierwszy opisal
KONOP - wielokrotne zliczanie, jesli impuls mierzony
ma okres dluzszy niz okres zegara mierzacego;
opis drugiego efektu znajdziesz w watku:
http://www.elektroda.pl/rtvforum/viewtopic.php?p60%16660&highlight=#6016660
ostatni post wraz z obrazkiem symulacji;
odsylam na elektrode, bo tam mozna zamieszczac obrazki,
ktore wyjasniaja o wiele wicej, niz pisaniana na p.m.e
J.A


Site Timeline