2013-10-06 22 views
5

Z tego co rozumiem, wszystkie instrukcje wewnątrz PROCESU są wykonywane sekwencyjnie. Co dzieje się z przypisaniem sygnału współbieżnego (< =)? Czy działa tak samo jak sekwencyjne przypisanie (: =) czy wykonuje po opóźnieniu delty?Czy przypisanie sygnału (współbieżnego) w instrukcji procesu jest sekwencyjne czy współbieżne?

Jeśli wykonuje się po opóźnieniu delta, to w jaki sposób wszystkie instrukcje w PROCESIE można nazwać sekwencyjnymi?

Jeśli jest wykonywany natychmiast, to czy istnieje jakaś różnica między: = a < = w procesie?

Odpowiedz

7

Przypisanie sygnału (< =) jest wykonywane po wykonaniu całego kodu sekwencyjnego w procesach. To wtedy są wykonywane wszystkie aktywne procesy dla tego timestepu.

Jako przykład, dlaczego tak jest:

Załóżmy, że masz zdarzenie, które wyzwala 2 procesów. Te dwa procesy używają tego samego sygnału, ale jeden z nich zmienia wartość tego sygnału . Symulator może wykonywać tylko jeden proces w czasie ze względu na sekwencyjny model symulacyjny (nie mylić z równoczesnym modelem vhdl z ). Jeśli więc proces A zostanie zasymulowany jako pierwszy, a A zmieni sygnał, B będzie miał niewłaściwą wartość sygnału. Dlatego sygnał można zmienić tylko po wykonaniu wszystkich wyzwalanych procesów.

Przyporządkowanie zmiennych (: =) wykonuje się nieistniejąco i można je wykorzystać na przykład do: tymczasowo przechowuj niektóre dane wewnątrz procesu.

3

Sekwencyjne przydzielanie sygnałów (< =), w przeciwieństwie do sekwencyjnego przypisania zmiennych (: =), sekwencyjnie zestawia zdarzenie o jedną opóźnioną deltę później dla wartości sygnału do aktualizacji. Możesz zmienić zaplanowane wydarzenie, używając sekwencyjnego przypisania sygnału na tym samym sygnale w tym samym procesie. Zostanie wyświetlona tylko ostatnia aktualizacja zaplanowana dla określonego sygnału. Na przykład:

signal a : std_logic := '1'; --initial value is 1 

process(clk) 
    variable b : std_logic; 
begin 
    --note that the variable assignment operator, :=, can only be used to assign the value of variables, never signals 
    --Likewise, the signal assignment operator, <=, can only be used to assign the value of signals. 
    if (clk'event and clk='1') then 
    b := '0' --b is made '0' right now. 
    a <= b; --a will be made the current value of b ('0') at time t+delta 
    a <= '0'; --a will be made '0' at time t+delta (overwrites previous event scheduling for a) 
    b := '1' --b will be made '1' right now. Any future uses of b will be equivalent to replacing b with '1' 
    a <= b; --a will be made the current value of b ('1') at time t+delta 
    a <= not(a); --at time t+delta, a will be inverted. None of the previous assignments to a matter, their scheduled event have been overwritten 
    --after the end of the process, b does not matter because it cannot be used outside of the process, and gets reset at the start of the process 
    end if; 
end process; 

Ważne jest również, aby pamiętać, że podczas procesów sekwencyjnych działać kolejno z logicznego punktu widzenia w VHDL, kiedy syntetyzowane są one naprawdę przekształcony złożonych oświadczeń równoczesnych łączących klapki. Cały proces przebiega równolegle jako jednostka pomiędzy każdym cyklem zegara (procesy, które nie działają na zegarze, stają się czysto kombinacyjną logiką). Sygnały są wartościami, które są faktycznie przechowywane w klapkach. Zmienne są po prostu wygładzane, aby procesy były łatwiejsze do odczytania. Są one wchłaniane do logiki kombinacyjnej po syntezie.