logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[VHLD] synteza. Sekwencyjność procesu. Co robię źle?

pidorek 27 Cze 2010 18:34 1540 3
REKLAMA
  • #1 8237410
    pidorek
    Poziom 15  
    Posty: 131
    Pomógł: 20
    Ocena: 1
    Witam

    Problem który tu opiszę miałem już wielokrotnie, pewne jest że jest jakaś zasada/metoda opisu której nie znam. Najpierw przedstawię kod:

    	
    sHomPin <= HOMING_ST;
    
    process (sRST,sSTEPCNT(0),sHomPrev,sHomPin,sDIR)
    	begin
    		if (sRST = '1') then
    				sHOMINGcnt <= (others => '0');
    				sHomPrev <= not sHomPin;
    		elsif (sSTEPCNT(0)'event and sSTEPCNT(0) = '1') then
    			if (sHomPin /= sHomPrev) then
    				sHOMINGcnt <= (others => '0');
    			end if;
    
    			if (sDIR = '0') then
    				sHOMINGcnt <= sHOMINGcnt + '1';
    			else
    				sHOMINGcnt <= sHOMINGcnt - '1';
    			end if;
    			
    			sHomPrev <= sHomPin;			
    		end if;
    	end process;
    
    	process (sRST,CLK)
    	begin
    		if (sRST = '1') then
    ...
    		elsif (CLK'event and CLK = '1') then
    ...
    					sSTEP <= not sSTEP;
    					if (sDIR = '0') then
    						sSTEPCNT <= sSTEPCNT + '1';
    					else
    						sSTEPCNT <= sSTEPCNT - '1';
    					end if;
    				end if;
    ...
    			end if;	
    		end if;
    	end process;


    Drugi proces generuje mi impulsy i kierunek. W zmiennej sSTEPCNT mam licznik impulsów. Tam wszystko chodzi bez zarzutu. Błąd mam w pierszym procesie. Mam tam sygnał sHOMINGcnt, który muszę zerować na zmianę sygnału sHomPin . Oprócz tego dla procesu sygnałem zegarowym jest sSTEPCNT bo na jego zmianę ma się zmieniać też sHOMINGcnt. I niby w symulacji wszystko działa ale w układzie już nie, raz działa raz nie. DZiwne rzeczy tam się dzieją, czasami to wygląda jakby wogóle nie wykrył zmiany tego pinu, czasami jakby z opóźnieniem. Nie wiem jak to porządnie napisać. Zrobiłem teraz tak : if (sHomPin /= sHomPrev) a poniżej jest zatrzaskiwana poprzednia wartość zbocza (w C bym tak zrobił tu mi się to średnio podoba). Nie wiem czy sekwencyjność procesu tu dobrze działa. XST generuje mi warning:
    WARNING:Xst:646 - Signal <sHomPrev> is assigned but never used. This unconnected signal will be trimmed during the optimization process.
    a Synplify:
    @W: CL169 :"E:\Proj\Xilinx\stepdir\stepdir.vhd":70:2:70:3|Pruning Register sHomPrev
    @W: CL159 :"E:\Proj\Xilinx\stepdir\stepdir.vhd":30:5:30:13|Input HOMING_ST is unused

    Nie wiem jak to zrobić żeby syntezator wiedział o co mi chodzi, i co mu się nie podoba w moim zapisie. Proszę bardziej doświadczonych kolegów o pomoc.

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 8238550
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Podstawowy błąd - używasz sygnałów tak jak zmiennych, a to nie jest to samo.
    Napisz tak:
    
             if (sHomPin /= sHomPrev) then
                sHOMINGcnt <= (others => '0');
             else
                 if (sDIR = '0') then
                    sHOMINGcnt <= sHOMINGcnt + '1';
                 else
                    sHOMINGcnt <= sHOMINGcnt - '1';
                 end if;
             end if;
    
             sHomPrev <= sHomPin;         
    


    Najlepiej też przerób taktowanie w pierwszym procesie - sSTEPCNT i tak jest synchroniczny z zegarem CLK, więc wystarczy napisać
    
    if rising_edge(CLK) and sSTEPCNT(0) = '0' then
        -- w tym cyklu sSTEPCNT(0) zmieni wartość na '1'
        ...
    end if;
  • REKLAMA
  • #3 8238629
    pidorek
    Poziom 15  
    Posty: 131
    Pomógł: 20
    Ocena: 1
    Dzięki za odpowiedź. Pierwsza podpowiedź pomogła mi w wyeliminowaniu warningów z obu syntezatorów, jutro sprawdzę czy w praktyce coś to zmieniło :). Drugiej podpowiedzi (synchronizacja z CLK) nie mogę zastosować ponieważ w drugim procesie nie każda zmiana CLK powoduje zmianę STEPcnt. Nie widać tego tutaj bo nieistotne fragmenty kodu usunąłem (tam gdzie są ... są jeszcze sprawdzane różne warunki czy w tym cyklu wygenerować krok lub nie).

    Dr Vee czy możesz wytłumaczyć mi w czym Twój opis jest lepszy od mojego? Bo że jest lepszy to wiem, ale dlaczego łatwiejsza/logiczniejsza jest synteza Twojego opisu? Interesuje mnie jeszcze jedna sprawa. Jak są w praktyce generowane układy sekwencyjne w FPGA? Chodzi mi o zatrzaskiwanie np instrukcji sHomPrev <= sHomPin; po sprawdzeniu czy sygnały są identyczne lub nie? Czy to się odbywa na podobnej zasadzie jak pipelining? Ewentualnie czy znacie może jakieś interesujące materiały o zasadach opisu sprzętu? Jak pisać, czego unikać? To co widziałem do tej pory na stronie Xilinxa wydaje mi się mało wyczerpujące. Szczególnie interesuje mnie jak różne formy zapisu mają wpływ na wykorzystanie zasobów fpga.

    Pozdrawiam
  • #4 8241766
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    Na pewno możesz również synchronizować się z CLK - po prostu wygeneruj jeden sygnał, którego ustawienie powoduje zmianę stepCNT. Ten sam sygnał testuj w drugim procesie - sygnał powinien zostać zsyntezowany jako enable do przerzutnika.

    W moim opisie występuje tylko jedno przypisanie do sygnału sHomingCnt, ale co ważniejsze, wartość tego sygnału nie jest używana w tym samym procesie już po przypisaniu. Ale nie mogę wpaść na to jak syntezator uznał, że sygnał sHomPrev jest niepotrzebny...
REKLAMA