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

Jak stworzyć pulsujący sygnał CLOCK w VHDL bez użycia 'wait for'?

pchela07 21 Paź 2011 18:06 3085 13
REKLAMA
  • #1 10050832
    pchela07
    Poziom 9  
    Posty: 17
    Ocena: 1
    Witam.
    Może najpierw wkleje kod:
    Kod: VHDL
    Zaloguj się, aby zobaczyć kod

    Chodzi mi o to żeby ten sygnał puls zmieniał się co np. 10 ns z 0 na 1 później na 0 itd.

    W skrócie chce żeby pulsował.

    wywala mi błąd:
    ERROR:HDLParsers:1015 - "D:/Nowyfolder/doadawainie/watch_sc/stmach_v.vhd" Line 22. Wait for statement unsupported.

    Czy jest w ogóle taka możliwość żeby w symulacji to działało?
    W sumie w symulatorze można podpiąć CLOCK'a do jakiegoś sygnału, ale ja chce to zrobić w kodzie. Mam nadzieję że w miarę jasno to przedstawiłem.

    EDIT:
    Symulacja działa, i faktycznie sygnał sie zmienia/pulsuje. Jednak przy syntezie wywala dalej błąd. Da się jakoś zrobić żeby błedu nie było?
  • REKLAMA
  • #3 10051315
    pchela07
    Poziom 9  
    Posty: 17
    Ocena: 1
    Chcę aby jakiś fragment syntetyzowanego układu generował przebieg sam z siebie.
  • #4 10052290
    Dave_PL
    Poziom 14  
    Posty: 65
    Pomógł: 14
    Ocena: 1
    Po pierwsze to poczytaj jakieś podstawy, bo ten kod wygląda fatalnie, a sam do końca chyba nie zdajesz sobie sprawy z tego co robisz.

    Po drugie wait nie jest syntezowalne.

    Po trzecie sygnał sam z siebie nie może się zmieniać. Potrzebna jest do tego jakaś domena czasowa lub jakiś inny sygnał.

    Po czwarte nie mieszaj std_logic_unsigned i std_logic_arith z numeric_std. Najlepiej używaj tylko tej ostatniej.
  • REKLAMA
  • #5 10052699
    KonusiK
    Poziom 12  
    Posty: 33
    Pomógł: 3
    Tak jak powiedział przedmówca napisał, wait nie możesz użyć w ciele architektury, gdyż dla syntezatora to nic nie znaczy. Nie możesz wskazać w logicznym układzie, żeby coś miało opóźnienie 10ns? Syntezer nie ma żadnych informacji o zegarze, a przecież od tego zależy częstotliwość działania układu. Poza tym, zadaniem syntezera jest stworzenie logicznego modelu, który odzwierciedlałby funkcjonalność. Nie istnieje model logiczny dla "wait".
    Niestety, bardzo często literatura nie wskazuje tego wystarczajaco dobrze.

    Dla Twojego zastosowania potrzebujesz użyć standardowego clock statement, wskazującego układ sychroniczny, sterowany zboczem zegara. I w zależności od częstotliwości zegara będziesz mógł przypisywać wartości do portów.

    I faktycznie poczytaj trochę literatury. Pooglądaj przykłady albo templety w swoim środowisku (templety Xilinxa są całkiem nieźle opisane).
  • #6 10060742
    pchela07
    Poziom 9  
    Posty: 17
    Ocena: 1
    Dzięki za podpowiedzi. Kod faktycznie jest kijowy ale wkleiłem, żeby zobrazować mniej więcej o co mi chodzi. Dopiero się uczę VHDL'a.

    KonusiK czyli co, muszę mieć fizyczny układ, żeby móc uzyskać te zmiany sygnałów co określony czas? Innej opcji nie ma tak?
    Zastanawiam się , bo niby wybieram na jakim układzie to ma działać więc myślałem że symulacja uwzględni np. częstotliwość zegara.

    Możesz bardziej opisać jak odwołać się do układu synchronicznego. Mam płytkę Virtex 5.
  • REKLAMA
  • #7 10062408
    Frantic89
    Poziom 11  
    Posty: 20
    Po prostu zrób dzielnik częstotliwości ! Wiem że na początku nic nie pomaga bardziej jak przykład więc zamieszczam:
    
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity dzielnik is
        Port ( CLK : in  STD_LOGIC; -- zegar wejsciowy np 100 MHz 
               CLK_10ns : inout  STD_LOGIC); -- zegar wyjsciowy 1Hz
    end dzielnik;
    
    architecture Behavioral of dzielnik is
    begin
    
    process(CLK)
    variable zmienna : integer range 0 to 100000000 := 0;
    begin
    if rising_edge(CLK) then zmienna := zmienna + 1;
    	if (zmienna = 100000000) then
    		CLK_10ns <= not CLK_10ns;
    		zmienna := 0; -- tutaj wartosc ktora musisz obliczyc aby bylo 10ns
    	end if;
    end if;
    end process;
    
    end Behavioral;
    


    Zakładam ze masz zegar zewnętrzny więc w linii "--tutaj wartosc ..." dzielisz zegar wejściowy na odpowiednią wartość !
  • REKLAMA
  • #8 10062590
    lss
    Poziom 21  
    Posty: 352
    Pomógł: 59
    Ocena: 20
    Frantic89 napisał:
    Po prostu zrób dzielnik częstotliwości ! Wiem że na początku nic nie pomaga bardziej jak przykład więc zamieszczam:
    Kod:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity dzielnik is
    Port ( CLK : in STD_LOGIC; -- zegar wejsciowy np 1 Hz
    CLK_10ns : inout STD_LOGIC); -- zegar wyjsciowy 10ns
    end dzielnik;

    architecture Behavioral of dzielnik is
    begin

    process(CLK)
    variable zmienna : integer range 0 to 100000000 := 0;
    begin
    if rising_edge(CLK) then zmienna := zmienna + 1;
    if (zmienna = 100000000) then
    CLK_10ns <= not CLK_10ns;
    zmienna := 0; -- tutaj wartosc ktora musisz obliczyc aby bylo 10ns
    end if;
    end if;
    end process;

    end Behavioral;


    Zakładam ze masz zegar zewnętrzny więc w linii "--tutaj wartosc ..." dzielisz zegar wejściowy na odpowiednią wartość !


    Bardzo ciekawy przykład... Ja bym raczej z niego nie skorzystał. Niech autor lepiej sam przeanalizuje co napisał... Pytanie do Frantic89. Jak działa dzielnik ??
  • #9 10062718
    Frantic89
    Poziom 11  
    Posty: 20
    lss napisał:
    Frantic89 napisał:
    Po prostu zrób dzielnik częstotliwości ! Wiem że na początku nic nie pomaga bardziej jak przykład więc zamieszczam:
    Kod:

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity dzielnik is
    Port ( CLK : in STD_LOGIC; -- zegar wejsciowy np 1 Hz
    CLK_10ns : inout STD_LOGIC); -- zegar wyjsciowy 10ns
    end dzielnik;

    architecture Behavioral of dzielnik is
    begin

    process(CLK)
    variable zmienna : integer range 0 to 100000000 := 0;
    begin
    if rising_edge(CLK) then zmienna := zmienna + 1;
    if (zmienna = 100000000) then
    CLK_10ns <= not CLK_10ns;
    zmienna := 0; -- tutaj wartosc ktora musisz obliczyc aby bylo 10ns
    end if;
    end if;
    end process;

    end Behavioral;


    Zakładam ze masz zegar zewnętrzny więc w linii "--tutaj wartosc ..." dzielisz zegar wejściowy na odpowiednią wartość !


    Bardzo ciekawy przykład... Ja bym raczej z niego nie skorzystał. Niech autor lepiej sam przeanalizuje co napisał... Pytanie do Frantic89. Jak działa dzielnik ??


    No cóż, błąd chyba tylko w komentarzu otóż powinno być: if (zmienna = 100000000) then -- tutaj wartosc ktora musisz obliczyc aby bylo 10ns

    EDIT: TU JEST OCZYWIŚCIE BŁĄD, przedstawiony kod w VHDL zamienia sygnał o T=10ns na sygnał o T=1s a nie odwrotnie
  • #10 10062769
    lss
    Poziom 21  
    Posty: 352
    Pomógł: 59
    Ocena: 20
    poczekaj... Ty chcesz dzielnikiem zrobić 10 ns z 1 Hz ?? Bo według tego kodu to wchodzi 1 Hz i na wyjściu masz 10 ns według twojego założenia. czy się mylę ?? tak to rozumiesz ??
  • #11 10062786
    Frantic89
    Poziom 11  
    Posty: 20
    pchela07 napisał:
    Chodzi mi o to żeby ten sygnał puls zmieniał się co np. 10 ns z 0 na 1 później na 0 itd.


    Tak to zrozumiałem!
  • #12 10062918
    lss
    Poziom 21  
    Posty: 352
    Pomógł: 59
    Ocena: 20
    No to ja to inaczej rozumiem bo to co dałeś w komentarzu czyli
    Cytat:
    CLK : in STD_LOGIC; -- zegar wejsciowy np 1 Hz
    to totalna bzdura z zegra 1Hz nie ma możliwości aby dzielnik dał ci 10ns. Wyjdźmy od początku. Na wejściu masz częstotliwość X i chcesz z niej otrzymać okres o czasie trwania 10 ns to masz trzy przypadki
    1) Częstotliwość X jest większa czyli jej okres jest mniejszy niż 10 ns. To wtedy stosujesz sobie dzielnik = licznik. Czyli X/liczba impulsów, próbek , czy tam sampli zliczona tak aby okres wynosił 10 ns. I to jest przypadek w którym stosuje się licznik.
    2) Częstotliwość X jest równa czyli okres X równa 10 ns czy tam X = 10 * 10 ^ -9. Wtedy nic z tym nie robimy tylko zgrywamy faze czy co tam nam potrzeba bufory czy nie.
    3) Częstotliwość X jest mniejsza od 10 ns. W tym przypadku nie dzielimy lecz mnożymy zegar. Używamy bloków specjalizowanych do tego!!!

    Cytat:
    if rising_edge(CLK) then zmienna := zmienna + 1;
    if (zmienna = 100000000) then
    CLK_10ns <= not CLK_10ns;
    zmienna := 0; -- tutaj wartosc ktora musisz obliczyc aby bylo 10ns
    end if;
    end if;

    Analizujemy twój przykład: okres zegara wejściowego mamy 1 Hz . Na każde zbocze zegarowe narastające o częstotliwości 1Hz zostaje dodana wartości do zmiennej o nazwie zmienna. Jeżeli wartość zmiennej osiągnie 100000000 to następuje negacja stanu na wyjściu. Czyli musisz odczekać 100000000 okresów aby dokonała się zmiana. Szybki rachunek zakładając że wypełnienie jest 50% to chcemy zero na wyjściu czekamy 100000000 impulsów gdzie każdy ma po jednej sekundzie czyli zero trawa 100000000s potem następne 100000000 impulsów aby się zmieniło nam na jedynkę czyli jedynka też trwa 100000000s reasumując to z twojego przykładu wychodzi że czas wyjściowy a raczej okres wynosi 100000000 + 100000000 = 200000000s. Jak wiesz f = 1/T = 1 /200000000= 0,000000005Hz. Wiec jak tu wychodzi nam 10 ns ??
  • #13 10062970
    Frantic89
    Poziom 11  
    Posty: 20
    Haha, faktycznie ! Pomylił mi się dzielnik z mnożeniem częstotliwości! lls masz faktycznie w pełni racje ! Oczywiście w moim przykładzie opisałem sytuacje odwrotną tzn. jak z 10ns zrobić 1s !

    Aby pomóc koledze a nie wspierać się, niech pchela07napisze jakim zegarem dysponuje na swojej płytce! :D
  • #14 10065283
    pchela07
    Poziom 9  
    Posty: 17
    Ocena: 1
    W czwartek napisze jaki zegar posiada płytka. Dziękuję za dotychczasowe podpowiedzi.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje sposobu na stworzenie pulsującego sygnału CLOCK w VHDL bez użycia instrukcji 'wait for', co prowadzi do błędu w kodzie. Odpowiedzi wskazują, że 'wait' nie jest syntezowalne, a sygnał musi być generowany w oparciu o zewnętrzny zegar. Proponowane rozwiązania obejmują stworzenie dzielnika częstotliwości, który przekształca sygnał zegarowy na pożądany okres. Użytkownik jest zachęcany do zapoznania się z literaturą oraz przykładami w środowisku Xilinx, a także do podania specyfikacji zegara na swojej płytce Virtex 5.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA