VHDL - mały problem

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.

Reply to
voices
Loading thread data ...

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...

Reply to
Heniu

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

Reply to
root

Przedstawiony

przeznaczeniem

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

Reply to
Heniu

...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.

Reply to
R.i.P.

(...)

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.

Reply to
Oshin

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

Reply to
root

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.

Reply to
J.F.

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

Reply to
R.i.P.

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.

Reply to
voices

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 :(

Reply to
voices

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

Reply to
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.

Reply to
R.i.P.

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ę ...

Reply to
voices

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

Reply to
voices

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

Reply to
R.i.P.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.