Binär multiplikation?
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Binär multiplikation?
Hej, jag håller på att design en semi automatisk dator (ALU + instruktion av-kodare + Minne)
Och självklart skriver jag en kompilator.
De funktioner jag har inbyggda i ALU:n är:
nop
exit
and
or
xor
not
add
inc
slc (Shift Left)
src (Shift Right)
sln (Shift Left discard)
srn (Shift Right discard)
Med discard medar jag att:
SRN 0111 = 0011
Men:
SRC 0111 = 1011
Ioch med att den nu styrs manuellt kan jag inte göra programhopp (if-satser)
Så till problemet, hur gör jag för att räkna ut tex 3*4?
Jag har googlat lite och hittade detta:
http://en.wikipedia.org/wiki/Binary_num ... iplication
Men det bygger på att jag måste kolla om en position i A=0 eller 1 vilket jag inte kan
Men jag har sett något krångligt schema med massa AND och ADD kretsar, de borde ju gå att simulera.
"datorn" har en 4-bitars data-buss om det hjälper något.
Tack på förhand //Victor
Föresten, coolt att man kan se temperaturerna i och utanför mitt rum på bilden va?
Och självklart skriver jag en kompilator.
De funktioner jag har inbyggda i ALU:n är:
nop
exit
and
or
xor
not
add
inc
slc (Shift Left)
src (Shift Right)
sln (Shift Left discard)
srn (Shift Right discard)
Med discard medar jag att:
SRN 0111 = 0011
Men:
SRC 0111 = 1011
Ioch med att den nu styrs manuellt kan jag inte göra programhopp (if-satser)
Så till problemet, hur gör jag för att räkna ut tex 3*4?
Jag har googlat lite och hittade detta:
http://en.wikipedia.org/wiki/Binary_num ... iplication
Men det bygger på att jag måste kolla om en position i A=0 eller 1 vilket jag inte kan
Men jag har sett något krångligt schema med massa AND och ADD kretsar, de borde ju gå att simulera.
"datorn" har en 4-bitars data-buss om det hjälper något.
Tack på förhand //Victor
Föresten, coolt att man kan se temperaturerna i och utanför mitt rum på bilden va?
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Alltså du får kolla bit för bit i så fall.
Ta första biten i B och ANDa samtliga bitar i A med den, spara resultatet i C.
Ta andra biten i B och ANDa samtliga bitar i A med den, shifta left 1, addera resultatet till C
Ta tredje biten i B och ANDa samtliga bitar i A med den, shifta left 2, addera resultatet till C
Ta fjärde biten i B och ANDa samtliga bitar i A med den, shifta left 3, addera resultatet till C
Typ nått sånt
Ta första biten i B och ANDa samtliga bitar i A med den, spara resultatet i C.
Ta andra biten i B och ANDa samtliga bitar i A med den, shifta left 1, addera resultatet till C
Ta tredje biten i B och ANDa samtliga bitar i A med den, shifta left 2, addera resultatet till C
Ta fjärde biten i B och ANDa samtliga bitar i A med den, shifta left 3, addera resultatet till C
Typ nått sånt
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Okej..
Det blir mycket shiftande fram och tillbaka.
Jag får väll sitta och koda ett tag.
Men tack!
Edit:
Det blev redan för mycket kod och efter som jag har enorma 4 Byte minne så blir det svårt att lagra annat är temporär data.
Jag får bygga den hårdvaru mässigt och skippa Exit instruktionen.
Så har du länken till schemat?
Det blir mycket shiftande fram och tillbaka.
Jag får väll sitta och koda ett tag.
Men tack!
Edit:
Det blev redan för mycket kod och efter som jag har enorma 4 Byte minne så blir det svårt att lagra annat är temporär data.
Jag får bygga den hårdvaru mässigt och skippa Exit instruktionen.
Så har du länken till schemat?
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Jag "lekte" med detta i sin tid, fast då på Z80.
Du kan ju tydligen göra vissa funktioner men att inte ha en conditional (if) med gör att din maskin bara är en state-mashine, det som utmärker en processor är just att den kan välja väg beroende på en status (på något vis).
Och med 4 registerplatser blir det besvärligt, som jag ser det behöver du rent omedelbart minst 5 st.
Du kan ju tydligen göra vissa funktioner men att inte ha en conditional (if) med gör att din maskin bara är en state-mashine, det som utmärker en processor är just att den kan välja väg beroende på en status (på något vis).
Och med 4 registerplatser blir det besvärligt, som jag ser det behöver du rent omedelbart minst 5 st.
-
victor_passe
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Jag har 4 byte minne. och 4-bitars dator. så 8 register platser.
ALU:n använder A,B
Sedan finns c-code på den. men ännu bara i lysdiod form.
När jag hittar ett lämpligt minne (8-bitar data och 8-bitar address som inte kostar 100.000:-)
Så ska jag bygga så man kan programera den och jag har reserverat plats för 4 typer av programhopp som det är nu:
Om A=B hoppa 1-16 rader fram
Om A>B hoppa 1-16 rader fram
Om A=B hoppa 1-16 rader bak
Om A>B hoppa 1-16 rader bak
ALU:n använder A,B
Sedan finns c-code på den. men ännu bara i lysdiod form.
När jag hittar ett lämpligt minne (8-bitar data och 8-bitar address som inte kostar 100.000:-)
Så ska jag bygga så man kan programera den och jag har reserverat plats för 4 typer av programhopp som det är nu:
Om A=B hoppa 1-16 rader fram
Om A>B hoppa 1-16 rader fram
Om A=B hoppa 1-16 rader bak
Om A>B hoppa 1-16 rader bak
"Shift utan discard" som du har brukar annars kallas "rotate". (ROR/ROL)
Denna kretsen multiplicerar två fyra bitars tal, och ger ett resultat i åtta bitar. Det här sätter jag ihop själv i huvet just nu, så jag tar förbehållande för evt fel:
Bit 0 av A går in på fyra AND-grindar. Den andra ingången på grindarna går till bitarna 0-3 på B. Det samma görs med bit 1-3 på A.
Nu har vi fyra grupper av AND-kretsar, låt oss kalla dom grupp 0-3, som ger ut varsitt 4-bitars tal. Tal 0 och 1 skickar vi in på en 4 bitars adderare således:
bit 0 på tal 0 går till carry in på adderaren, bitarna 1-3 går in på ingångarna A0-A2
bit 0-3 på tal 2 går in på ingångarna B0-B3.
Det samma gör vi med tal 2 och 3 på en annan 4 bits adderare.
Resultatet från dessa två adderare matas in i en 7 bits adderare, resultatet från tal 2 och 3 matas in förskjutet två platser åt vänster.
Resultatet kommer ut som ett åtta bitars tal (carry out på adderaren blir den åttonde biten).
Bygger du adderarna av separata grindar kan du spara lite eftersom inte alla ingångar används.
Har inte gjort sånt här på en stund, bra om nån kollar om det är rätt. Behövs det kan jag rita ett blockdiagram.
Denna kretsen multiplicerar två fyra bitars tal, och ger ett resultat i åtta bitar. Det här sätter jag ihop själv i huvet just nu, så jag tar förbehållande för evt fel:
Bit 0 av A går in på fyra AND-grindar. Den andra ingången på grindarna går till bitarna 0-3 på B. Det samma görs med bit 1-3 på A.
Nu har vi fyra grupper av AND-kretsar, låt oss kalla dom grupp 0-3, som ger ut varsitt 4-bitars tal. Tal 0 och 1 skickar vi in på en 4 bitars adderare således:
bit 0 på tal 0 går till carry in på adderaren, bitarna 1-3 går in på ingångarna A0-A2
bit 0-3 på tal 2 går in på ingångarna B0-B3.
Det samma gör vi med tal 2 och 3 på en annan 4 bits adderare.
Resultatet från dessa två adderare matas in i en 7 bits adderare, resultatet från tal 2 och 3 matas in förskjutet två platser åt vänster.
Resultatet kommer ut som ett åtta bitars tal (carry out på adderaren blir den åttonde biten).
Bygger du adderarna av separata grindar kan du spara lite eftersom inte alla ingångar används.
Har inte gjort sånt här på en stund, bra om nån kollar om det är rätt. Behövs det kan jag rita ett blockdiagram.
Angående binär aritmetik, kolla här hur man kan göra utan CPUer eller elektricitet.....
http://www.youtube.com/watch?v=GcDshWmhF4A
http://www.youtube.com/watch?v=md0TlSjIags
http://www.youtube.com/watch?v=GcDshWmhF4A
http://www.youtube.com/watch?v=md0TlSjIags
