VHDL - mały problem

Jul 20, 2005 15 Replies

Witajcie,



Od bardzo niedawna uczę się VHDL'a (i trochę verilog'a). Natrafiłem na dziwny (dla mnie) problem, który zapewne wynika z braku zrozumienia jakiegoś banalnego faktu.



Platforma: Xilinx ISE 7.1i, CPLD: XC95144XL.



Przykładowy kod:



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



entity main is port( k: in std_logic; q: out std_logic ); end main;



architecture Behavioral of main is begin process(k) begin if(k='1') then q <= '1'; else q <= '0'; end if; end process; end Behavioral;


Do portu wejściowego "k" podłączony jest przełącznik, a do portu wyjściowego "q" dioda led. Kiedy przełączam przełącznik, dioda odpowiednio zapala się lub gaśnie. Wszystko działa jak powinno. Kiedy jednak blok "if' zmienię na następujący:



if(k='1') then q <= '1'; else q <= '1'; end if;



lub:



if(k='1') then q <= '0'; else q <= '0'; end if;



.. dioda nie świeci się (nawet, kiedy przełączam przełącznik, aby wywołać zdarzenie). Specjalnie próbowałem 2 wersje: z 0 i 1 aby wykluczyć możliwość złej polaryzacji itp.



Napisanie "q <= '0';" czy "q <= '1';" *zamiast* bloku "if" także nie zapala diody. Próbowałem też w innych miejscach kodu ...



Przedstawiłem najprostszą wersję programu, próbowałem już na różnych peryferiach, na różnych typach danych, nawet w verilog'u napisałem analogiczny program - za każdym razem to samo: Wyjściu przypisywany jest zadany stan tylko wtedy, kiedy przypisanie znajduje się w strukturze warunkowej dopuszczającej możliwość przypisania alternatywnej wartości.



Zupełnie nie rozumiem, czemu tak się dzieje. W jaki sposób mam zapalić diodę na stałe ? Czy takie "dziwne" zachowanie to cecha tych języków opisu sprzętu, czy np. konkretnie układów CPLD ?



Za wszelkie podpowiedzi będę bardzo wdzięczny.


Witaj,

Ja stawiam na to ze syntezer nie rozumie Twojej przerobki i wywalil uklad. Musisz zobaczyc jak to zostalo zaimplementowane (nie znam sie na Xilinx) bo byc moze przypisal wejscie i wyjscie a w srodku nic nie ma. Przedstawiony przez Ciebie uklad (zatrzask) nie istnieje w rzeczywistosci. Jesli chcesz przypisac wyjscie do danej wartosci to przypisz to na stale nie uzywajac deklaracji process() Pamietaj, ze vhdl i verilog sa jezykami opisu sprzetu i ich przeznaczeniem jest opisanie sprzetu a nie zachowania ukladu. Piszac w tych jezykach trzeba myslec inaczej. Najpierw wyobrazic (narysowac) sobie sprzet, ktory dana funkcje ma wykonywac, pozniej go opisac i na koncu sprawdzic czy zachowuje sie tak jak tego chcielismy na poczatku.

Pozdrawiam,

Heniek

Użytkownik "voices" snipped-for-privacy@zrgnyyvpenva.pbz.ROT13> napisał w wiadomości news:dbmik4$v8t$ snipped-for-privacy@portraits.wsisiz.edu.pl...

Sprawdziłem na wygenerowanym schemacie - wynika z niego, że dioda jest podłączana "bezpośrednio" do zasilania lub odpowiednio do masy .. niby powinno świecić ...

Przedstawiony

przeznaczeniem

Jak na stale podlaczona to moze sie mogla przepalic :) ...

...ciach

Witaj, Nie wiem czy zwróciłeś uwagę na pewien warning który się pojawia w tak zaimplementowanym układzie:

WARNING:Xst:647 - Input <k> is never used.

prawdopodobnie podczas syntezy wejście k jest nie brane pod uwage wogóle. Jeżeli chcesz "zapalić" q na stałe to po co process?

architecture Behavioral of test2 is begin q <= '1'; end Behavioral;

i powinno świecić ;). Pozdrawiam.

(...)

Tu jest oczywiste że Xilix "zestreamowal" - wywalil te sygnaly. "Rozumuje" on tak : Bez wzgledu na to co sie stane na wejsciu na wyjściu ma byc 1 dla pierwszego przypadku i 0 dla drugiego.

Jednym z rozwiazań (ale nie eleganckim bo tak na szybko) jest podłaczenie sygnału K do wejscia CLK (if rising_egdge(k)....) oraz wyjscia Q z przerzutnika do wejscia D przez inverter. - zwykła dwójka licząca...

wymaga to dodania wejścia CLK oraz zadeklarowania 'signal' , który bedzie "pamietał" wartość ....

W razie kłopotów pisz....

Pozdrawiam M.

Mnie też wydawało się, że powinna świecić ... Próbowałem poza procesem, próbowałem wszędzie. Nic nie rozumiem :)

Delikatnie protestuje - do opisu zachowania jak najbardziej sie nadaje. Majac opis zachowania mozna np przesymulowac jak sie ta czesc zachowuje w polaczeniu z wieksza caloscia.

A jak juz sprawdzimy ze specyfikacja zachowania jest dobra i wlasnie to chcemy osiagnac - to wtedy mozemy sie skupic nad realizacja zalozonych celow.

J.

Właśnie sprawdziłem na układzie xc9536xl i świeci.

A ja u siebie sprawdziłem i nie świeci.

Tutaj wrzuciłem logi, pinout i kod:

formatting link
i przypisuję q <= '0';, bo tak wynika z układu ( jest zasilanie-dioda-rezystor-pin_xilinxa). Dla pewności '1' też próbowałem. Jak wcześniej pisałem, układ jest sprawny, ponieważ kod jaki podałem w moim pierwszym poście powodował włączanie/wyłączanie led'a przełącznikiem ...

Dzięki za cierpliwość, mam nadzieję, że w końcu znajdzie się rozwiązanie.

Dzięki, ale mi nie chodzi tylko o zapalenie światełka, bo wtedy podłączył bym je bezpośrednio do zasilania :) Chciałbym zrozumieć, czemu tak się dzieje, i jak w przyszłości rozwiązywać takie problemy. Z diodą to tylko najprostszy przykład, bo konstrukcje typu:

if(k='1') then q <= "1010" & k; else q <= "1010" & k; end if;

.. gdzie k to wektor 5 bit powodują, że dioda podłączona do bitu przypisanego "k" prawidłowo zapala się i gaśnie, a diody podłączone do pozostałych bitów nie świecą się wogóle :(

voices napisał/a:

Witam, w VHDL napisałem ledwie ze 2 krótkie programy i raczej średnio się znam ale dziwi mnie troche ta konstrukcja, na liście wrażliwosci procesu masz sygnał k, proces czeka na zmianę k i wtedy wykonuje to co napisałeś, czyli w momencie zmieniania k sprawdza jaką wartość ma k. Jak dla mnie to jakbyś podłączył to samo na wejście d i zegarowe przerzutnika, ciężko stwierdzić co będzie się działo. Podejrzewam że ten kod działa przypadkiem, skoro chcesz po prostu by na Q było to co wchodzi na k to przypisz jeden do drugiego. Mam nadzieję że nie powypisywałem bzdur, ale tak mi to wygląda.

Pozdrawiam czerstwy

Sprawdziłem u siebie raz jeszcze wklejając dokładnie Twój kod i działa. Nie wiem sprawdź może jeszcze raz fit report bo xilinx lubi sobie zmienić piny do których przypisuje wejścia/wyjścia. Ja raz tak miałem, że zmieniłem kawałek mały w kodzie i nie mogłem dojść dlaczego nie działa a się okazało, że nie zrobiłem LOCK pins i xilinx sobie podurnił. Pozdrawiam.

Sprawdziłem, przypisane dobrze. Robiłem też lock pins - to samo :| No nic, dzięki za pomoc, nie będę ciągnął już tematu, odpocznę od tego trochę, możliwe, że na dniach spotkam się z kimś, kto "rzeźbi" w VHDL'u

- może coś podpowie, jak mu w praktyce zademonstruję ...

Zainstalowałem starszą wersję ISE WebPack'a, 6.3. I nagle zaczęło wszystko działać.

A no nie napisałem, że używam 6.3.03i. Cieszę się, że działa. Pozdrawiam.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required