Sida 1 av 1

Binär multiplikation?

Postat: 2 april 2008, 22:55:16
av victor_passe
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?

Postat: 2 april 2008, 23:05:42
av lundeholm
Varför kan du inte använda AND för att kolla en viss bit i A då?

edit: läste på wikipedia och det verkar ju rätt simpelt att utföra multiplikation ändå. Med massor av AND och ADD kan man ju som sagt få till det utan loopar

Postat: 2 april 2008, 23:12:50
av victor_passe
Men om jag tar tex 3*4:
0011
0100

Och AND:ar dem får jag:
0000
Och 0!=12

Edit:
Har du länken till det schemat?
jag har sett det men kan inte hitta det nu.

Postat: 2 april 2008, 23:18:47
av lundeholm
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

Postat: 2 april 2008, 23:24:30
av victor_passe
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?

Postat: 2 april 2008, 23:39:50
av lundeholm
4 byte är inte mycket, förstår att det blir tajt. Jag har tyvärr inget sånt schema, kan ingen elektronik, bara programmering :)

Postat: 2 april 2008, 23:49:49
av victor_passe
Okej. jag trode att du hade kollat på schemat som finns någonstans på wikipedia.
Aja, får väll leta då.
Tack i alla fall!

Postat: 3 april 2008, 09:05:40
av Icecap
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.

Postat: 3 april 2008, 09:16:53
av victor_passe
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

Postat: 3 april 2008, 16:53:03
av GalFisk
"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.

Postat: 3 april 2008, 20:46:03
av Raketost
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