Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

vhdl problem

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---
vhdl problem

Postautor: michall » 21 lut 2006, o 12:12

Witam,

Jestem poczatkujacy w VHDL. Korzystam z zestawu uruchomieniowego ZL1PLD wydawnictwa BTC. Pisze prosty licznik ktory po nacisnieciu klawisza zwieksza swoja wartosc. Wartosc wyswietlana jest na wyswietlaczu LED. Oto kod:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity counter is port
(
plus: in bit;
w1: out std_logic_vector(6 downto 0)
);
end counter;

architecture operate of counter is
begin

DISPLAY: process
variable number: integer range 0 to 9;
begin
if(number=9) then
number := 0;
else
number := number + 1;
end if;

case (number) is
when 0 => w1 <= "1111110";
when 1 => w1 <= "0110000";
when 2 => w1 <= "1101101";
when 3 => w1 <= "1111001";
when 4 => w1 <= "0110011";
when 5 => w1 <= "1011011";
when 6 => w1 <= "1011111";
when 7 => w1 <= "1110000";
when 8 => w1 <= "1111111";
when 9 => w1 <= "1111011";
when others => w1 <= "1111111";
end case;
wait until plus='0';
end process;

end operate;


Cos tu jednak nie gra bo wartosci wyswietlane sa jak dla mnie nieco losowo :( Czy aby na pewno zmienne zachowuja swoja wartosc od jednego wywolania procesu do drugiego? A moze gdzies indziej robie blad?

Z gory dzieki za odpowiedz :)

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 21 lut 2006, o 12:42

Coz... na VHDL to sie zbytnio nie znam, nie analizowalem tez tego starterkitu (byc moze tam jest to eliminowane), ale pierwsze co mi sie nasuwa, to tzw. drganie stykow mikroswitcha, efekt bardzo czesto spotykany, mozna probowac eliminowac sprzetowo badz programowo. Upewnij sie ze pojedyncze jego (switcha) przycisniecie, jest odbierane naprawde jako pojedyncze, a nie seria kilku(set).

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 21 lut 2006, o 15:20

Ach, no tak... nie pomyslalem o tym. Dzieki za podpowiedz :)

[ Dodano: 21-02-2006, 17:12 ]
Hmm.. a ma ktos jakis pomysl/wskazowki jak zakodowac w VHDL eliminacje drgan przyciskow?

Toker
-
-
Posty:19
Rejestracja:29 lis 2004, o 00:39
Lokalizacja:Kraków

Postautor: Toker » 21 lut 2006, o 20:16

Jezeli zestaw ten posiada sygnal zegarowy to uzyj go do odmierzania czasu i sprawdzaj nacisniecie raz na jakis czas.

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 21 lut 2006, o 23:24

Otoz: uzyj do tworzenia sygnalu zegarowego SW2. Jego styki dolacz do zaimplementowanego w MAXie przerzutnika RS (NAND), z ktorego wyjscia wezmiesz sygnal zegarowy. W ten sposob zlikwidujesz drgania stykow, ktore niestety w naturze wystepuja. To tyle jesli chodzi o sprzet.
W opisie HDL zastosowales niepotrzbnie wyrafinowana konstrukcje ze zmienna integer, co powoduje, ze prosty projekt polyka sporo zasobow PLD. Spradzales jak to jest implementowane? Otoz na oko zrobiles licznik + dekoder, a syntezery znajduja cos takiego:
"# ROMs : 1
16x7-bit ROM : 1
# Adders/Subtractors : 1
4-bit adder : 1
# Registers : 2
7-bit register : 1
4-bit register : 1
"
Czyli maly komputerek ;-)), a wystarcza 4 przerzutniki dla licznika + prosty ROM jako dekoder.
Popatrz w przyklady z: http://www.kamami.pl/?id_prod=6301
Na poczatku mocno pomoze.
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 22 lut 2006, o 17:59

Dziekuje za odpowiedz :)

Ksiazke znam, dzieki niej w sumie zaczalem zabawe z VHDL. Wlasnie widze ten przyklad z wykorzystaniem biblioteki STD_LOGIC_UNSIGNED. To powinno zoptymalizowac kod.

Nie rozumiem jednak do konca idei tego sygnalu zegarowego. Wg ksiazki (str 199) styki przelacznika SW2 sa dolaczone do przerzutnika RS. To jak mam je dolaczyc skoro juz sa polaczone? :> Rozumiem ze tym sygnalem zegarowym mam sterowac process. Czy ten sygnal zegarowy jest jakims globalnym sygnalem ktory moge ot tak wykorzystac w kodzie? Jesli tak to jaka jest jego nazwa?

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 22 lut 2006, o 21:56

Styki SW2 sa dolaczone do wyprowadzen PLD, a nie przerzutnika, bo go nie zdefiniowales! Zeby tam sie znalazl, to musisz zapisac to gdzies w HDL. Rysunek 6.10 jest ilustracja sugerowanego rozwiazania takiego problemu (wykorzystywanego w projektach przykladowych) - jesli tak zrobisz, to bedzie dobrze, ale dobrze tez bedzie na wiele innych sposobow - sposb implementacji zalezy tylko od Ciebie!
Reasumujac: dopisz sobie przerzutnik RS (NAND, aktywne na wejsciu "0"), z ktrego wyjscia potaktujesz licznik i bedzie OK.
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 22 lut 2006, o 22:55

OK, dziekuje. Teraz wszystko jest jasne :)

[ Dodano: 23-02-2006, 19:18 ]
Mam jeszcze jedno pytanie. Tym razem o sygnal zegarowy. Jak to wyglada w EPM7128? Jest wewnetrzny? JEsli tak to czy jest do niego jakis dostep (zeby na przyklad odmierzac czas)? Do czego sluza piny GCLK1 i GCLK2? Czy moze do podlaczenia zewnetrznego sygnalu zegarowego?

Nie potrafilem sie doczytac jak to wyglada stad to moje bladzenie po omacku. Bede wdzieczny za wyjasnienie :)

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 24 lut 2006, o 02:43

Mam jeszcze jedno pytanie. Tym razem o sygnal zegarowy. Jak to wyglada w EPM7128? Jest wewnetrzny?

>> ZAWSZE jest zewnetrzny. Tylko w FPGA bywaja syntezery wewnatrz struktury.

JEsli tak to czy jest do niego jakis dostep (zeby na przyklad odmierzac czas)? Do czego sluza piny GCLK1 i GCLK2? Czy moze do podlaczenia zewnetrznego sygnalu zegarowego?

>> Dokladnie tak: sa to wyspecjalizowane linie dostarczajace sygnal do wejsc CLK przerzutnikow wewnatrz PLD. Sa one stosowane po to, zeby nie rozsiewac sygnalu synchronizujacego po liniach segmentowanych, co mogloby spowodowac rozmycie synchronizacji przy wiekszych czestotliwosciach taktowania.
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 24 lut 2006, o 20:56

Aha, czyli w ZL1PLD to dziala tak ze sygnal zegarowy generowany jest wewnatrz ukladu i jest wyprowadzany wyjsciem CLK_OUT do wejscia GCLK1, tak? Skad wiadomo jaka jest czestotliwosc tego sygnalu? Czy zawsze sygnal generowany wewnatrz ukladu bedzie dostepny na pinie 4 (CLK_OUT) tak jak na rys. 6.10? Bo w nocie katalogowej pin 4 to zwykly I/O...

Po co w ogole sa dwa sygnaly zegarowe GCLK1 i GCLK2? Mozna ustawic ze czesc wewnetrznych przerzutnikow PLD jest taktowana jednym sygnalem a czesc drugim? Jesli tak to w jaki sposob?

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 28 lut 2006, o 19:22

Aha, czyli w ZL1PLD to dziala tak ze sygnal zegarowy generowany jest wewnatrz ukladu i jest wyprowadzany wyjsciem CLK_OUT do wejscia GCLK1, tak?

>> Dokladnie tak.

Skad wiadomo jaka jest czestotliwosc tego sygnalu?

>> W konfiguracji z przelacznikiem Sw2 i wewnetrznym przerzutnikiem - zalezy wylacznie od szybkosci Twojego palca ;-)

Czy zawsze sygnal generowany wewnatrz ukladu bedzie dostepny na pinie 4 (CLK_OUT) tak jak na rys. 6.10? Bo w nocie katalogowej pin 4 to zwykly I/O...

>> To zalezy wylacznie od Ciebie, po prostu w zestawie zastosowano jedna z wielu mozliwych konfiguracji z wykorzystaniem globalnego zegara. Precyzyjna odpowiedz na pytanie: nie musi byc tak byc.

Po co w ogole sa dwa sygnaly zegarowe GCLK1 i GCLK2?

>> Po to, zeby oszczedzic zasoby logiczne CPLD.

Mozna ustawic ze czesc wewnetrznych przerzutnikow PLD jest taktowana jednym sygnalem a czesc drugim? Jesli tak to w jaki sposob?

>> Mozna, po prostu czesc sygnalow CLK przypiszujesz do jednego wejscia GCLK, czesc do drugiego (w Pin Assigments lub w edytorze schematow).
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 1 mar 2006, o 17:27

Hmm.. Napisalem wiec sobie taki krotki program zeby sprawdzic jak dziala taktowanie ukladu za pomoca przycisku SW2. Wyjscie CLK_OUT przypisalem do pinu 4 i... nie dziala :( Wyglada to tak jakby uklad byl taktowany za pomoca sygnalu generowanego wewnatrz PLD a nie za pomoca przycisku SW2. Czemu tak jest? :(

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity zegar is port
(
sw2no, sw2nc: in std_logic;
bitin: in std_logic;
clk_out: out std_logic;
w1: out std_logic_vector(7 downto 0)
);
end zegar;

architecture taktuj of zegar is
begin

process(bitin)
begin
if(bitin='1') then
w1 <= "01100000";
w1 <= "00001100";
else
w1 <= "10000000";
w1 <= "00010000";
end if;
end process;

process (sw2no, sw2nc)
begin
if(sw2no='0') then
clk_out<='1';
elsif(sw2nc='0') then
clk_out<='0';
end if;
end process;
end taktuj;

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 8 mar 2006, o 21:55

Podeslij mi kompletny projekt na priva.
Nie bardzo rozumiem ten fragment:
if(bitin='1') then
w1 <= "01100000";
w1 <= "00001100";
else
w1 <= "10000000";
w1 <= "00010000";
end if;

- co chesz osiagnac podwojnymi przypisaniami?
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 9 mar 2006, o 23:04

To jest caly kod, chcialem po prostu sprawdzic jak wyglada taktowanie ukladu za pomoca przycisku. Przez taktowanie ukladu rozumiem ze po nacisnieciu przycisku nastepna instrukcja w kodzie zostanie wykonana. Stad to podwojne przypisanie - chcialem zobaczyc najpierw jeden znak na wyswietlaczu a po nacisnieciu przysku kolejny. Ale to tak nie dziala. Czy to ma szanse w ogole dzialac? Troche strzelam bo nie rozumiem jak dokladnie dziala ten system zegarowy w tej alterze :( Moglbym prosic o wyjasnienie mi tego?

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 12 mar 2006, o 12:33

To jest caly kod,

>> Prosilem o projekt (lacznie z przypisaniami do pinow itp.

chcialem po prostu sprawdzic jak wyglada taktowanie ukladu za pomoca przycisku. Przez taktowanie ukladu rozumiem ze po nacisnieciu przycisku nastepna instrukcja w kodzie zostanie wykonana.

>> Kolego, VHDL jest jezykiem _opisu sprzetu_, a nie programowania. Oznacza to, ze nie piszesz programu lecz opiszujesz budowe (np. opisujac zachowanie, tzw. opis behawioralny) sprzetu. ZADNE instrukcje nie sa wykonywane. Syntezer w Twoim programie narzedziowym (np. Quartus) na bazie przygotowanego opisu przygotowuje uklad logiczny dzialajacy tak, jak wynika to z Twojego opisu. Z Twojego opisu (nie programie!) syntezer wyrzuci pierwsze przypisania, bo sa one maskowane przez drugie. Mogles ich nie wpisywac, wynik syntezy z nimi i bez nich bedzie taki sam (sprawdz sobie w edytorze RTL Viewer).


Stad to podwojne przypisanie - chcialem zobaczyc najpierw jeden znak na wyswietlaczu a po nacisnieciu przysku kolejny. Ale to tak nie dziala. Czy to ma szanse w ogole dzialac?

>> W zaden sposob.

Troche strzelam bo nie rozumiem jak dokladnie dziala ten system zegarowy w tej alterze Moglbym prosic o wyjasnienie mi tego?

>> Moze wpadnij do AVT, bo widze, ze via forum nie potrafie ;-)
Pzdr
PZb

michall
-
-
Posty:8
Rejestracja:21 lut 2006, o 10:31
Lokalizacja:---

Postautor: michall » 12 mar 2006, o 23:41

Rozumiem co to jest VHDL i do czego sluzy. Jak Pan napisal, na podstawie opisu tworzony jest uklad logiczny. Tylko ze synchroniczne elementy tego ukladu musza byc taktowane jakims zegarem, prawda? I z tego co zrozumialem do tego sluzy sygnal podawany na GCLK1 badz 2, czy tak? A moze to jest jakos inaczej zorganizowane? Bo pisalem juz opisy w ktorych nic nie robilem z wejsciami GLCK a uklad dzialal jak nalezy. Tego wlasnie nie rozumiem :(

Do AVT niestety wpasc nie moge, troche za daleko ;)

Piotr
Moderator
Moderator
Posty:468
Rejestracja:14 lut 2003, o 13:53
Lokalizacja:Warszawa
Kontaktowanie:

Postautor: Piotr » 14 mar 2006, o 23:07

Rozumiem co to jest VHDL i do czego sluzy.

>> Przemysl to, co napisalem: w tym "programie" nie sa wykonywane zadne "instrukcje"! Niestety opis, ktory zamiesciles + komentarz do niego sugeruje, ze traktujesz go jako program (czyli liste sekwencyjnie wykonywanych instrukcji), a tak nie jest.

Jak Pan napisal, na podstawie opisu tworzony jest uklad logiczny. Tylko ze synchroniczne elementy tego ukladu musza byc taktowane jakims zegarem, prawda? I z tego co zrozumialem do tego sluzy sygnal podawany na GCLK1 badz 2, czy tak? A moze to jest jakos inaczej zorganizowane? Bo pisalem juz opisy w ktorych nic nie robilem z wejsciami GLCK a uklad dzialal jak nalezy.

>> Globalne wejscia (zegarowe, zerowania, OE itp.) sa stosowane po to, zeby nie marnowac wewnetrznych zasobow polaczeniowych PLD przy budowie duzych automatow synchronizowanych sygnalami zegarowymi. Nic nie stoi na przeszkodzie, zeby z nich nie korzystac, ale w ten sposob czesc wewnetrznej logiki (w MAX7000 nie tylko zasobow stricte polkaczeniowych) jest wykorzystywane do propagowania sygnalu zegarowego.
W tak prostym projekcie sygnal zegarowym mozesz przekazywac z wyjscia przerzutnika RS do licznika/dekodera jak chcesz. Na pewno sie zmiesci.
Popatrz na dema z CD dolaczonej do ksiazki!
Pzdr
PZb

a_antoniak
-
-
Posty:651
Rejestracja:13 sty 2005, o 18:38
Lokalizacja:Krasnystaw
Kontaktowanie:

Postautor: a_antoniak » 14 mar 2006, o 23:29

Rozumiem co to jest VHDL i do czego sluzy.
... twierdzac jednoczesnie, ze wykonywane są "kolejne instrukcje w kodzie".

Ja np. wbijam gwoździe szczoteczką do zębów, oczywiście rozumiem przy tym doskonale, do czego ona sluzy :| ... Gdy sie walnie totalna bzdure, to warto sie do tego przyznac, bo dalsze twierdzenie, ze wszystko sie wie jest dosyc zalosne...

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości