Witam! zastanawiam sie jak zrobic w VHDL 8-bitowy rejestr, ktory mozna podlaczyc do wspolnej trojstanowej szyny IO (szyna wewnetrzna w scalaku) ze strobem zapisu i odczytu? Chodzi o to, zeby przy wr=0 rejest zapamietywal to co jest na szynie, a przy rd=0 wystawial na szyne to co wczesniej zapamietal. Dla rw=rd=1 rejestr ma pamietac swoja zawartosc, jednak wyjscia maja byc w stanie wysokiej impedancji. Prosto zrobic latch, ale nie radze sobie jakos z rejestrem. Dzieki za wszelka pomoc i pozdrawiam, T.M.F.
VHDL - jak zrobic 8-bitowy rejestr
Jan 26, 2007
34 Replies
Nie zabardzo rozumiem w czym masz problem...
Przzeciez wewnatrz CPLD/FPGA nie ma czegos takiego jak szyna trojstanowa... trojstanowosc dotyczy tylko pinow zewnetrznych. A wiec wspolnieuzywane szyny danych robi sie tak, ze uzywasz duzego ORa do ktorego wejsc laczysz wyjscia urzadzen peryferyjnych ktore sa jak sa wybierane to steruja wejsciem ORa a gdy sa niewybrane to wystawiaja na swoje wyjscia logiczne zera...
A wiec zapis realizujesz przerzutnikiem DFF z wejsciem clock-enable podlaczonym do write i zegarem podlaczonym do zegara systemowego a wylot z tego 8-bitowego przerzutnika DFF podlaczasz do bramki AND2 ktorej jedno wejscie sterujesz sygnalem read (lub output-enable).
Jak dalej cos niejasne to pytaj smialo.
Ok, zasugerowalem sie implementacja czegos takiego na ukladach dyskretnych. W sumie tak jak piszesz to nawet bedzie wygodniej. Bo chodzi o stworzenie kilku rejestrow IO ktore beda czytane/zapisywane przez mikroprocesor poprzez szyne danych IO + 4 bity adresu wybierajacego rejestr do zapisu/odczytu. Dodatkowo dane z rejestrow beda sterowaly wewnetrznymi licznikami.
Zale¿y jaki uk³ad programowalny... Np. Stare Xilinx XC4000 i XC3000 mia³y mo¿liwo¶æ implementacji fizycznej wewnêtrznej szyny trójstanowej...
Mo¿na zrobiæ klasycznie: Tj. gdy rejestr odczytuje linie lub jest nieaktywny to na magistralê wystawiamy stan wysokiej impedancji; je¶li nie to wystawiamy na magistralê zawarto¶æ rejestru. Kompilator powinien sobie poradziæ z rozwik³aniem takiej sytuacji do takiej logiki jak± da siê wpasowaæ w danym uk³adzie programowalnym.
pzdr mk
I na czym ta "implementacja" polega³a ? Jaki sens w ogóle mo¿e mieæ wewnêtrzna szyna trójstanowa ?? Trochê mnie zawodzi wyobra¼nia - mo¿esz mi pomóc wyobraziæ sobie tak± sytuacjê w której przydaje siê taka szyna ?
Ja tam wolê u¿ywaæ w³asnego rozumu a nie kompilatora przy rozwik³aniu takich "sytuacji". Kompilator nie jest Twoim "soulmate" i mo¿e siê nie domy¶leæ o co Ci chodzi³o ;-)
Dokladnie taki sam jak zewnetrzna ?
Np jak podlaczyc wiele peryferii [na macrocelach zrobionych] do linii danych procesora - taz z makrocel zrobionego ? :-)
Ano istnieje takie ryzyko.
J.
No ale w³a¶nie wewn±trz scalaka nie ma takiej potrzeby...
Magistrala trójstanowa to twór wynikaj±cy z potrzeby uproszczenia siatki po³±czeñ pomiêdzy scalakami których koszt obudowy zale¿y w ogromnej mierze od ilo¶ci pinów. St±d wspólne sygna³y RD/WR, wspólna szyna adresowa i danych...
Wewn±trz kostki FPGA mo¿esz mieæ dzi¶ proca (np. NiosII Altery) jako mastera magistrali Avalon, którego pod³±czysz do wielu peryferiów (slave) na tej¿e magistrali i do ka¿dego urz±dzenia mo¿esz mieæ osobne linie adresowe, osobne linie danych do zapisu, osobne linie danych do odczytu i jego w³asne sygna³y read/write - nawet wtedy czipselektów w³a¶ciwie nie potrzeba... Zauwa¿, ¿e taki rejestr we/wy jest zwykle wykonany na prostych przerzutnikach (d-flip-flop DFF) a wiêc znatury rzeczy ma swoje wej¶cie i wyj¶cie danych osobno. A wtedy nawet sygna³ read jest zbêdny, bo dane wyj¶ciowe tam zawsze s±. Kombinowanie z ³±czeniem danych we i wy na jeden kabelek trójstanowy po to aby zaoszczêdziæ pin na obudowie nie ma sensu wewn±trz FPGA i siê tego nie robi.
Je¶li proca masz na zewn±trz FPGA i ma on ju¿ magistralê trójstanow± do innych potrzeb to oczywi¶cie Twój FPGA musi byæ kompatybilny, ale te¿ trójstanowa magistrala Ci jest potrzebna TYLKO na zewnêtrznych pinach FPGA, tych ³±cz±cych Ciê z procem. Wewn±trz, pomiêdzy ró¿nymi modu³ami/rejestrami ju¿ jest niepotrzebna. No chyba ¿e mi wyobra¼nia nie dopisuje... :-)
Do wewnêtrznych linii pod³±czone s± bufory potrafi±ce pracowaæ trójstanowo... có¿ tu siê wiêcej rozpisyswaæ... Linie s± podci±gane do stanu wysokiego rezystorami, albo zakoñczone uk³adem "weak keeper circuit". Szczegó³y:
formatting link
7-16, 7-17
Motywacj± zapewne by³a oszczêdno¶æ zasobów przy budowaniu np. multiplekserów.
Nastêpuj±ca sytuacja: Jest 8 ró¿nych ¼róde³ danych, które maj± byæ zapisywane do wspólnego rejestru. Oczywistym pomys³em jest zbudowanie multipleksera, którego wej¶cia s± pod³±czone do ¼róde³, a wyj¶cie do wspomnianego rejestru. Oprócz tego multiplekser ma wej¶cia wyboru ¼ród³a. Ile np. LE Cyclona trzeba zu¿yæ do zbudowania takiego multipleksera przy za³o¿eniu, ¿e multipleksujemy magistrale 64 bitowe?
Ile zasobów logicznych zosta³o by zu¿ytych, gdyby dysponowaæ mo¿liwo¶ci± sterowania trójstanowego wewnêtrznych magistral?
Jak siê nie domy¶li, to nie bêdzie wiedzia³ co zrobiæ i zakoñczy kompilacje. Np. Quartus kompiluj±cy dla Cyclona (który nie ma mo¿liwo¶ci o której mowa) bez problemu sobie z takimi sytuacjami radzi (wstawi multiplekser) i nie zu¿yje wiêcej zasobów ni¿ przy rêcznej rze¼bie. Wy¶wietli tylko ostrze¿enie, ¿e takich machinacji dokona³, a nie jest to zaimplementowane fizycznie.
pzdr mk
No wlasnie, chce zrobic tak, ze mam procesor polaczony z CPLD, w ktorym mam 16 rejestrow R/W, wyjscia tych rejestrow steruja licznikami (wewnatrz CPLD), tu nie ma problemu. Natomiast przy odczycie procesor wybiera jeden z 16 rejestrow, rozumiem, ze skoro nie moze byc buforow trojstanowych to robie 8 multiplekserow 16 wejsciowych (tak to bedzie zaimplementowane), ktorych wyjscia ida na linie trojstanowe D7-D0 dostepne na zewnatrz CPLD. Kierunek tych linii przelaczam zewnetrznym strobem zapisu i sygnalu wyboru ukladu. Dobrze rozumuje?
jesli chodzi o typowa architekture CPLD to i tak nie masz wyjscia i musisz zrobic jak powyzej. Nawiasem mowiac moze to nie wyjsc takie latwe i trzeba dwupoziomowy.
O ktorym CPLD myslisz, bo to juz dosc ambitne trzeba ?
J.
XC95144XL. 144 makrokomorki powinny wystarczyc, chociaz dla mnie istotniejsza jest ilosc pinow IO - to ma byc kontroler LCD.
Ilo bitowe te rejestry? Bo jesli 8-bitowe to (16 * 8 =) 128 przerzutników z 144 zostanie zuzytych tylko na rejestry...
pzdr mk
Ilu bitowe sa te rejestry? Bo jesli 8-bitowe, to (16 * 8 =) 128 przerzutników z 144 wszystkich zostanie zuzytych tylko na rejestry...
pzdr mk
Na szczecie czesc jest krotsza. No i multiplexery chyba z pozostalych bramek makroceli da sie zrobic? Zreszta zobacze co mi ISE na to powie. W sumie max CPLD jaki widze xilinxa w Kamami ma 288 makroceli, co do FPGA to wyraznie drozsze sa i chyba wszystkie wymagaja zewnetrznej pamieci konfiguracji?
Od tego zacznij. IMO - na 144 ci nie wyjdzie, 288 byc moze.
I tam jest jest jeszcze pare innych ograniczen - np function block ma 90 product term, a multiplekser 16 wejsciowy wymaga ich 16. Niby nie ma problemu, ale ty ich potrzebujesz 8 :-)
Od projektu trzeba zaczac.
Zobacz jeszcze oferte Altery.
J.
T.M.F:
[...]bardzo dobrym multiplekserem, pod pewnymi warunkami, jest po prostu wewnetrzny ram; przy wyborze jednego rejestru z 16 ram zaoszczedzi sporo logiki zwiazanej z multipleksowaniem; i bedzie szybszy;
JA
mk:
[...] [...]a jak sie domysli, ino zle ? zartuje :)
Ale on chce tymi rejestrami cos sterowac. A to oznacza klopot zwiazany z dostepem do magistrali :-)
J.
J.F:
nie, zapisuje wartosci do rejestrow i do ramu, rejestry steruja a pamiec sluzy do odczytu tego, co jest w rejestrach;
JA
A, no chyba ze tak.
Jeszcze mozna pomyslec zeby odczytu w ogole nie bylo, w koncu procesorek chyba wie co zapisal.
J.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required