VHDL - jak zrobic 8-bitowy rejestr

Jan 26, 2007 34 Replies

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.


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