W dzisiejszym, krótkim artykule zajmiemy się analizą ścieżki danych w pewnym układzie, którego schemat został zamieszczony poniżej (zap. z hector.tu.kielce.pl). Podczas przeprowadzania tej analizy bardzo przydatne będą mikroinstrukcje. Zastanawiasz się, co to jest? Dowiesz się za chwilę.

Czym jest ścieżka danych? Jest to zestaw jednostek funkcjonalnych (takich jak jednostki arytmetyczno-logiczne, multipleksery itd.), które po prostu przetwarzają dane.

Aby wpływać na przebieg ścieżki danych, możemy posługiwać się rozkazami procesora. Te rozkazy składają się z mniejszych części, które zwane są mikrooperacjami lub mikroinstrukcjami. Mikroinstrukcja to najmniejsza, niepodzielna operacja, która wykonywana jest przez mikroprocesor w jednym takcie zegara.

To, co znajduje się powyżej, to minimalna dawka teorii która jest potrzebna do poprawnej analizy rozwiązań poniższych zadań. Więcej teorii, której nie będę kopiował, znajduje się na hector.tu.kielce.pl.

Przeanalizujmy, jakie mikroinstrukcje mamy dostępne dla powyższego układu. Możemy sterować multiplekserami ADR1, ADR3 i ADR4. Przy tym pamiętajmy, że numeracja wejść/wyjść multipleksera zaczyna się od góry. Multipleksery w powyższym układzie posiadają jedynie dwa wejścia. Oznacza to, że jeśli na wejściu ADR podamy 0, to górna ścieżka zostanie przekazana na wyjście. W przeciwnym wypadku, gdy ADR danego multipleksera będzie równe 1, to zawartość dolnego wejścia zostanie przekazana na wyjście.

Kolejne mikroinstrukcje, które mamy dostępne w powyższym układzie to operacje na rejestrach. Jeśli LD jest ustawione na zero to zakładamy, że rejestr przekazuje na wyjście zawsze to, co sobie wcześniej zapamiętał bez względu na to, co podane jest na jego wejściu. Jeśli pin LD ustawimy w stan wysoki, to rejestr zapamiętuje sobie to, co dostał na wejście (dzieje się to w czasie narastającego zbocza sygnału zegarowego). Od tego momentu właśnie ta informacja jest przekazywana na wyjście.

Mikroinstrukcje – zadania

Zadanie 1

Zaczniemy ambitnie. Pierwszym zadaniem, które sobie postawimy będzie zapisanie tego, co otrzymaliśmy na wejściu do rejestru A. Zastanów się, jak musimy sterować trasą prądu, aby osiągnąć zamierzany cel.

Nasza informacja z wejścia całego układu musi trafić na wejście rejestru LDa. Górna ścieżka prowadzi do multipleksera ADR3, który jest połączony z wyjściem rejestru LD. Jest to ślepa uliczka. Nie warto nią podążać przy realizacji tego zadania.

Znacznie ciekawszą trasą będzie przekazanie sygnału przez multiplekser ADR i demultiplekser ADR2. Co musimy zrobić w pierwszym takcie zegara? Multiplekser ADR1 musi przekazać na wyjście to, co znajduje się na wejściu układu. Odpowiednią mikroinstrukcją będzie ustawienie 0 na wejściu ADR1.

Mamy naszą daną na wyjściu ADR1. Jest to jednocześnie wejście do demultipleksera ADR2. Jesteśmy już bardzo blisko celu. Musimy tylko przekazać naszą daną do rejestru A. Rejestr A jest podłączony do górnej ścieżki wychodzącej z demultipleksera ADR2. Więc, abyśmy osiągnęli swój cel, nasza mikroinstrukcja musi ustawić 0 na demultiplekserze ADR2. Demultiplekser ADR2 możemy ustawić w tym samym takcie procesora, co multiplekser ADR1. Dlaczego? Bo wstępnie założyliśmy, że multipleksery i demultipleksery działają natychmiastowo.

Na samym końcu musimy zapamiętać wartość w rejestrze A. Aby to wykonać, ustawiamy 1 na wejściu LDa.

Podsumujmy. Nasz rozkaz, zapisujący zawartość wejścia do rejestru A będzie miał następującą postać:

A = WE
t0: ADR1=0, ADR2=0
t1: LDA=1

sciezka_danych_dla_rozkazu_wy=a
Ścieżka danych dla rozkazu Wy=A

Zadanie 2

Drugie zadanie będzie nieco ambitniejsze. Spróbujemy do liczby, która znajduje się na wejściu, dodać zawartość rejestru B i wynik zapisać do B. Jak może wyglądać nasza ścieżka danych? Jakie mikroinstrukcje będą nam potrzebne?

Symbolicznie, treść naszego zadania to: B=WE+B.

Wejście jest połączone z multiplekserem ADR3. ADR3 decyduje o tym, czy do sumatora zostanie przekazana zawartość wejścia czy to, co jest zapamiętane w rejestrze A. Wejście układu jest podłączone do górnej ścieżki multipleksera ADR3. Naszą mikroinstrukcją, która będzie przekazywała to na wyjście będzie więc ADR3=0

Trafiliśmy do sumatora. Wynik działania rejestru B trafia do sumatora bez naszej inicjatywy. Sumator działa natychmiastowo (bez naszej inicjatywy), więc ta część pracy została już wykonana. Na wyjściu sumatora znajduje się rejestr Rwy. Aby wynik działania został przekazany dalej, musimy zapisać go w rejestrze Rwy. Więc kolejną mikroinstrukcją będzie LDrwy=1.

Mamy wynik działania WE+B. Teraz musimy zapisać go do rejestru B. Jak możemy to zrobić? Zauważmy, że od Rwy dołem idzie ścieżka, która łączy wyjście tego rejestru z dolnym wejściem multipleksera ADR1. Intuicja w tym momencie powinna podpowiadać ci, że kolejnym krokiem będzie odpowiednie wysterowanie tych dwóch układów. Aby wynik naszych działań trafił do rejestru B, multiplekser ADR1 musi wybrać dolną ścieżkę (ADR1=1), a demultiplekser musi wejście przekazać również na dolną ścieżkę (ADR2=1). Na końcu musimy zatrzasnąć nasz wynik w rejestrze.

Podsumowując, rozkaz B=WE+B będzie składał się z następujących mikroinstrukcji:

t0: ADR3=0
t1: LDrwy=1
t2: ADR1=1, ADR2=1
t3: LDB = 1

Uproszczony przebieg ścieżki danych dla zad 2
Uproszczony przebieg ścieżki danych dla zad 2

Podsumowując

Dzięki dwóm powyższym zadaniom, które zostały omówione krok po kroku powinieneś mieć ogólne pojęcie o tym, jak zabrać się za tego typu wyzwania. Pozostałe ćwiczenia wykonujemy analogicznie. Nie ma w tym nic trudnego.

Jeśli zauważysz jakiś błąd lub nieścisłość, masz trzy możliwości. Możesz zgłosić go za pomocą mojego fanpage’a na Facebooku, wysłać mi e-mail na adres podany w górnej części tej strony lub napisać komentarz. Życzę Powodzenia!

Jeden komentarz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *