Architektura Systemów Komputerowych - Instrukcja do laboratorium nr 12, 13 i 14
Autor: Mariusz Wiśniewski


  1. Układu sterujący i układu wykonawczy
    Na 4 laboratorium była omawiana konstrukcja układu wykonawczego oraz sposobu kodowania instrukcji. Układ z laboratorium 4 został wprowadzony w pakiecie MAX+plus II. Układ jest częściowo zmodyfikowany w stosunku do projektu teoretycznego: usunięto demultiplekser znajdujący się na wejściu rejestrów (ze względu na sposób działania rejestrów), dodano multiplekser na wyjściu WY w celu wyeliminowania zmian wyjścia w trakcie wykonywania poszczególnych mikroinstrukcji. Zmianie uległ także fragment układu odpowiedzialny za wykonywanie odejmowania - po zmianie odejmowanie wykonywane jest w kodzie liczbowym U2. Poniżej został przedstawiony schemat układu wprowadzony w pakiecie MAX+plus II:

    Kliknij, aby powiększyć
    Plik schematu powyższego układu przygotowany w pakiecie MAX+plus II można pobrać tutaj: [pobierz]. Plik należy zapisać pod nazwą lab4.gdf.


    Do powyższego układu zaproponowano układ sterujący o następującym schemacie:

    Kliknij, aby powiększyć
    Plik schematu powyższego układu przygotowany w pakiecie MAX+plus II można pobrać tutaj: [pobierz]. Plik należy zapisać pod nazwą lab4_ster.gdf.


    Układ sterujący jest układem sekwencyjnym, dlatego dla jego poprawnej pracy niezbędne jest doprowadzenie sygnału zegarowego (wejście CLK). Wejście RESET umożliwia zatrzymanie pracy układu, wznowienie jego pracy będzie możliwe od następnego narastającego zbocza sygnału CLK po ustaleniu się na wejściu RESET stanu niskiego. Układ sterujący posiada jeszcze wejście IR, którego format jest zgodny z formatem instrukcji zaproponowanym w instrukcji do laboratorium 4:

    Słowo instrukcji:

    |kkk|d|aa|bb|llllllll|

    gdzie:
    kkk- 3 bity oznaczające kod instrukcji,
    d- bit informujący o rozkazie z domyślnymi argumentami,
    aa- 2 bity oznaczające numer pierwszego rejestru,
    bb- 2 bity oznaczające numer drugiego rejestru,
    llllllll- 8 bitów oznaczających wartość natychmiastową,


    Dla wyżej przedstawionego formatu instrukcji zakodowano następujące rozkazy rozpoznawane przez układ sterujący:

    kkk d aa bb llllllll Instrukcja
    000 0 aa bb - - - - - -l1l0 Rl1l0 = Raa+Rbb, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
    001 0 aa bb - - - - - -l1l0 Rl1l0 = Raa-Rbb, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
    010 0 -- -- - - - - - -l1l0 Rl1l0 = 0, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
    011 0 -- -- - - - - - -l1l0 Rl1l0 = not Rl1l0, gdzie nr rejestru określają l1l0 z pola wartości natychmiastowej
    000 1 -- -- l7l6l5l4l3l2l1l0 A = A+L
    001 1 -- -- l7l6l5l4l3l2l1l0 A = A-L
    100 0 aa -- l7l6l5l4l3l2l1l0 Raa = Raa+L
    101 0 aa -- l7l6l5l4l3l2l1l0 Raa = Raa-L
    110 0 aa -- l7l6l5l4l3l2l1l0 Raa = L
    110 1 -- -- l7l6l5l4l3l2l1l0 A = L
    010 1 -- -- - - - - - - - - A = 0
    011 1 -- -- - - - - - - - - A = not A
    111 0 aa -- - - - - - - - - WY = Raa
    111 1 -- -- - - - - - - - - WY = A

    gdzie:
    aa- numer rejestru: 00 = R0, 01 = R1, 10 = R2, 11 = R3,
    bb- numer rejestru: 00 = R0, 01 = R1, 10 = R2, 11 = R3,
    lx- x-ty bit wartości natychmiastowej,
    -- wartość nieistotna,
    L- wartości natychmiastowa,


  2. Omówienie konstrukcji układu sterującego
    Komunikacja układu sterującego z układem wykonawczym została zrealizowana przy pomocy następujących sygnałów:
    ADR1, ADR3, ADR4, ADR5, ADR6, LDR0, LDR1, LDR2, LDR3, LDA, LDRWY. Sygnały ADR3 i ADR4 dla pewnych rozkazów posiadają wartości odpowiadające odpowiednim bitom rejestru IR (rejestru instrukcji). Sygnały LDR0-LDR3 służą do wymuszania zapisu w rejestrach R0-R3 i są generowane przez specjalny układ synchronizowany sygnałem zegarowym oraz wartościami pochodzącymi z rejestru IR.

    Generowanie sygnałów przez układ sterujący zostało zrealizowane z wykorzystaniem pamięci ROM przeznaczonej na mikrokod. Mikroinstrukcje są zbudowane z 11-bitowego słowa. Zostało przyjęte, że każda istrukcja będzie wykonana w ciągu 4 cykli sygnału zegarowego. Odpowiednie sygnały sterujące doprowadzane są do wejścia adresowego pamięci mikrokodu i są generowane przez układ GEN_CL. Jak wynika ze schematu układ GEN_CL adresuje dwa najmłodze bity pamięci, pozostałe 4 bity pochodzą z rejestru IR - są to bity kkk oraz bit d (oznaczone na schemacie IR[15..13] dla kkk oraz IR[12] dla d).
    Taka konstrukcja wymusza, aby przez 4 cykle zegara wartość w rejestrze IR nie była zmieniana. Należy tu podkreślić, że w przedstawionym układzie IR nie ma charakteru rejestru, jednakże układ sterujący zazwyczaj jest dodatkowo obudowany przez interface'y magistral lub inne układy towarzyszące i to właśnie do tych układów należy zapewnienie odpowiednich warunków pracy dla układów sterujących. Jeżeli układ sterujący miałby działać samodzielnie to należałoby odpowiednio zmodyfikować jego konstrukcję.
    Magistrala wyjściowa z pamięci ROM ma długość odpwiadającą ilości bitów słowa pamięci. Bity magistrali nazwano q0..q11 i służą do generowania następujących sygnałów:
    q11, q10- sygnał ADR1,
    q9, q8- sygnał sterujący dla multipleksera generującego wartość sygnału ADR3,
    q7, q6- sygnał sterujący dla multipleksera generującego wartość sygnału ADR4,
    q5- sygnał ADR5,
    q4- sygnał ADR6,
    q3- sygnał LDRWY,
    q2, q1- sygnał sterujący dla multipleksera i układu DEC2X4, generującego sygnały LDR0..LDR4,
    q0- sygnał LDA.

    W poniższej tabelce zostały zamieszczone mikrooperacje wykonywane w poszczególnych cyklach wykonania instrukcji oraz odpowiadające im mikrokody zawarte w pamięci ROM:

    Lp. cykl
    Mikroinstrukcje Mikrokod (q11..q0)
    1. 
     R[l1l0] = R[aa]+R[bb]
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=2, ADR3=(0)aa, ADR4=(0)bb, ADR5=0
     LDRWY=1
     LDR[l1l0]=1
     nop
     100001000000
     100001001000
     100001000110
     000000000000
    2. 
     R[l1l0] = R[aa]-R[bb]
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=2, ADR3=(0)aa, ADR4=(0)bb, ADR5=1
     LDRWY=1, ADR1=2
     LDR[l1l0]=1
     nop
     100001100000
     100001101000
     100001100110
     000000000000
    3. 
     R[l1l0] = 0
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=1, LDR[l1l0]=1
     nop
     nop
     nop
     010000000110
     000000000000
     000000000000
     000000000000
    4. 
     R[l1l0] = not R[l1l0]
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=(0)l1l0, ADR5=1, ADR1=3
     LDR[l1l0]=1
     nop
     nop
     110100100000
     110100100110
     000000000000
     000000000000
    5. 
     A = A+L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=0, ADR3=1-1, ADR4=1--, ADR5=0
     LDRWY=1, ADR1=2
     LDA=1
     nop
     001010000000
     101010001000
     101010000001
     000000000000
    6. 
     A = A-L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=0, ADR3=1-1, ADR4=1--, ADR5=1
     LDRWY=1, ADR1=2
     LDA=1
     nop
     001010100000
     101010101000
     101010000001
     000000000000
    7. 
     R[aa] = R[aa]+L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=1-1, ADR4=(0)aa, ADR5=0
     LDRWY=1, ADR1=2
     LDR[aa]=1
     nop
     001000000000
     101000001000
     101000000010
     000000000000
    8. 
     R[aa] = R[aa]-L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=1-1, ADR4=(0)aa, ADR5=1
     LDRWY=1
     ADR1=2, LDR[aa]=1
     nop
     001000100000
     101000101000
     101000000010
     000000000000
    9. 
     R[aa] = L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=0
     LDR[aa]=1
     nop
     nop
     000000000000
     000000000010
     000000000000
     000000000000
    10. 
     A = L
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=0
     LDA=1
     nop
     nop
     000000000000
     000000000001
     000000000000
     000000000000
    11. 
     A = 0
     t0: 
     t1: 
     t2: 
     t3: 
     ADR1=1
     LDA=1
     nop
     nop
     010000000000
     010000000001
     000000000000
     000000000000
    12. 
     A = not A
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=100, ADR5=1, ADR1=3
     LDA=1
     nop
     nop
     111100100000
     111100100001
     000000000000
     000000000000
    13. 
     WY = R[aa]
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=(0)aa
     ADR3=(0)aa
     ADR3=(0)aa
     nop
     000000010000
     000000010000
     000000010000
     000000000000
    14. 
     WY = A
     t0: 
     t1: 
     t2: 
     t3: 
     ADR3=100
     ADR3=100
     ADR3=100
     nop
     001100010000
     001100010000
     001100010000
     000000000000
    15. 
     instrukcja nie została zdefiniowana
     t0: 
     t1: 
     t2: 
     t3: 
     nop
     nop
     nop
     nop
     000000000000
     000000000000
     000000000000
     000000000000
    16. 
     instrukcja nie została zdefiniowana
     t0: 
     t1: 
     t2: 
     t3: 
     nop
     nop
     nop
     nop
     000000000000
     000000000000
     000000000000
     000000000000

    Plik MIF z opisem zawartości pamięci mikrokodu dla układu sterującego przygotowany w pakiecie MAX+plus II można pobrać tutaj: [pobierz]. Plik należy zapisać pod nazwą lab4_ster.mif.


    Układ sterujący i wykonawczy należy połączyć w edytorze graficznym w podany poniżej sposób:


    Plik schematu powyższego układu przygotowany w pakiecie MAX+plus II można pobrać tutaj: [pobierz]. Plik należy zapisać pod nazwą test-lab4.gdf.

  3. Uwagi konstrukcyjne
    1. Nazwy magistral:
      W pakiecie MAX+plus II obowiązuje zasada, że nazwa linii magistrali jest identyczna z nazwą wejścia do którego są one przyłączone. Wykonanie rozgałęzienia zazwyczaj wymusza konieczność zmiany nazwy magistrali. W tym wypadku należy wykorzystać komponent WIRE, który realizuje bufor i umożliwia stosowanie różnych nazw po jego obu stronach. Poniżej zostało przedstawione rozgałęzienie magistrali z wykorzystaniem komponentu WIRE:



      W przedstawionym fragmencie schematu występuje zmiana nazwy czterech najstarszych bitów magistrali IR na magistralę ADDRESS. Został tu także pokazany sposób wyodrębnienia jednej linii z magistrali - przejście IR[12] na ADDRESS[2] oraz połączenia magistrali ADDRESS[5..3] i linii ADDRESS[2] w magistralę ADDRESS[5..2].
      W pakiecie MAX+plus II w rozdzielaniu i łączeniu magistral należy pamiętać, że każde rozgałęzienie, jeśli zmiania ilość przesyłanych bitów musi być obustronnie opisane (tzn. etykiety muszą być umieszczone przed oraz po rozgałęzieniu). Przynależność etykiety do linii lub magistrali można sprawdzić przez kliknięcie w linie lub magistralę. Jeśli takowa posiada etykietę, to zostanie ona podświetlona na czerwono razem z klikniętą linią lub magitralą.

    2. Komponenty GND i VCC:
      W pakiecie MAX+plus II istnieje możliwość przypiania do linii (magistrali) wartości logicznej 0 lub 1. Do tego celu mogą posłużyć komponenty GND dla wartości logicznej 0 i VCC dla wartości logicznej 1. Komponenty GND i VCC wprowadza się do schematu podobnie jak inne elementy.

    3. Elementy wielowejściowe:
      W pakiecie MAX+plus II istnieje możliwość stworzenia bramki wielowiejściowej. Taka konstrukcja została wykonana w układzie wykonawczym (rysunek poniżej):



      Należy pamiętać, że wejście oraz wyjście z komponentu muszą być magistralami, posiadającymi etykiety wstazujące na tą samą ilość bitów w magistralach.

    4. Użycie pamięci:
      Sposób konfiguracji pakietu MAX+plus II oraz sposób wykorzystania pamięci został przedstawiony w następującej prezenstacji:
      • Pakiet MAX+plus II - wykorzystanie pamięci  [otwórz]

      Zawartość pamięci można zainicjować tworząc plik tekstowy z wartościami poszczególnych komórek pamięci. Format pliku został przedstawiony poniżej:

      WIDTH = 14;% ilość bitów przypadających na słowo danych pamięci %
      DEPTH = 32;% ilość słów w pamięci %

      ADDRESS_RADIX = HEX;% system liczbowy w stosowany w zapisie adresów pamięci; możliwe wartości: BIN, DEC, OCT, HEX %
      DATA_RADIX = HEX;% system liczbowy w stosowany w zapisie wartości komórek; możliwe wartości: BIN, DEC, OCT, HEX %

      -- komentarz może zacząć się od znaków -- lub być zawartym między znakami procentów
      CONTENT
      BEGIN
          [0..F]: 3FFF;% w zakresie adresu od 0 to F komórki będą miały wartość 3FFF %
          6: F;% przypisanie wartości F do komórki o adresie 6 %
          8: F E 5;% przypisanie do kolejnych komórek pamięci o adresie początkowym równym 8 wartości F, E i 5 %
      END;

      Przygotowane w taki sposób dane należy zapisać w pliku z rozszerzeniem MIF. Następnie należy odpowiednio skonfigurować komponent pamięci (o czym była mowa w powyższej prezentacji).

    5. Nowe komponenty:
      W układzie sterującym zostały zastosowane nowe komponenty: GEN_CL oraz DEC2X4:
      • Komponent MUX2X1_2B jest multiplekserem magistrali dwubitowych z dwóch linii na jedną.
      • Komponent GEN_CL jest licznikiem zliczającym modulo 4 cykle sygnału zegarowego (CLK). Wejście RESET komponentu umożliwa wyzerowanie licznika oraz czasowe wstrzymanie zliczania (na czas w którym RESET miał ustawiony stan wysoki).
      • Komponent komponent DEC2X4 służy do generowania impulsu zatrzaskującego dane w rejestrach. Jeżeli wejście WLACZ posiada stan wysoki to przy narastającym zboczu zegara na jednym z wyjść WY0..WY3 pojawi się przez jeden cykl zegara stan wysoki. Numer wyjścia które będzie aktywne wybierane jest przez wejście WE.

    6. Błędy programu MAX+plus II:
      Program MAX+plus II posiada błędy, które ujawniają się w różnych sytuacjach. Jednym z dostrzeżonych błędów, który utrudnia wykonanie ćwiczeń jest niepoprawna synteza układu. Z niewiadomych przyczyn podczas kompilacji układu test-lab4.gdf linie sterujące, które łączą podukłady są źle syntezowane. W efekcie układ nie zawsze poprawnie działa. Rozwiązaniem tego problemu jest dodanie wyjść (o charakterze diagnostycznym) połączonych z tymi liniami (jak na rysunku poniżej) lub wykonanie symulacji idealnej (zaznaczenie podczas kompilacji w menu Processing opcji Functional SNF Extractor).



  4. Zadania do samodzielnego wykonania
    Każdy zespół musi pobrać pliki schematów układów (lab4.gdf, lab4_ster.gdf, lab4_ster.mif oraz test-lab4.gdf), które należy zapisać z tym samym katalogu pod wymienionymi wcześniej nazwami. Przed przystąpieniem do symulacji w komponencie LPM_ROM w układzie LAB4_STER należy ustawić właściwą wartość parametru LPM_FILE (dostęp do parametrów uzyskujemy przez dwukrotne kliknięcie na komponencie), tzn. należy ustawić ścieżkę i nazwę pliku MIF (podobnie jak to miało miejsce w prezentacji). Następnie należy wybrać typ urządzenia na układy z rodziny FLEX.
    Po wykonaniu powyższych czynności trzeba stworzyć plik symulacji, podobny do prezentowanego poniżej, tzn. kod każdego rozkazu musi znajdować się na magistrali IR przez 4 cykle (w przykładzie zostały zamiesczone trzy istruckje: A = 11001100, WY = A oraz R0 = 11000000):



    Ćwiczenia:
    1. Wykonać symulację rozkazu (dla l1l0 = 00 i 01 oraz możliwych kombinacji aa i bb): Rl1l0 = Raa+Rbb oraz A = A-L
    2. Wykonać symulację rozkazu (dla l1l0 = 00 i 01 oraz możliwych kombinacji aa i bb): Rl1l0 = Raa-Rbb oraz A = 0 i A = not A
    3. Wykonać symulację rozkazu (dla wszystkich możliwych kombinacje parametrów): Rl1l0 = not Rl1l0
    4. Wykonać symulację rozkazu (dla wszystkich możliwych kombinacje parametrów): Raa = Raa+L
    5. Wykonać symulację rozkazu (dla wszystkich możliwych kombinacje parametrów): Raa = Raa-L
    6. Wykonać symulację rozkazu (dla wszystkich możliwych kombinacje parametrów): Raa = L i Rl1l0 = 0
    7. Wykonać symulację rozkazu (dla l1l0 = 10 i 11 oraz możliwych kombinacji aa i bb): Rl1l0 = Raa+Rbb oraz A = A+L
    8. Wykonać symulację rozkazu (dla l1l0 = 10 i 11 oraz możliwych kombinacji aa i bb): Rl1l0 = Raa-Rbb oraz A = L