Architektura systemów komputerowych | Punkty: |
---|---|
Imię i Nazwisko: - Dydo Karol - Tomasz Gierczak |
Temat: Podstawowy cykl rozkazowy procesora. |
Analiza układu pobierania instrukcji z pamięci.
Na początku uruchomiliśmy program symulacyjny ProcSim, następnie załadowaliśmy plik „MIPS R2000 1 Fetching and Increm.xml” klikając na opcję „Processor Architecutre”.
Kolejną rzeczą jaką zrobiliśmy było załadowanie pliku z programem asemblera.
W tym celu użyliśmy opcji „Assembly Code” i załadowaliśmy plik „sample.asm”, po czym wykonaliśmy asemblacje.
Po wykonaniu powyższych kroków przystąpiliśmy do symulacji (klikając na przycisk „Start Simulation”)
Elementy Strukturalne: PC – licznik instrukcji, Instruction Memory – pamięć rozkazów, Increment PC – sumator, Out4 – element strukturalny.
Podczas wykonywania symulacji wykorzystując opcję „Step”, mamy możliwość zaobserwowania pracy krokowej programu. Używanie tej opcji umożliwia nam dokładne przeanalizowanie każdego elementu strukturalnego w odpowiedniej dla niego fazie programu. Natomiast używanie opcji „Start Execution” pozwala nam na zaobserwowanie i prześledzenie wszystkich kroków jednym po drugim, automatycznie. Podczas symulacji, przy użyciu tej opcji(„Start Execution”), symulator umożliwia zatrzymanie wykonywania symulacji w dowolnym momencie, przy użyciu buttonu „Pause” oraz ponownego wznowienia przy pomocy „Resume”.
Praca podzespołów oraz uzasadnienie ich działania:
Z PC wystawiany jest na magistrale adres pamięci rozkazu. Jednocześnie adres będzie inkrementowany o wartość „4”, więc jest doprowadzony do jednego wejścia sumatora. Z pamięci rozkazów zwracana jest instrukcja, która znajduje się w niej pod wskazanym adresem. Z elementu strukturalnego Out4 wystawiana jest
wartość na drugie wejście sumatora. Następnie sumator sumuje dwie wartości(w tym przypadku „4” oraz „0”, patrz „Rysunek 1”), które zostały podane na jego porty wejściowe(z licznika instrukcji i elementu strukturalnego „Out4”). Z „Increment PC” wartość zostaje doprowadzona do portu wejściowego(„NewPC”) licznika rozkazu. Nowa wartość(„4”) zostaje zapisana w „PC” i pojawia się na wejściu adresowym pamięci.
Analiza struktury procesora zdalnego do wykonywania instrukcji w formacie R-Format.
Na wstępie załadowaliśmy plik „MIPS R2000 Just R-Format”, używając opcji „Processor Architecture”.
Następnie załadowaliśmy plik z programem asemblera o nazwie „sample just
R-Format.asm”.
Po załadowaniu odpowiednich plików przystąpiliśmy do symulacji.
Elementy strukturalne: PC – licznik rozkazów, ALUIncr – jednostka
arytmetyczno-logiczna realizująca sumowanie adresu instrukcji(domyślna inkrementacja adresu), InstrMemory – pamięć rozkazów, Register – plik rejestrów, MainALU – główna jednostka arytmetyczno-logiczna, ALUControl – układ sterujący ALU.
Patrz podpunkt „e” punktu „1”.
Rysunek 2
Praca podzespołów i uzasadnienie działania elementów strukturalnych:
Z PC wystawiany jest na magistralę adresową adres rozkazu do sumatora i do pamięci rozkazów. Z pamięci rozkazów pobierana jest instrukcja(add $s3, $s1, $s1) i przesłana na port wejściowy splitera. Zapis instrukcji (add $s3, $s1, $s1) zdekodowanej na zapis binarny wygląda następująco: 0000 0010 0011 0001 1001 1000 0010 0000. Jednostka sterująca generuje wartości sygnałów sterujących, które sterują działaniem elementów, np. zezwalają na zapis. Na portach wyjściowych splitera RS(rejestr źródłowy), RT(rejestr źródłowy lub przeznaczenia), RD(rejestr przeznaczenia), Func(kod operacji) wystawiane są wartości RS(100012), RT(100012), RD(100112), Func(1000002) które zostają przesłane na porty wejściowe rejestru plików oraz układu sterującego ALU(patrz „Rysunek 2”). Na podstawie kodu operacji(pola bitów Func[31 – 26] - 1000002) jednostka sterująca generuje sygnały sterujące pracą ALU. Następnie na portach wyjściowych pliku rejestru(„ReadData” oraz „ReadData2”) wystawiane są wartości „5”(patrz „Rysunek 2”) które zostają przesłane na porty wejściowe(„ALUInp1” oraz „ALUInp2”) „MainALU”. Pod wpływem kodu operacji jednostka sterująca „ALUControl” wygeneruję rozkaz(„0102”) i prześle go na port wejściowy(„ALUOp”) do głównej jednostki arytmetyczno-logicznej. „MainALU” pod wpływem rozkazu(„0102”) otrzymanego od jednostki sterującej „ALUControl” wykona operację sumowania, a wynik zostanie wystawiony na porcie wyjściowym („Result”) i zostanie przesłany na port wejściowy pliku rejestrów(„WriteData”). Dodatkowo na porcie wyjściowym („zero”) „MainALU” wystawiana jest wartoś „02”. Element strukturalny „Out4” domyślnie inkrementuje PC o wartość „4”. Po zsumowaniu dwóch wartości przez „ALUIncr” wystawionych na jego porty wejściowe(PC = „0” oraz Incream4 = „4”) wystawiany jest na porcie wyjściowym „PC+4” adres kolejnej instrukcji i przesłany na port wejściowy „NewPC” do licznika rozkazów.
Analiza struktury procesora zdolnego do wykonywania operacji arytmetycznych, slt, beq, sw, lw.
Na początku załadowaliśmy plik z opisem architektury „MIPS R2000 3 arithm slt beq swlw” używając opcji „Processor Architecture”.
Następnie załadowaliśmy plik z programem asemblera „sample negative, slt”
Po wykonaniu powyższych czynności uruchomiliśmy symulacje.
Elementy strukturalne: PC – licznik rozkazów, ALUIncr – jednostka służąca inkrementacji licznika rozkazów, InstrMemory – pamięć rozkazów, Register – plik rejestrów, MainALU – główna jednostka arytmetyczno – logiczna, ALUControl – układ sterujący ALU, Control – jednostka sterująca, ShiftLeft – element strukturalny odpowiadający za przesunięcie w lewo, ALUBranch – sumator skoków, Memory - pamięć, AND1 – element strukturalny,
SExtend – ekstender bitów z 16 do 32.
Patrz podpunkt „e” punktu „1”.
Praca podzespołów i uzasadnienie działania elementów strukturalnych:
Rysunek 3
Z PC wystawiany jest na magistralę adresową adres rozkazu do sumatora i do pamięci rozkazów.
Z pamięci rozkazów wystawiana jest instrukcja na port wejściowy splitera(add $s3, $s3, $s2). Zapis instrukcji (add $s3, $s3, $s2) zdekodowanej na zapis binarny wygląda następująco: 0000 0010 0111 0010 1001 1000 0010 0000. Na portach wyjściowych splitera RS(rejestr źródłowy), RT(rejestr źródłowy lub przeznaczenia), RD(rejestr przeznaczenia), Func(kod operacji), Addr(adres 16 bitowy),
Opcode(kod operacji) wystawiane są wartości RS(100112), RT(100102), RD(100112), Func(1000002), Addr(10011000001000002), Opcode(0000002) które zostają przesłane na porty wejściowe rejestru plików, układu sterującego ALU, ekstendera bitów, jednostki sterującej oraz multipleksera
(patrz „Rysunek 3”). Na podstawie kodu operacji(pola bitów Func[31 – 26] - 1000002) jednostka sterująca ALU generuje sygnały sterujące pracą ALU. Na porty wejściowe multipleksera(„Mux1”) wystawiane są dwie wartości z portów wyjściowych splitera („RT = 100102” oraz „RD = 100112”). Multiplekser pod wpływem uzyskanego rozkazu(„12”) od jednostki sterującej wybiera odpowiednią wartość, w tym przypadku jest to wartość wystawiona przez port RD(patrz „Rysunek 3”) a następnie przesyła ją na port wejściowy „WriteReg” pliku rejestrów. Z pola „Addr” wystawiany jest na port wejściowy ekstendera bitów adres 16-bitowy(10011000001000002). Pole „Opcode” przesyła kod operacji do jednostki sterującej która pod wpływem tego kodu wysyła rozkazy do poszczególnych elementów strukturalnych. Ekstender bitów dekoduje nam zakodowaną binarnie wartość oraz wystawia ją na port wejściowy multipleksera(„Mux4”) oraz elementu strukturalnego „ShiftLeft”. Po zdekodowaniu wartość ta wynosi(„-26592”).
Rejestr plików wystawia na porty wyjściowe wartości(„ReadData” = -12 oraz „ReadData2” = 2) i następnie przesyła te wartość(„-12”) na port wejściowy(„ALUInp1”) do głównej jednostki arytmetyczno-logicznej, wartość(„-2”) zostaje wystawiona na pierwszy port wejściowy multipleksera(„Mux4”) oraz na port wejściowy(„WriteData”) pamięci. Multiplekser(„Mux4”) pod wpływem rozkazu(„02”) otrzymanego z jednostki sterujacej wybiera wartość z pierwszego portu wejściowego, czyli „2” i wystawia ją na port wejściowy „MainALU”(„ALUInp2”). Jednostka sterująca ALU pod wpływem kodu operacyjnego Func(„1000002”) oraz rozkazu z jednostki sterującej „Control” generuję kod rozkazu(„0102”). „MainALU” pod wpływem otrzymanego rozkazu(„0102”) od jednostki sterującej ALU wykonuje operacje dodawania wartości podanych na porty wejściowe(„ALUInp1” oraz „ALUInp2”) a wynik tej operacji(„-10”) jest wystawiany na port wyjściowy(„Result”) i przesłany na port wejściowy(„Address”) pamięci oraz na pierwszy port wejściowy multipleksera(„Mux3”). Dodatkowo „MainALU” na porcie wyjściowym „zero” wystawia wartość „02” oraz przesyła ją do portu wejściowego(„ANDZeroIn”) elementu strukturalnego „AND1”. Z multipleksera(„Mux3”) pod wpływem rozkazu(„02”) wystawiana jest wartość(„-10”) na port wejściowy(„WriteData”) pliku rejestrów. Element strukturalny „ShiftLeft” po przemnożeniu(x4) wartości podanej z ekstendera bitów, wystawia na porcie wyjściowym(„Addr*4”) nową wartość(„-106368”) która zostaje przesłana na port wejściowy(„AddressField”) sumatora skoków. Element strukturalny „Out” domyślnie inkrementuje PC o „4”. Po zsumowaniu przez „ALUIncr” dwóch wartości podanych na porty wejściowe(PC = „0” oraz Increm = „4”) wystawia nową wartość, w tym przypadku „4” zakodowaną binarnie(„0…1002”) na port wejściowy(„PC+4”) sumatora skoków oraz na pierwszy port wejściowy(„In0PCIncrem”) multipleksera(„Mux2”).
Sumator skoków generuje potencjalny adres(„1111 1111 1111 1110 0110 0000 1000 01002”) docelowego skoku warunkowego. Adres powstaje przez zsumowanie inkrementowanej zawartości „PC” z przemnożeniem(x4) wartości z elementu strukturalnego „ShiftLeft”. Multiplekser(„Mux2”) pod wpływem rozkazu „02” otrzymanego z elementu strukturalnego „AND1” wybiera wartość(„0…1002”) wystawianą na pierwszy port wejściowy(„In0PCIncrem”) a następnie przesyła ją na port wejściowy(„NewPC”) licznika rozkazów. Zakodowana binarnie wartość(„0…1002”) to „4”, wartość ta jest kolejnym adresem do następnej instrukcji(sw $s3, 0($s0)).
Analiza struktury procesora zdolnego do wykonania dodatkowo instrukcji jump.
Na początku załadowaliśmy plik „MIPS R2000 4 all others and jmp.xml” używając opcji
„Processor Architecture”.
Następnie załadowaliśmy do symulatora plik z programem asemblera, „sample jump”.
Po wykonaniu powyższych kroków przystąpiliśmy do symulacji.
Elementy strukturalne: PC – licznik rozkazów, ALUIncr – jednostka służąca inkrementacji licznika rozkazów, InstrMemory – pamięć rozkazów, Register – plik rejestrów, MainALU – główna jednostka arytmetyczno – logiczna, ALUControl – układ sterujący ALU, Control – jednostka sterująca, ShiftLeft(2) – element strukturalny odpowiadający za przesunięcie w lewo, ALUBranch – sumator skoków, Memory - pamięć, AND1, Join – element strukturalny,
SExtend – ekstender bitów z 16 do 32.
Patrz podpunkt „e” punktu „1”.
Praca podzespołów i uzasadnienie działania elementów strukturalnych:
Rysunek 4
Z PC wystawiany jest na magistralę adresową adres rozkazu do sumatora i do pamięci rozkazów.
Z pamięci rozkazów wystawiana jest instrukcja na port wejściowy splitera(j main).
Zapis instrukcji (j main) zdekodowanej na zapis binarny wygląda następująco: 0000 1000 0000 0000 0000 0000 0000 0000. Na portach wyjściowych splitera RS(rejestr źródłowy), RT(rejestr źródłowy lub przeznaczenia), RD(rejestr przeznaczenia), Func(kod operacji), Addr(adres 16 bitowy),
Opcode(kod operacji), JmpImmediate(skok bezpośredni) wystawiane są wartości RS(000002), RT(000002), RD(000002), Func(0000002), Addr(0000 0000 0000 00002), Opcode(0000102), JmpImmediate(0…0002) które zostają przesłane na porty wejściowe rejestru plików, układu sterującego ALU, ekstendera bitów, jednostki sterującej, multipleksera oraz do elementu strukturalnego „ShiftLeft2” (patrz „Rysunek 4”). ALUControl pod wpływem kodu operacji Func(„0000002”) oraz rozkazu(„002”) z jednostki sterującej generuje rozkaz(„0102”) sterujący pracą ALU. Multiplekser(„Mux1”) pod wpływem rozkazu z jednostki sterującej „Control” decyduję o wystawieniu odpowiedniej wartości, w tym przypadku jest to wartość wystawiana przez pole RT a następnie przysyła tę wartość na port wejściowy(„WriteReg”) rejestru pliku. Plik rejestru na portach wyjściowych(„ReadData” = 0 oraz „ReadData2” = 0) wystawia „0” na port wejściowy „ALUInp1”, pierwszy port wejściowy multipleksera(„Mux4”) oraz na port wejściowy(„WriteData”) pamięci.
Ekstender bitów dekoduje zakodowaną wartość binarną(„0…002”) na 16 bitach i wystawia ją na pierwszy port wejściowy multipleksera(„Mux4”) oraz na port wejściowy(„Addr”) elementu strukturalnego „ShiftLeft”. Zdekodowana wartość wynosi „0”. Multiplekser(„Mux4”) pod wpływem rozkazu z jednostki sterującej „Control” decyduje o wyborze odpowiedniej wartości, w tym przypadku jest to wartość podawana przez port wyjściowy(„ReadData2”) rejestru plików. Głowna jednostka arytmetyczno-logiczna pod wpływem otrzymanego rozkazu(„0102”) z jednostki sterującej ALU wykonuje operację sumowania dwóch wartości wystawionych na porty wejściowe „MainALU”(„ALUInp1” oraz „ALUInp2”). „MainALU” po wykonaniu operacji sumowania na porcie wyjściowym „zero” wystawia „12” oraz przesyła ją do portu wejściowego(„ANDZeroIN”) elementu strukturalnego „AND1”. Na porcie wyjściowym „Result” zostaje wystawiona wartość „0” a następnie przekazana do portu(„Address”) pamięci oraz na pierwszy port multipleksera(„Mux1”). Element strukturalny „AND1” pod wpływem dwóch rozkazów otrzymanych z jednostki sterującej oraz „MainALU” na porcie wyjściowym wystawia wartość(„02”) a następnie przesyła ją do portu wejściowego multipleksera(„Mux2”). Multiplekser(„Mux3”) pod wpływem rozkazu z jednostki sterującej „Control” decyduję o wyborze przekazywanej wartości, w tym przypadku jest to wartość podawana przez port wyjściowy(„Result”) „MainALU”. Element strukturalny „ShiftLeft” przemnaża(x4) wartość(„0”) podaną na jego port wejściowy a następnie wystawia nową wartość na port wejściowy(„AddressField”) sumatora skoków. „Out” domyślnie inkrementuję wartość PC o „4”.
„ALUIncr” po zsumowaniu wartości podanych na jego porty wejściowe („PC” = 16 oraz „Increm4” = 4) wystawia nową wartość zakodowaną binarnie(„0…10100” = „20”) na port wejściowy splitera, port wejściowy(„PC+4”) sumatora skoków oraz na pierwszy port multipleksera(„Mux2”). Sumator skoków generuje potencjalny adres(„0…10100”) skoku i wystawia go na drugi port wejściowy multipleksera(„Mux2”). Multiplekser(„Mux2”) pod wpływem otrzymania rozkazu od elementu strukturalnego „AND1” decyduję o wyborze wartości, w tym przypadku jest to wartość inkrementowanego „PC+4” i wystawia tą wartość na pierwszy port multipleksera(„Mux5”). Po przemnożeniu(x4) adresu 32 bitowego(„0…002”) przez element strukturalny „ShiftLeft2” zostanie wystawiona nowa wartość na port wejściowy(„Addr*4”) elementu strukturalnego „Join”. „Split2” wybiera najbardziej znaczące bity(4bity) z przekazanej mu na port wejściowy inkrementowanej wartości „PC+4”. Element strukturalny „Join” wystawia na drugi port wejściowy multipleksera(„Mux5”) wartość(„0…..0002”). Multiplekser(„Mux5”) pod wpływem rozkazu(„12”) otrzymanego z jednostki sterującej, decyduje którą wartość ma wystawić na port wyjściowy „NewPC”. W tym przypadku jest to wartość(„0…..0002”) wystawiana przez port wyjściowy elementu strukturalnego „Join”, czyli „0”. Następuje skok(„jump”) do instrukcji wskazanym pod tym adresem. Jest to adres początkowej instrukcji main:sw $s3, 0($s0).