Autor Wątek: Procesor  (Przeczytany 7906 razy)

Antrykot

  • Gość
# Kwiecień 15, 2006, 10:49:41
Z nudów zrobiłem w 0.5h prosty procesor w VHDLu, działa na układzie Spartan 3 :) Jak ktoś chce sobie poczytać źródła, to daję:

http://agentj.kewlnet.int.pl/wysypisko/zassij.php?fn=proc1.zip

Wbudowany program wyświetla 8 na wyświetlaczu LED. Lepszy procesor już w drodze :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 15, 2006, 11:01:36
W sumie dużo z tych źródeł dla zwykłego zjadacza chleba nie wynika (w zasadzie to nie potrafię nawet powiedzieć, które to źródła, a które to pliki wynikowe), więc fajnie by było, gdybyś pokrótce przedstawił specyfikację tego procka (lista rozkazów, wielkość i architektura pamięci, szybkość, itp). :)

Antrykot

  • Gość
# Kwiecień 15, 2006, 11:17:52
procesor posiada:
- 4 rejestry 8 bitowe a,b,c,d
- 2 rejestry 16 bitowe x,y
- 3 rejestry: pc, lr, sp - 16bit
- i0vec - wektor przerwania 0
- we/wy do pamięci RAM, 64KB, magistrala danych 16 bitowa
- 1 wejście przerwania
- port we/wy (adres i wartość 16 bitowa)
źródła są w plikach .vhd.
- taktowanie 25MHz
- 2 lub 3 cykle zegarowe na rozkaz

clk_gen.vhd - dzielnik częstotliwości (z 50MHz robi 25MHz)
ctrl_unit.vhd - jednostka wykonawcza
lcd_ctrl.vhd - port wyświetlacza LED
mem_ctrl.vhd - dekoder adresów
prog_mem.vhd - symulowana pamięć ROM z programem
reset_gen.vhd - generator impulsu !RESET
top_sch.vhd - schemat główny procesora http://agentj.kewlnet.int.pl/wysypisko/zassij.php?fn=top_sch.pdf

Zaimplementowane rozkazy:
lda #imm8, ldb #imm8, ldc #imm8, ldd #imm8 - załadowanie a,b,c,d bajtem
ldx #imm16, ldy #imm16 - załadowany x,y 16 bitowym słowem
st @(x+delta),a  - zapis a do adresu określonego w rejestrze x + delta 8 bit bez znaku
st @(y+delta),a  - zapis a do adresu określonego w rejestrze y + delta 8 bit bez znaku
powyższe 2 operacje dla rejestrów a,b,c,d
ld a,@(x+delta)
ld a,@(y+delta)
jmp rel8 - skok względny - 8 bitów ze znakiem
ld pc,x - skok pod adres w x
ld pc,y - skok pod adres w y
ld pc,lr - powrót z przerwania
add {a,b,c,d},#imm8
sub {a,b,c,d},#imm8
out {a,b,c,d},x  - wyślij rejestr do portu o numerze w x

Operacji jest tylko tyle. Więcej będzie w procesorze v2, bo zmieniam architekturę, żeby ALU używało multiplekserów, bo na razie jest zakodowana obsługa każdego rozkazu osobno :)

« Ostatnia zmiana: Kwiecień 15, 2006, 11:19:59 wysłana przez agent_J »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 15, 2006, 11:28:00
Fajne. :) Po opisie domyślam się, że mikrokodu nie używałeś. :) Swoją drogą zastanawiam się, jak szybko potrafią te FPGA działać. W ulotkach piszą, że dochodzą do 350MHz, ale ciekawe, jak dało by się zaprojaktować procesor, żeby tego rzędu wiekości osiągnąć. :)

Antrykot

  • Gość
# Kwiecień 15, 2006, 11:36:22
Fajne. :) Po opisie domyślam się, że mikrokodu nie używałeś. :) Swoją drogą zastanawiam się, jak szybko potrafią te FPGA działać. W ulotkach piszą, że dochodzą do 350MHz, ale ciekawe, jak dało by się zaprojaktować procesor, żeby tego rzędu wiekości osiągnąć. :)

Są różne układy. Spartan 3 chyba działa do 200MHz, ale ja używam max 50Mhz jaki clock. Podczas kompilacji kodu , dokonywane są analizy opóźnień i inne bajery, które pokazują z jąką max. częstotliwością może pracować wygenerowany układ. Mikrokodu nie używałem, bo po co :) Teraz robię procesor 32 bitowy 8), nadal bez wstępnego pobierania i dekodowania, bo to by się za bardzo skomplikowało na początek. Będe musiał pokombinować z lepszym sterownikiem pamięci, bo płytka nie posiada Flasha, którego można by użyć do trzymania kodu. Pewnie w FPGA będzie prosty program, który zasysa program do RAMu przez port szeregowy i odpala go.

Offline W2K

  • Użytkownik

# Kwiecień 15, 2006, 13:57:19
Ja tak z czystej ciekawości chciałem się zapytać, ile kosztują łącznie podzezspoły których użyłeś do budowy tego "procesora".

Antrykot

  • Gość
# Kwiecień 15, 2006, 14:37:15
Za 100$ kupiłem zestaw Spartan 3 od Xilinixa - http://www.xilinx.com
Na płytce jest: Spartan 3 xc3s200, wyświetlacz LED 4x7 segmentów, 8 przełączników, 4 przyciski, port PS2, port RS232, port VGA, 1MB SRAM, port JTAG, diody LED, złącza 3 podobne jak wtyczki do twardego dysku.
Z zestawem dostajesz 6 płytek z softem i pdfami różnymi, zasilacz, kabel JTAG, 2 książki, różne ulotki.

Ogólnie to polecam zabawę w programowanie takich układów bo się można baaardzo wiele nauczyć i z elektroniki, jak również z przetwarzania sygnałów cyfrowych.
« Ostatnia zmiana: Kwiecień 15, 2006, 14:48:42 wysłana przez agent_J »

Offline orzech

  • Użytkownik
    • homepage

# Kwiecień 15, 2006, 14:47:57
Niesamowite! :D Bardzo mi imponuje to, że ktoś _na serio_ zajmuje się czymś oryginalnym, agent_J. :)

Swoją drogą, z asemblerem to ja miałem styczność w ramach zajęć z mikrokontrolera A51. Słyszałem, że A51 używa sie do programowania świateł na skrzyżowaniach, ale coś nie czuję, abym mnie ciągnęło do tego zawodu. ;)

Wesołych Świąt Wielkanocnych!

Antrykot

  • Gość
# Kwiecień 15, 2006, 14:58:09
Niesamowite! :D Bardzo mi imponuje to, że ktoś _na serio_ zajmuje się czymś oryginalnym, agent_J. :)

Swoją drogą, z asemblerem to ja miałem styczność w ramach zajęć z mikrokontrolera A51. Słyszałem, że A51 używa sie do programowania świateł na skrzyżowaniach, ale coś nie czuję, abym mnie ciągnęło do tego zawodu. ;)

No ja właśnie nie chcę robić tego co 90% osób czyli strony www, grafikę na strony www, itp. 8) W trakcie gdy piszę ten post, to robię interfejs pomiędzy rdzeniem procesora a wewnętrzną szyną łączącą różne kontrolery (bus master) oraz interfejs dla kontrolerów (slave'y).

Tak wygląda sam port tego bloku:
entity cpu_inteface is
    Port ( clock : in std_logic;
           reset : in std_logic;

  -- port szyny lokalnej
           bus_rw : out std_logic;     -- odczyt/!zapis, pullup
           bus_ds : out std_logic;   -- !strob danych, pullup
           bus_as : out std_logic;   -- !strob adresu, pullup
           bus_data : inout std_logic_vector(15 downto 0);   -- dane
           bus_addr : out std_logic_vector(31 downto 0);      -- adres
           bus_dack : in std_logic;      -- !potwierdzenie transakcji
           bus_err : out std_logic;   -- !błąd na szynie, pullup
           bus_intr : in std_logic;   -- !żądanie przerwania
           bus_iack : out std_logic;   -- !potwierdzenie przerwania, pullup
 
  -- port procesora
  cpu_data : inout std_logic_vector(15 downto 0);   -- dane
  cpu_addr : in std_logic_vector(31 downto 0);       -- adres
  cpu_rw : in std_logic;                             -- odczyt/!zapis
  cpu_breq : in std_logic;                           -- !uruchomienie transakcji
  cpu_intr : out std_logic;      -- !żądanie przerwania
  cpu_iack : in std_logic;   -- !potwierdzenie przyjęcia przerwania
  cpu_berr : out std_logic;   -- !błąd na szynie
  cpu_rdy : out std_logic);   -- !transakcja gotowa
end cpu_inteface;

Offline SauRooN

  • Użytkownik

# Kwiecień 15, 2006, 15:21:07
Ja swego czasu zaprojektowałem kompletnego DLX'a razem z kontrolerami pamięci, cache'em i innymi bajerami. Kilka miesięcy mi to zajęło, ale tak bardzo mi się spodobało, że nawet zastanawiałem się czy nie rzucić programowania dla tego ;) A najlepszym etapem było stworzenie go w symulatorze i testowanie :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 15, 2006, 21:11:27
Cytuj
Są różne układy. Spartan 3 chyba działa do 200MHz, ale ja używam max 50Mhz jaki clock. Podczas kompilacji kodu , dokonywane są analizy opóźnień i inne bajery, które pokazują z jąką max. częstotliwością może pracować wygenerowany układ.
Dlatego pisałem, że trzeba by było dobrze to zaprojektować. :) Po prostu myślę, że fajnie by było zrobić procesor, który działa z taką maksymalną częstotliwością, nawet jeżeli niektóre rozkazy wymagałyby po 20 taktów. :)

Cytuj
Mikrokodu nie używałem, bo po co
Cytuj
Więcej będzie w procesorze v2, bo zmieniam architekturę, żeby ALU używało multiplekserów, bo na razie jest zakodowana obsługa każdego rozkazu osobno
Właśnie po to - żeby uprościć budowę samego procka. :)

Cytuj
Ja swego czasu zaprojektowałem kompletnego DLX'a razem z kontrolerami pamięci, cache'em i innymi bajerami. Kilka miesięcy mi to zajęło, ale tak bardzo mi się spodobało, że nawet zastanawiałem się czy nie rzucić programowania dla tego ;) A najlepszym etapem było stworzenie go w symulatorze i testowanie :)
Rozwiązanie: wysyłaj CV do NVidii. :)

Offline SauRooN

  • Użytkownik

# Kwiecień 15, 2006, 22:00:53
Rozwiązanie: wysyłaj CV do NVidii. :)
No niestety w projektowaniu kart graficznych nie mam żadnego doświadczenia, ale jak ktoś się zna na tym to chętnie bym zamienił słówko.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 15, 2006, 22:39:40
Cytuj
No niestety w projektowaniu kart graficznych nie mam żadnego doświadczenia, ale jak ktoś się zna na tym to chętnie bym zamienił słówko.
A myślisz, że Ci, co się zgłaszają, się na tym znają? Przecież wszystkie szczegóły implementacyjne są zwykle pilnie strzeżoną tajemnicą firmy, więc jedyne, czego mogą wymagać, to doświadczenie w projektowaniu układów, niekoniecznie graficznych. :)

Antrykot

  • Gość
# Kwiecień 15, 2006, 22:53:30
Karty graficzne pewnie projektuje zespół elektroników, programistów i matematyków, bo to są piekielnie skomplikowane układy. Normalnie takie układy są optymalizowane ręcznie, np. któraś seria pentium była wolniejsza bo Intel zdał się na optymalizator programowy, bo im się śpieszyło.

Antrykot

  • Gość
# Kwiecień 15, 2006, 22:57:27
SauRooN@ tak z ciekawości. Ile czasu sie już tym "bawisz" ?