Programowalne układy logiczne Mikroprocesor Szymon Acedański Marcin Peczarski Instytut Informatyki Uniwersytetu Warszawskiego 6 grudnia 2014
Zbudujmy własny mikroprocesor Bardzo prosty: 16-bitowy, 16 rejestrów ogólnego przeznaczenia, 16-bitowe adresy, 16-bitowe kody instrukcji, 2 16 słów 16-bitowych pamięci programu (ROM), jeden 16-bitowy rejestr wejściowy, jeden 16-bitowy rejestr wyjściowy. Mimo to bardzo nowoczesny: RISC, tylko 26 instrukcji, przetwarzanie potokowe.
Założenia upraszczające Nie będziemy implementować: interfejsu do pamięci operacyjnej (RAM), pamięci podręcznej, systemu przerwań i jeszcze kilku innych, zbędnych wodotrysków... W naszej konstrukcji zignorujemy też wiele istotnych problemów: dystrybucja sygnału zegarowego, minimalizacja poboru mocy.
Dobrze jest zacząć od zaprojektowania listy instrukcji Dwuargumentowe instrukcje arytmetyczno-logiczne 0 op dst src1 src2 op instrukcja 000 add dst, src1, src2 001 sub dst, src1, src2 010 and dst, src1, src2 011 or dst, src1, src2 100 xor dst, src1, src2 101 cps dst, src1, src2 110 cpu dst, src1, src2 Argumenty dst, src1, src2 to 4-bitowe numery rejestrów. Instrukcje cps i cpu porównują odpowiednio liczby ze znakiem i bez znaku. Gdy src1 < src2 rejestr dst przyjmuje wartość 1, a w p.p. wartość 0.
Lista instrukcji, cd. Jednoargumentowe instrukcje arytmetyczno-logiczne 1000 dst src 0 op op instrukcja 000 shr dst, src 001 sar dst, src 010 rol dst, src 011 ror dst, src 100 neg dst, src 101 not dst, src 110 inc dst, src 111 dec dst, src Argumenty dst i src to 4-bitowe numery rejestrów. Instrukcja shr to logiczne przesunięcie o jeden bit w prawo. Instrukcja sar to arytmetyczne przesunięcie o jeden bit w prawo.
Lista instrukcji, cd. Zauważmy, że nie potrzebujemy instrukcji shl dst, src zamiast niej można użyć instrukcji add dst, src, src Przy okazji zauważmy też, że nie potrzebujemy instrukcji mov dst, src można użyć instrukcji or dst, src, src Instrukcje rol i ror to rotacje o jeden bit odpowiednio w lewo i prawo. Instrukcje neg i not to odpowiednio negacja arytmetyczna i logiczna. Instrukcje inc i dec to odpowiednio zwiększenie i zmniejszenie o jeden.
Lista instrukcji, cd. Skok (ang. branch) bezwarunkowy lub powrót z podprogramu do instrukcji o adresie, który znajduje się w rejestrze dst b dst 1000 dst 0000 1000 Skok do podprogramu 1000 dst lr 1001 bl dst, lr Semantyka tej instrukcji w VHDL lr <= pc + 1; pc <= dst;
Lista instrukcji, cd. Po co nam taka dziwna instrukcja? 1000 dst src 1010 lda dst, src+pc+1 Semantyka tej instrukcji w VHDL dst <= src + pc + 1; Zamiana bajtów (ang. byte swap) 1000 dst src 1011 bsw dst, src Semantyka tej instrukcji w VHDL dst <= src(7 downto 0) & src(15 downto 8);
Lista instrukcji, cd. Mikroprocesor musi komunikować się ze światem zewnętrznym. Wejście-wyjście 1000 dst src 1110 in dst, [src] 1000 dst src 1111 out [dst], src Dla uproszczenia ignorujemy argument [...], czyli adres portu wejścia-wyjścia aktualna wersja mikroprocesora ma tylko po jednym porcie wejściowym i wyjściowym.
Lista instrukcji, cd. Argument natychmiastowy 1001 dst imm ld dst, imm Skoki warunkowe 1010 reg imm bz reg, imm Semantyka tej instrukcji w VHDL pc <= pc + imm + 1 when reg = 0 else pc + 1; 1011 reg imm bnz reg, imm Semantyka tej instrukcji w VHDL pc <= pc + imm + 1 when reg /= 0 else pc + 1; Stała imm jest 8-bitową liczbą ze znakiem.
Lista instrukcji, koniec Przesunięcie starszego bajtu, ładowanie stałej 1100 dst imm ldhl dst, imm Semantyka tej instrukcji w VHDL dst(7 downto 0) <= dst(15 downto 8); dst(15 downto 8) <= imm; Przyjęta architektura wyklucza istnienie instrukcji, która ładowałaby 16-bitową stałą do rejestru. Aby załadować 16-bitową stałą, trzeba dwukrotnie użyć instrukcji ldhl. Dwudziesta szósta instrukcja halt Jaki jest jej kod maszynowy?
Potok instrukcji Potok będzie dwuetapowy: IF (ang. instruction fetch) pobranie i zdekodowanie instrukcji, EX (ang. execution) wykonanie instrukcji. Architektura naszego mikroprocesora została tak zaprojektowana, aby nie było zależności danych. Pojawia się tylko zależność sterowania. IF EX IF EX IF IF skok EX Po wykonaniu skoku trzeba opróżnić potok i ponownie pobrać instrukcję.
Pora zaprojektować hardłer branch/branch addr address ROM if out ex in IF IF/EX data EX in out
Blok IF branch next pc branch addr PC +1 if out next instr addr rom address rom data instruction decoder if out alu op, alu arg1,...
Blok EX, GPRs src1 addr src2 addr dst addr reg write op GPRs src1 src2 dst
Blok EX, ALU src1 imm data alu in1 alu arg1 alu out src2 next instr addr alu in2 alu arg2 alu op
Blok EX, zapis wyniku (ang. write back), wejście-wyjście alu out dst in read op in data IN in port src1 OUT out port out write op
Blok EX, obsługa skoków src2 alu out branch addr src1 branch op branch logic branch addr sel branch
Uwagi końcowe Do każdego bloku synchronicznego trzeba doprowadzić sygnał clock i reset. Natomiast bloki kombinacyjne nie wymagają taktowania i zerowania. Musimy dodać układ opróżniania potoku po skoku. Dodajemy blokowanie rejestru IF/EX za pomocą sygnału branch, aby kolejna już pobrana i zdekodowana instrukacja nie została przekazana do wykonania. Generujemy dodatkowy sygnał dead instruction, który blokuje ponowne wykonanie właśnie wykonanej i nadal przebywającej w EX instrukcji. Szczegóły w tekście źródłowym, który jest pod adresem http://www.mimuw.edu.pl/~marpe/pul/hdl/ w8_microprocessor.
Czego jeszcze potrzebuje nasz mikroprocesor? RAM na poprzednim lub następnym wykładzie Układ mnożący na poprzednim lub następnym wykładzie Interfejs do komunikacji ze światem zewnętrznym trzecie zadanie A może ktoś ma inny, ciekawy pomysł na rozszerzenie jego funkcjonalności czwarte zadanie
Propozycje zadania 4 Rozbudować przedstawiony mikroprocesor o układ mnożący, RAM, więcej etapów potoku Zaprojektować i skonstruować własny mikroprocesor o niestandardowej architekturze (maszyna stosowa, funkcyjny,... ) Procesor z samomodyfikacją kodu wojny rdzeniowe Stworzyć szałową grę korzystającą z VGA i myszki jednoosobową: squash, pong, wąż, wyścig, gwiezdne wojny,... dwuosobową: tenis, strzelanka,... Kilkukanałowy analizator stanów logicznych (coś w rodzaju oscyloskopu)... Temat należy uzgodnić z prowadzącym. Bardziej skomplikowane projekty można realizować w parach. Czas na oddanie rozwiązania do końca semestru.