mr.martin
Dołączył: 17 Sty 2008
Posty: 13
Przeczytał: 0 tematów
|
Wysłany: 28.02.2008 (Czw) 20:01 Temat postu: |
|
Rozwiązanie od usera chipek z forum wsti
Kod: |
mag. A ========================================================================
wyad ^ | wead ^ | wea ^ v wya ,----,
| v | | +-----+ +------+ |
+-----+ | | | A | |Z| AK | |
| D | | | +-----+ +------+ |
+-----+ | | | | mnoz2>| ^ | |
| | 100| 0fff| ode>| w| | |
wysa>| |<wyas | | dod>| e| | |<wyak
| | pisz>| PaO | hex>| a| | |
+-----+ | | czyt>| | bcd>| k| | |
| B | | | +-----+ +------+ |
+-----+ | | | S | | C | |
wybs | ^ webs | | +-----+ +------+ |
v | | v wys v ^ wes wec ^ v
mag. S =========================================================================
Najwazniejsze mikrosygnaly:
- wyak wyprowadzenie zawartosci AKumulatora na magistrale S
- weak skopiowanie C lub wyniku dzialania w ALU do AK (ALU to jednostka arytm.-logiczna)
- mnoz2 mnozenie zmiennoprzecinkowe razy 2, ja dopisalem ze zakladam ze nastepuje
mnozenie zawartosci C i potem nalezyc uzyc sygnalu weak zeby wprowadzic
wynik do AK, bo chyba rownie dobrze mogloby nastepowac mnozenie AK i od razu
tam zapamietywac wynik
- dod dodawanie C i A
- ode odejmowanie
- hex dzialanie jest wykonywane staloprzecinkowo
- bcd dzialanie jest wykonywane w kodzie BCD
PaO to pamiec operacyjna
mag. A to magistrala adresowa
mag. S to magistrala slowowa (danych)
rejestry sa 16-bitowe
...i wlasnie sie skapnalem ze powinienem napisac ze magistrale tez, ale moze on to powiedzial?
majac dane ze w rejestrze D jest liczba 100 dzisietnie, w B 154 (dziesietnie), i w komorce
pamieci nr 100 (dziesietnie) jest liczba 0fff (szesnastkowo) trzeba wykonac danej nizej rozkazy
i dzialania oraz podac co potem jest w jakich rejestrach i komorkach pamieci (co sie zmienilo).
Podane rozkazy nalezy tez zapisac za pomoca mikrosygnalow sterujacych.
1. ((D)) + ((D)) -> A dodawanie stalopozycyjne
2. (B) - (D) -> (A) odejmowanie BCD
3. 2 * (100) -> (B) mnozenie zmiennoprzecinkowe
ad.1.
(D)=100, ((D)) to zaw. komórki 100, czyli ((D))=0fff
x+x=2x wiec wystarczylo pomnozyc razy dwa, wiec przesunac bity w lewo o jeden (z prawej uzupelnic zerem)
mozna tez sobie dodac pisemnie:
0fff = 0000111111111111
+ 0000111111111111
------------------
0001111111111110 = 1ffeH
/
| ((D)) -> AK wyad, _wya_, czyt, wys, _wec_, _weak_
((D)) + ((D)) -> A <| ((D)) -> C czyt, wys, _wec_ (adres ciagle jest w A)
| ((D)) + ((D)), czyli C+AK hex, dod, _weak_
| (AK) -> A wyak, wysa, _wea_
\
W wyniku tego rozkazu zmienil sie glownie rejestr A, ale zapomnialem dopisac ze takze AK, C i S, ale
moze to juz by byla nadgorliwosc ;)
_wya_ - podkreslona nazwa sygnalu to sygnal impulsowy
wyak - bez podkreslenia to sygnal statyczny
ad.2.
(B)=154, (D)=100, w bcd to bedzie
154 = 0001 0101 0100
100 = - 0001 0000 0000
----------------
0000 0101 0100 = 54 w BCD, czyli 0036H
/
| (B) -> AK wybs, _wec_, _weak_
(B) - (D) -> (A) <| (D) -> C wyad, wyas, _wec_
| (B) - (D), czyli AK-C bcd, ode, _weak_
| (AK) -> (A) wyak, _wes_, pisz
\
W rej. A mielismy adres 1ffeH po poprzednim podpunkcie, i ta wlasnie komorka zmienila
swoja zawartosc na 0036H. Do tego oczywiscie S, AK i C ;)
ad.3.
Przy mnozeniu przez dwa wystarczylo zmniejszyc mantyse o 1. Ja niestety poszalalem, rozpisalem sie
i stracilem na dokladnosci (chociaz samo dzialanie zrobilem raczej dobrze i mam nadzieje, ze mi uzna).
|S| | | | | | | |S| | | | | | | |
mantysa | cecha << napisalem, ze przyjmuje 8 bitow na mantyse i 8 na ceche, zapis U2
2 = 2*2^1 (dziesietnie) = 10*2^0 (dwojkowo w U2) = 0,1*2^10 (dwojkowo w U2) = 01000000 00000010
(100) = 0fffH = 00001111 11111111 = (1/16+1/32+1/64+1/128)*2^(-1) = 15/128 * 1/2 = 15/256
mantysa cecha cecha mantysa
Przy mnozeniu liczb zmiennoprzecinkowych mnozymy mantysy i dodajemy cechy, wiec mi wyszlo:
mantysa = 15/128 * 1/2 = 15/256 = 00000111 (i tu stracilem na dokladnosci bo wypadla jedynka)
cecha = 2 + (-1) = 1 = 00000001
ostatecznie: 0000011100000001 = 0301H
A mozna bylo tylko zmienic ceche z -1 na 0, i nie ruszac mantysy. Wtedy by bylo:
0000111100000000 = 0f00H
/
| (100) -> C wyad, _wea_, czyt, wys, _wec_
2 * (100) -> (B) <| 2*(100) czyli 2*(C) mnoz2, _weak_
| (AK) -> (B) wyak, _wes_, wybs, wysa, _wea_, pisz
\
Do komorki 154 (dziesietnie) wpisalo sie 0f00H
|
Ostatnio zmieniony przez mr.martin dnia 01.03.2008 (Sob) 18:54, w całości zmieniany 1 raz
|
|