Elektroda.pl
Elektroda.pl
X
IGE-XAO
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Detektor zbocza, CPLD i VHDL. Zaimplementowanie w XC9500.

05 Sie 2006 21:54 4855 16
  • Poziom 28  
    Próbuję stworzyć prosty detektor zbocza, który w zależności od stanu na jednym wejściu wystawia jedynkę na wyjściu po pojawieniu się na drugim wejściu opadającego bądź narastajacego zbocza sygnału. Napisałem coś takiego :
    Code:
    architecture BEHAVIORAL of zbocze1 is
    
    begin
    EDG:process(EDGE_IN, EDGE_SEL, EDGE_RST)
    begin
    if EDGE_SEL'event AND EDGE_SEL = '1' then
      if rising_edge(EDGE_IN) then
         EDGE_OUT <= '1';
       end if;
    elsif EDGE_SEL'event AND EDGE_SEL = '0' then
      if falling_edge(EDGE_IN) then
         EDGE_OUT <= '1';
         end if;
     end if;
    end process EDG;
    end BEHAVIORAL;

    jednak nie chce to działać poprawnie.

    W dziedzinie CPLD i VHDL jestem początkujący ;) Chciałbym to zaimplementować w XC9500.
  • IGE-XAO
  • Pomocny post
    Poziom 27  
    Spójrz, struktura typu:
    Code:

    if EDGE_SEL'event AND EDGE_SEL = '1' then

    Jest równoważna strukturze:
    Code:

    if rising_edge(EDGE_SEL) then

    Innymi słowy, Twój układ ma reagować, jeśli na wejściach EDGE_SEL i EDGE_IN pojawią się zbocza dokładnie w tym samym czasie. Jest to ogólnie możliwe, ale bardzo mało prawdopodobne.
    Zamiast
    Code:

    if EDGE_SEL'event AND EDGE_SEL = '1' then

    daj po prostu:
    Code:

    if EDGE_SEL = '1' then

    Wówczas poziomem na EDGE_SEL wybierzesz jak i na jakie zbocze układ ma reagować :)
  • Pomocny post
    Poziom 15  
    Witam !

    Zaquadnik napisał :
    Cytat:
    Innymi słowy, Twój układ ma reagować, jeśli na wejściach EDGE_SEL i EDGE_IN pojawią się zbocza dokładnie w tym samym czasie. Jest to ogólnie możliwe, ale bardzo mało prawdopodobne.


    Procesy mogą reagować tylko i wyłącznie na zbocze jednego sygnału, nie ma takiej możliwości żeby napisać proces dwu zegarowy.

    Pituś Bajtuś :
    Napisałeś właśnie proces dwu zegarowy jeden zegar to EDGE_SEL a drugi to EDGE_IN (czy to przeszło przez syntezę ?)
    Po kodzie który umieściłeś można się domyślić co chciałeś napisać. Nawet gdyby to przeszło przez syntezę to dostaniesz zatrzask bo sygnał EDGE_OUT zawsze przyjmuje wartość '1' i nie widać kiedy ma się zmienić na '0'.

    pozdrawiam
  • Poziom 15  
    Witam !

    Cytat:
    Chociaż z tego, co słyszałem, to jeśli FPGA jest wyposażony w przerzutniki DDR to da się zrobić proces z dwoma sygnałami zegarowymi.


    Proces może mieć tylko jeden sygnał zegarowy taka jest specyfika języka VHDL.

    A przerzutniki DDR to (na przykładzie spartana ) nic innego jak dwa przerzutniki taktowane, albo tym samym zegarem ale na jeden przerzutnik wchodzi zegar zanegowany , albo dwoma sygnałami zegarowymi przesuniętymi w fazie o 180 °. Wyjścia tych przerzutników wchodzą na multiplekser a wyjście tego multipeksera jest wyjściem przerzutnika DDR. Zaletą takiego zespołu jest to że działa tak jak przerzutnik aktywny na zbocze narastające i opadające, pomimo tego , że przerzutniki z których jest zbudowany są aktywne tylko na zbocze narastające.

    Pozdrawiam

    Dodano po 13 [minuty]:

    Witam !

    Zamieszczam prosty przykład procesu który ma dwa zegary

    Code:
     process(reset,clk1,clk2,D1,D2)
    
        begin
        if reset='0' then
        Q<='0';
        if clk1'event and clk1='1' then
        Q<=D1;
        if clk2'event and clk2='1' then
        Q<=D2;
        end if;
        end if;
        end if;
        end process;


    i to co mówi na ten temat syntezer


    Cytat:
    Analyzing Entity <zegary> (Architecture <behavioral>).
    ERROR:Xst:827 - C:/projektyVHDL/detektor/zegary.vhd line 24: Signal Q cannot be synthesized, bad synchronous description.


    Procesy wielozegarowe nie syntezują się.

    Pozdrawiam
  • Poziom 28  
    Dzięki za odpowiedzi. W tym problem, że gdy nie było 'eventów' przy EDGE_SEL to ISE własnie zgłaszał błąd "Signal EDGE_OUT cannot be synthesized, bad synchronous description." w pomocy jako rozwiązanie podane było właśnie dodanie tych eventów.

    Dodano po 1 [minuty]:

    Kod który zamieściłem w pierwszym poście przeszedł proces syntezy, ale w układzie już nie działa tak jak powinien.
  • IGE-XAO
  • Pomocny post
    Poziom 15  
    witam !

    Napisałem taki detektor :

    Code:
    library IEEE;
    
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    --  Uncomment the following lines to use the declarations that are
    --  provided for instantiating Xilinx primitive components.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity zegary is
        Port ( EDGE_RST : in std_logic;
               EDGE_IN : in std_logic;
               EDGE_SEL : in std_logic;
               Q : out std_logic);
    end zegary;

    architecture Behavioral of zegary is
    signal wy1,wy2 : std_logic;
    begin

       process(EDGE_RST,EDGE_IN,EDGE_SEL)
       begin
       if EDGE_RST='1' then
          wy1<='0';
        elsif EDGE_IN'event and EDGE_IN='1' then
           if EDGE_SEL='1' then
             wy1<='1';
          end if;
        end if;
       end process;

       process(EDGE_RST,EDGE_IN,EDGE_SEL)
       begin
       if EDGE_RST='1' then
          wy2<='0';
        elsif EDGE_IN'event and EDGE_IN='0' then
           if EDGE_SEL='0' then
             wy2<='1';
          end if;
        end if;
       end process;

       Q<= wy1 or wy2;

    end Behavioral;


    Działa on tak, że po wykryciu zbocza trzyma jedynkę tak długo aż przyjdzie reset i wtedy na nowo rozpoczyna wyrywanie zbocza. Wybór wykrywanego zbocza określa EDGE_SEL. Nie jestem pewien czy właśnie o to tobie chodziło, ale może się przyda.

    Pozdrawiam
  • Poziom 28  
    kierownik_kuli_ziemskiej napisał:
    witam !
    Napisałem taki detektor :
    [...]
    Działa on tak, że po wykryciu zbocza trzyma jedynkę tak długo aż przyjdzie reset i wtedy na nowo rozpoczyna wyrywanie zbocza. Wybór wykrywanego zbocza określa EDGE_SEL. Nie jestem pewien czy właśnie o to tobie chodziło, ale może się przyda.


    Dokładnie o to! Dzięki za pomoc :)

    Hmm mam teraz kolejny problem : gdy utowrzę sobie nowy 'element', wpiszę w niego ten kod, umieszczę na schemacie i podepne piny pod schemat, to nie chce działać. Jeśli piny podepne bezpośrednio pod VHDLa to działa... co robię źle?
  • Poziom 28  
    Ten detektor ma być częścią większego projektu, który w większości jest zbudowany z typowych elementów bibliotecznych (liczniki, komparatory, rejestry przesuwne) rozmieszczonych na schemacie, który jest "top module". Może robię to źle : Tools -> Symbol wizard; określam nazwy wejśc wyjśc itp. Następnie Tools -> Generate HDL template from symbol i wpisuję kod. No i nie działa. Po uczynieniu pliku .vhd Top module i przypisaniu w pliku .ucf do poszczególnych sygnałów odpowiednich pinów działa.
  • Poziom 17  
    Pituś Bajtuś napisał:
    Ten detektor ma być częścią większego projektu, który w większości jest zbudowany z typowych elementów bibliotecznych (liczniki, komparatory, rejestry przesuwne) rozmieszczonych na schemacie, który jest "top module". Może robię to źle : Tools -> Symbol wizard; określam nazwy wejśc wyjśc itp. Następnie Tools -> Generate HDL template from symbol i wpisuję kod. No i nie działa. Po uczynieniu pliku .vhd Top module i przypisaniu w pliku .ucf do poszczególnych sygnałów odpowiednich pinów działa.


    nie wiem jak to wyglada ale generalnie to nie tak sie wykrywa zbocza, robisz przerzutnik i bramke and z jednym wejscie zanegowanym, kazde zbocze tworzy impuls na wyjsciu. oczywiscie zegar musi byc conajmniej 2x szybszy od badanego sygnalu.


    W FPGA metoda projektowania ttl-i nie dziala, tu masz dedykowane i ograniczana liczbe wejsc zegarowych, wiec jak masz duzo instancji i wykrywasz duzo zboczy syngalow to tworza Ci sie internalne clocki (temat do przestudiowania), a to juz rozwali Ci wczesniej czy pozniej projekt.
  • Poziom 28  
    Generalnie mniejsza o to czy tak sie robi czy nie... ważne, że zachowuje się to tak jak tego oczekiwałem. Nie przewiduję narazie przejścia na FPGA, zwłaszcza że w CPLD stawiam pierwsze kroki... no i nie wiem jak przeskoczyć ten problem z umieszczeniem tego komponentu na schemacie :)
  • Poziom 17  
    Pituś Bajtuś napisał:
    Generalnie mniejsza o to czy tak sie robi czy nie... ważne, że zachowuje się to tak jak tego oczekiwałem. Nie przewiduję narazie przejścia na FPGA, zwłaszcza że w CPLD stawiam pierwsze kroki... no i nie wiem jak przeskoczyć ten problem z umieszczeniem tego komponentu na schemacie :)


    a sorki nie zwrocilem uwagi ze to CPLD, no to jeszcze bardziej hardcorowo, obejrzyj sobie jak to wyglada (po syntezie i po implementacji, zazwyczaj vendor ma jakies viewery), i czytaj logi, tam napewno bedzie pisalo ze cos jest nie tak.

    moj sposob dziala w kazdej kombinacji, ten u gory dziala tylko w pewnej specyficznej konfiguracji, to mialem na mysli piszac ze tak sie robi :P
  • Poziom 28  
    Jedyne co jest sygnalizowane podczas syntezy projektu z komponentem na schemacie to coś w stylu "unused signal xxx" czyli wychodzi na to, że coś pochrzaniłem przy łączeniu pliku *.vhd ze schematem. Czy może mi ktoś uprzejmy wyjaśnić krok po kroku jak komponent opisany w VHDL umieścić na schemacie?
  • Pomocny post
    Poziom 17  
    Pituś Bajtuś napisał:
    Jedyne co jest sygnalizowane podczas syntezy projektu z komponentem na schemacie to coś w stylu "unused signal xxx" czyli wychodzi na to, że coś pochrzaniłem przy łączeniu pliku *.vhd ze schematem. Czy może mi ktoś uprzejmy wyjaśnić krok po kroku jak komponent opisany w VHDL umieścić na schemacie?


    ten komunikat oznacza ze syntezer wyrzucil Ci sygnal, bo jest nieuzywany lub tez po optymalizacji nie ma sensu go trzymac, jakby Ci sie modul nie podpial to bylby komunikat unbound cos tam, wklej caly log to Ci powiem co jest nie tak.
  • Poziom 28  
    :) Nie wiem jak, ale wkońcu zadziałało mi to na schemacie :) Dziękuję wszystkim, którzy wypowiedzieli się w tym temacie, zwłaszcza Kierownikowi Kuli Ziemskiej ;) za kod detektora :)