Skocz do zawartości

FPGA i magistrala 5V


Elvis

Pomocna odpowiedź

Ostatnio postanowiłem pobawić się starym 8-bitowym komputerkiem. Jedna z pierwszych rzeczy, która przyszła mi go głowy to możliwość podłączenia FGPA do magistrali i przygotowanie własnego rozszerzenia.

Niestety problemem są poziomy napięć - zestawy FPGA, które mam używają 3.3V, a dawniej standardem było 5V. Niby Maximator ma konwersję opartą na układach TX0108E, ale w przypadku open-drain maksymalna częstotliwość pracy spada do 1.2MHz.

To prawie wystarczy, bo potrzebuję 2MHz i możliwości podpięcia do magistrali. Może ktoś z czytelników forum ma pomysł jak rozwiązać taki problem?

Link do komentarza
Share on other sites

Ostatnio postanowiłem pobawić się starym 8-bitowym komputerkiem. Jedna z pierwszych rzeczy, która przyszła mi go głowy to możliwość podłączenia FGPA do magistrali i przygotowanie własnego rozszerzenia.

Niestety problemem są poziomy napięć - zestawy FPGA, które mam używają 3.3V, a dawniej standardem było 5V. Niby Maximator ma konwersję opartą na układach TX0108E, ale w przypadku open-drain maksymalna częstotliwość pracy spada do 1.2MHz.

To prawie wystarczy, bo potrzebuję 2MHz i możliwości podpięcia do magistrali. Może ktoś z czytelników forum ma pomysł jak rozwiązać taki problem?

Cześć Elvis,

problem dla mnie także interesujący. To ograniczenie to z karty katalogowe, czy praktycznie pomierzone oscyloskopem? Czy zbocza są za mało strome, czy jakieś inne objawy?

BTW: co to za 8-bitowiec?

Pozdrawiam

Link do komentarza
Share on other sites

Ostatnio już trochę znudziły mi się migające diody na FPGA, szukałem czegoś co byłoby nieco ciekawsze. I wpadł mi w ręce stary Atari 65XE - od takiego cuda zaczynałem przygodę z programowaniem, więc sentyment pozostał. Pomyślałem więc, że może spróbować podłączyć FPGA i zobaczyć co z tego wyjdzie. Na razie nie robiłem pomiarów, ale częstotliwość pracy CPU wynosi 1.77MHz, dlatego napisałem co najmniej 2MHz.

Atari ma wyprowadzoną magistralę systemową poza obudowę, więc można byłoby podłączyć fpga bezpośrednio. Niestety konieczne jest dopasowanie poziomu sygnałów.

Link do komentarza
Share on other sites

Jeżeli jako "magistralę" rozumiesz to wszystko co wychodzi na złącze rozszerzeń typowego komputerka z tamtych czasów, to masz trzy rodzaje sygnałów:

- tylko wyjściowe (np. szyna adresowa, /RD, /WR lub E, R/W itp)

- tylko wejściowe (np. RDY, HOLD itp)

- dwukierunkowe.

Każdy z nich możesz potraktować inaczej, a możesz wszystkie zrobić na tych samych scalakach. Przede wszystkim dowiedz się, czy Twój komputerek akceptuje jako sygnały wejściowe poziomy 3.3V jako pewną jedynkę. Z zerem logicznym oczywiście nigdy problemu nie ma w żadną stronę. I tak, przy prędkościach nawet tych starych magistral (zegar kilka MHz, czas cyklu kilkaset ns) wszelkie drivery typu OC, które w sumie łątwo dopasować do dowolnego napięcia wyjściowego raczej odpadają. Na szczęście wynaleziono na to sposoby.

Pierwszy najprostszy, to używasz rodziny LVC zasilanej z 3.3V jako bufora. Coś takiego łyka 5V bez problemu jako jedynkę logiczną, ale na wyjściu zawsze daje poziomy 0V/3.3V. Jeżeli nie potrzebujesz inwersji możesz użyć np. 74LVC245 - to typowy przedstawiciel tego gatunku, dwukierunkowy transcevier magistrali. W najprostszym przypadku, gdy mówimy o sygnałach jednokierunkowych włączasz go na stałe jednym sygnałem (pin 19 = L) a kierunek pracy ustawiasz (także na stałe) drugim (jeśli pin 1 = H to przesyła z A do B). Podłączasz do wejść A wszystko to co przychodzi na poziomach 5V a po stronie B dostajesz (po paru ns) to samo tylko w standardzie 3.3V. Układ jest tani i dostępny od kilkunastu lat, ale niestety w drugą stronę nie działa tak fajnie. I daletgo tak ważne jest byś wiedział czy komputerkowi wystarczy 3.3V. Jeżeli nie, w drugą stronę (3.3V na 5V) możesz użyć zwykłej rodziny HCT. Np. ten sam transceiver, ale tym razem w wersji 74HCT245 zasilany z 5V łyka 3.3V jako pewną jedynkę (to "T" w nazwie jest kluczowe) a na wyjściu daje oczywiście swoje Vcc czyli 5V. Tego możesz użyć do konwersji sygnałów jednokierunkowych "w górę".

No i na koniec zostaje magistrala danych. Jeżeli chcesz nią zarówno pisać do FPGA i coś przez nią czytać, musisz zrobić konwersję w dwie strony jakimś buforem sterowanym odpowiednim sygnałem wypracowanym z adresów i sygnałów sterujących. Gdyby komputerkowi wystarczyło 3.3V, sprawę załatwiłby 74LVC245 włączany i "ukierunkowywany" sygnałem z FPGA, ale jeśli nie (lub jeśli wolisz mieć pewność), możesz zrobić dwojako:

- dwa bufory równolegle: jeden LVC do transmisji Atari -> FPGA i drugi HCT do przesyłania w przeciwną stronę

- jeden bufor z pełną translacją napięć, np. 74LVC8T245 - końcówka wskazuje na typowy transceiver 8-bitowy, ale scalak montowany jest w większej obudowie i ma dwa niezależne zasilania 🙂 więc każda strona pracuje w swoim własnym standardzie tak jako wejście jak i wyjście.

Jest jeszcze parę innych tego typu układów (np. registered transceivers), ale 245 są najbardziej typowe i wygodne, wszystkie sygnały wchodzą po jednej a wychodzą po drugiej stronie. Masz też 244, 240, 241, poszukaj, jest tego trochę.

Do konwersji pojedynczych sygnałów z 5 na 3V możesz użyć malutkich, 74LVC2G17 lub nawet odwracających 74LVC1G14 czy 6-krotnego 74LVC04, przecież FPGA wszystko jedno.

W drugą stronę, 3V na 5V, jednokierunkowo sprawdzą się także zwykłe bramki HCT choćby 74HCT04 zasilane z 5V.

  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ostatnio już trochę znudziły mi się migające diody na FPGA, szukałem czegoś co byłoby nieco ciekawsze. I wpadł mi w ręce stary Atari 65XE - od takiego cuda zaczynałem przygodę z programowaniem, więc sentyment pozostał. Pomyślałem więc, że może spróbować podłączyć FPGA i zobaczyć co z tego wyjdzie. Na razie nie robiłem pomiarów, ale częstotliwość pracy CPU wynosi 1.77MHz, dlatego napisałem co najmniej 2MHz.

Atari ma wyprowadzoną magistralę systemową poza obudowę, więc można byłoby podłączyć fpga bezpośrednio. Niestety konieczne jest dopasowanie poziomu sygnałów.

Cześć Elvis,

ja zaczynałem od ZXSpectrum a drugi był Atari800XL (oba w szkolnej pracowni informatycznej). To trochę lipa, że do Maximatora zostały użyte "wolne" konwertery poziomów napięć. Może jak zrobisz pomiary, okaże się, że dają radę przy tej częstotliwości.

Pozdrawiam

  • Lubię! 2
Link do komentarza
Share on other sites

marek1707, czy 74LVC245 zasilany z 3.3V akceptuje na wejściu 5V?

Dzisiaj trochę szukałem informacji i właśnie 74x245, 74lvc8t245 oraz TXS0108E znalazłem jako rozwiązanie.

Ostatni, czyli TXS0108E jest dostępny w postaci modułów Adafruit, SparkFun itp, ale nie wiem czy można go używać w trybie pushpull dla magistrali danych.

Do 74LVC254 najbardziej zraziły mnie zakresy napięć na wejściach - ale jeśli toleruje 5V przy zasilaniu 3.3V to chyba najlepsza opcja.

Znalazłem też SN74LVC8T245, który pomijając cenę wymaga zaprojektowania płytki (a nie bardzo mam na to teraz czas). Chciaż nie wiem, czy to nie najlepsza opcja.

FlyingDutch, może one nawet nie są takie wolne, ale nie jestem pewien czy mogę je używać w trybie push-pull.

Popatrzyłem dokładniej na schemat i widzę, że wejście OE i tak maja na stałe podłączone. Więc powstaje pytanie, czy TXS0108E można używać w trybie push-pull i sam wykryje kiedy ma nie psuć danych na magistrali? Nie do końca rozumiem ja to miałoby działać niestety 🙁

  • Lubię! 1
Link do komentarza
Share on other sites

Jak chodzi o to co mam obecnie: to po pierwsze rozmontowane Atari - kupiłem specjalnie do zabawy, ale chciałbym się chwilę pobawić zanim popsuję. Pooglądałem trochę sygnałów oscyloskopem, próbowałem odszukać dokumentację - z tym jest bardzo kiepsko. W kazdym razie mam dostęp do całej magistrali mikroprocesora oraz układów graficznych.

Natomiast po stronie FPGA mam właściwie dwie opcje - płytka FPGA Maximator: http://maximator-fpga.org/wp-content/uploads/2016/02/MAXimator-board.pdf posiada wspomniane translatory TXS0108E, ale i tak za mało pinów, żeby więcej się pobawić.

Druga i ciekawsza opcja to właściwie każda inna płytka ewaluacyjna z FPGA na pokładzie. Dzięki temu do dyspozycji jest spora liczba pinów i można spokojnie obsłużyć magistralę Atari.

Zależy mi tylko (albo aż) na bezkolizynym podłączeniu FPGA - po prostu chciałbym się przy okazji zabawy trochę nauczyć, a zarówno podłączenie 5V bezpośrednio do FPGA, jak i konflikt na liniach Atari pewnie zabawę zakończy.

Magistrala nie jest buforowana, zabezpieczona itd. Więc ważne jest zachowanie czasów dostępu, ale dzisiaj 1.77MHz to tyle co nic, druga sprawa to dopasowanie napięć i ew. konflikty, których należy zawsze unikać.

Chyba spróbuję użyć 74lvc245 - nie wiem dlaczego ale byłem przekonany że nie tolerują >Vcc na wejściu. Ale skoro 5V im nie straszne to chyba najłatwiejsza opcja na początek. Jak nie zadziała to będę się męczyć z SN74LVC8T245.

Do "automatycznego" wykrywania kierunku i tak nie miałem zaufania. Wszystko co automatyczne jest problematyczne, nie ma to jak proste i sprawdzone metody 🙂

W każdym razie dziękuję za pomoc.

Link do komentarza
Share on other sites

Po prostu zacznij od połączenia pasywnego, czyli dołączenia prostego portu wyjściowego. Nie wiem co tam planowałeś robić docelowo, ale dospawanie rejestru w przestrzeni adresowej pamięci lub I/O nie wygląda jakoś strasznie trudno. Po zbuforowaniu (LVC) wszystkich potrzebnych sygnałów sterujących i adresów, szynę danych puść przez bufor ustawiony na sztywno (sygnałem DIR) tylko na kierunek Atari -> FPGA. Nic wtedy na pewno nie popsujesz a jeśli wszystkie bufory umieścisz na małej płyteczce podłączonej bezpośrednio do gniazda rozszerzeń, nawet nie wprowadzisz dużych pojemności na w sumie dość słabe linie komputerka. Niech PFGA dekoduje operację zapisu pod pewien ustalony przez Ciebie adres znajdujący się w wolnym/nieużywanym obszarze i zmuś procesor komputerka do wykonania tam zapisu. Na pewno w jego BASICu jest do tego odpowiednia instrukcja. Jeśli "złapiesz" w FPGA wysłany bajt, pierwszy sukces masz za sobą.

Jakie dalsze plany? Dodatkowy procesor video HDMI? Generator dźwięków? Sprzętowa obsługa wyświetlacza TFT? 🙂

Te stare magistrale były skrajnie proste. Opierały się na dwóch standardach: albo "8080" czyli sygnały /RD i /WR albo "6800" czyli kwalifikator/zegar E (czasem SYNC) i kierunek R/W. Obie miały oczywiście równolegle puszczone adresy i dane. Czasem do tego dostawałeś sygnał mówiący o tym kto akurat korzysta z magistrali, bo czasem do pamięci dobierał się generator video (odwieszając procesor w stan HOLD) a czasem procesor. Wszystko było widać jak na dłoni 🙂

Atari oczywiście było zrobione na standardzie szyny "6800", bo od początku bazowało na MOS Technology 6502, nie miało więc odrębnej przestrzeni portów I/O tylko jeden ciągły obszar pamięci 64K.

Gdybyś chciał dowiedzieć się naprawdę dużo o sposobach działania i interfejsów starych procesorów, polecam cegłę "Projektowanie systemów mikroprocesorowych" Klingmana plus oczywiście dokumentację samego procka, w tym przypadku 650x:

http://archive.6502.org/datasheets/rockwell_r650x_r651x.pdf

Link do komentarza
Share on other sites

Nie mam planów docelowych - prawdę mówiąc to moje plany były zupełnie inne, chciałem poćwiczyć robienie własnych komponentów IP w oparciu o AHB i TrustZone, bo to akurat w pewien sposób łączy się z moją pracą.

Natomiast Atari to tylko i wyłącznie hobby, magistrala łatwiejsza niż APB, ale za to można ją dotknąć, pogłaskać, zobaczyć. Nie mam większych planów, chociaż trochę mnie korci uruchomić Linuxa z 1GB pamięć i zmapować obszar adresowy FPGA do Atari - do tego napisać sterownik standardowego framebuffera i na Atari mieć obraz z linuxa... ale czy mi się będzie chciało to zobaczymy. Na początek myślałem jak połączyć 3.3V z 5V przy nieco wyższych wymaganiach czasowych, ale chyba już wiem wszystko teraz trzeba poczekać na części i można bawić się dalej. Bo atari to tylko zabawa, ale komponenty z TZ to już trochę bardziej praca 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

"zmapować obszar adresowy FPGA do Atari - do tego napisać sterownik standardowego framebuffera i na Atari mieć obraz z linuxa"

Tego zupełnie nie zrozumiałem. W przypadku Atari to komputerek i tylko on jest masterem magistrali. Nie możesz niczego z zewnątrz wymusić i np. przez złącze rozszerzeń (lub cartridge'a) wpisywać coś do pamięci video. Możesz tylko biernie czekać na cykl odczytu i podawać dane lub na cykl zapisu i zatrzaskiwać dane. Wszystko to dzieje się pod kontrolą programu wykonywanego przez 6502 i mimo ciągłej pracy magistrali (bo korzysta z niej wiele układów, oczywiście niejednocześnie) Ty reagujesz tylko na cykle w których uaktywniają się dostarczone Ci dwa-trzy sygnały sterujące.

Ale w sumie na Linuxie się nie znam więc może coś źle myślę..

Link do komentarza
Share on other sites

W przypadku Atari są dwa układy typu master - pierwszy to Antic, czyli układ generujący obraz, to trochę przerośnięte DMA (programowalny, 4-bitowy procesor), drugim układem jest 6502C czyli główny mikroprocesor. Antic potrafi wstrzymywać pracę procesora i w ten sposób unika się konfliktów na magistrali.

Mi chodziło o slave-a, który będzie udostępniał pewien bufor danych. Ale ten bufor może być jednocześnie dostępny dla drugiego master-a zaimplementowanego w FPGA np. Nios2, albo dostępnego jako gotowy rdzeń (HPS, Cortex-A9). Na takim rdzeniu można zaimplementować koprocesor, albo i pełny system jak chociażby wspomniany Linux.

Ponieważ oba układy dzielą wspólną przestrzeń / bufor, Linux można potraktować jako mega- koprocesor, który np. załaduje szybko pliki przez sieć, czy też przygotuje bufor danych obrazu.

Tak jak wspominałem, to tylko hobby, nie mam więc sztywnych planów, harmonogramów itd.

  • Lubię! 1
Link do komentarza
Share on other sites

Dobra, piszemy w gruncie rzeczy to samo. Nie ważne ile jest masterów na szynie komputerka, i tak nie wiesz kto akurat z niej korzysta. Natomiast z punktu widzenia złącza rozszerzeń musisz być slave'em. A Twoja koncepcja polega na wyniesieniu pamięci wielodostępnej do FPGA.

Na początku zrozumiałem, że chcesz ładować coś do pamięci Atari, ale jeśli po prostu zmusisz je do odczytu zewnętrznego obrazu to OK. W sumie to typowy pomysł.

Nawiasem mówiąc nie wiem czy wiesz, że można kupić osobne kostki będące synchronicznymi lub asynchronicznymi pamięciami dual-port-RAM. Stosowałem takie myki jakieś -naście lat temu, gdy FPGA były drogie i miały mało pamięci a trzeba było połączyć np. dwa szybkie procesory lub wołowatego PC/ISA z mocno zajętym DSP. Taki bufor sterowany prostym PLD załatwiał sprawę komunikacji dwukierunkowej. Kiedyś to było 1 lub 2Kbajty i wszyscy byli szczęśliwi, ale teraz są dużo fajniejsze 🙂

https://www.idt.com/products/memory-logic/multi-port-memory

A do komunikacji raczej jednokierunkowej za to pozbawionej problemów adresowania masz FIFO. Dzisiaj synchroniczne, 200MHz, 1Mx9 jest zupełnie spokojnie kupowalne. Ostatnio używałem podobnych w samplerach sygnałów radarowych. Od strony Atari taki mechanizm może być dużo wygodniejszy (nawet wbudowany w FPGA), bo nie trzeba przesyłać adresów:

https://www.idt.com/products/memory-logic/fifo-products/synchronous-fifos/72t18125-512k-x-18-1m-x-9-terasync-fifo-25v

Robisz wtedy jeden port sterujący i jeden port "danych" przez który widzisz początek lub koniec FIFO. Po inicjalizacji takiej rury (i ew. napełnieniu jej danymi od strony FPGA) procesor komputerka może już z pełną prędkością wysysać lub ładować tam dane bez upierdliwego uaktualniania adresów pamięci w innych rejestrach I/O.

  • Lubię! 1
Link do komentarza
Share on other sites

Pomysł z 74lvc245 jest chyba bardzo dobry, ale na razie mam problem i nie bardzo pomysł jak go rozwiązać. Na początek chciałem uniknąć projektowania własnej płytki PCB, więc przylutowałem złącza goldpin do płyty Atari. Dzięki temu bez problemu podłączyłem analizator i przebieg sygnałów wyglądał wręcz idealnie.

Kolejny krok to podłączenie 74lvc245 - na początek w jednym kierunku, czyli Atari -> FPGA i na płytce stykowej. Niestety przebiegi na analizatorze po przejściu przez 74lvc245 wyglądają koszmarnie 🙁 myślałem, że to błąd pomiaru, ale podłączyłem FPGA i nadal jest źle. Filtrując cyfrowo, czyli ignorując wszystko poza impulsami o oczekiwanej szerokości widzę że układ działa, tzn działa przez chwilę, bo po sekundzie i tak zakłócenia zmieniają zapisywane wartości.

Może ktoś na forum będzie miał pomysł co robię źle i dlaczego nagle pojawiło się tyle zakłóceń?

Link do komentarza
Share on other sites

Stare układy miały słabe drivery wyjściowe a to skutkowało małą obciążalnością. Często chcąc podłączyć do procesora kilka chipów pamięci żeby chociaż zapełnić całą jego przestrzeń adresową, powiedzmy 16Kbajtów EPROMu w dwóch kostkach po 8K i 48K statycznego RAMu w 7 kostkach po 8K musiałeś wstawiać po drodze bufory TTL. Choćby właśnie i 74245, oczywiście nie LVC bo takich wtedy nie było.

Po pierwsze: Nie wolno więc przedłużać starych magistral drutami poza płytę główną. Pokaż jak to fizycznie zrobiłeś lub narysuj z wymiarami. Bufor musi być najwyżej kilka cm od złącza, dalej to już hazard.

Po drugie: masa. Bufor widzi sygnały względem swojej masy a ta, jeśli została puszczona jednym kabelkiem takim samym jak pozostałych np. 8 sygnałów szyny danych to jest obciążona 8 razy bardziej. Pamiętaj, że każdy sygnał musi którędyś wrócić. I to którędyś to masa. Skorzystaj ze wszystkich mas jakie są na złączu Atari i połącz je możliwie najkrótszymi i najgrubszymi kablami z masą stykówki.

Po trzecie: odkłócanie zasilania. Płytka stykowa to porażka z zasady a układy cyfrowe na płytce stykowej to już porażka^2. Każdy bufor musi mieć obowiązkowo swój ceramiczny 100nF tuż obok plus z 10uF na całą płytkę.

Jeśli nie masz oscyloskopu (naprawdę?), zapnij się masą sondy analizatora do masy tuż obok bufora i względem niej oglądaj sygnały do niego wchodzące. Jeśli już tam jest źle, to masz problem po stronie szyny Atari: za długie kable lub i/zła masa. Jeśli tylko po wyjściowej: zasilanie bufora. Pamiętaj, że analizator ma wejścia cyfrowe i punkt "przełamania" stanów 0/1 powinien być inny po stronie 5V a inny po stronie 3V. Możesz to jakoś zmieniać?

Szyny adresów i danych mogą być zasyfione, ważne są sygnały kwalifikujące czyli w tym przypadku jakieś zdekodowane Read lub Write plus ew. zegar magistrali. To one mają być OK i podczas ich aktywności na szynie ma być stabilnie.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.