Sida 2 av 2

Postat: 30 augusti 2007, 14:33:20
av Chribbe76
ADD3-algoritmen som oJsan länkade till är samma som jag beskrev.
I deras fall adderas talen med 3 om talen är >=5, men i mitt fall adderas talen med 3 och om bit 3 är satt(vilket betyder >=8 ) så sparas värdet.

Jag förstår verkligen inte varför det fungerar. :wall:

Postat: 31 augusti 2007, 11:25:17
av exile
Det är faktiskt inte så krångligt som du tror.

Ett sätt att omvandla ett 4bitars tal är att "låta" den slå över när talet är större än 10, genom att addera 6 (16-10 basen)

exempel:

Kod: Markera allt

bin		=> BCD
b0000		=> b0000 0000	,0 0
b0001		=> b0000 0001	,0 1
b0010		=> b0000 0010	,0 2
b0011		=> b0000 0011	,0 3
b0100		=> b0000 0100	,0 4
b0101		=> b0000 0101	,0 5
b0110		=> b0000 0110	,0 6
b0111		=> b0000 0111	,0 7
b1000		=> b0000 1000	,0 8
b1001		=> b0000 1001	,0 9
b1010 + b0110	=> b0001 0000	,1 0
b1011 + b0110	=> b0001 0001	,1 1
b1100 + b0110	=> b0001 0010	,1 2
b1101 + b0110	=> b0001 0011	,1 3
b1110 + b0110	=> b0001 0100	,1 4
b1111 + b0110	=> b0001 0101	,1 5
låt oss kolla på 9 och 10
b1001 + b0110 => b1111 ,"9" som du ser här "sätts" inte bit 4 när man addera 9 + 6 (vilket blir F hex)
vilket gör att man kan man kan testa om det är 10 eller högre genom att addera 6 och kolla bit 4.(vilket snabbt kollat på AVR,PIC mm)

Nu är inte så "roligt" att ha bit 4 att kolla på efter som den hamnar utan för "fyra" bitarna (skulle hamna i carry i en 4bit procesor)
Men det går att ganska enkelt att lösa, som du ser så påverkas inte "sista" vilket beror på att man har en gemensamma nämnare mellan de två baserna 10 och 16 nämligen 2
så man kan helt enkelt dela 2 först (en skiftning).

Det ger att man addera 3 istället och titta på bit 3, Det ger en "klar" fördel genom att man alldrig behöver kolla eller ta hänsyn till Carryn.

hoppas att det förklarade lite gran ^^

Postat: 31 augusti 2007, 14:51:11
av persika
Intressant med ADD3-algoritmen, undras om den går att köra "baklänges", för att kunna konvertera BCD -> binär ?

Postat: 31 augusti 2007, 23:41:11
av exile
Ja, kanske men troligt vis är den mindre "effektiv" mot andra algoritmer för omvandlingen BCD till bin.

Exempel:
varje bit i ett BCD kan mapas till ett värde vilket ger en bit test och en addition om den är sant.
Detta ger snabb omvandling med hyfsat lite kod. exempel "5st BCD" till ett 16bitar tal tar ca 65 instruktioner.

Detta kan jämföras med en ADD3 16bitar till BCD som tar 136 instruktioner + ret optimmerad (loop unrolling, samt lite annat)...

Postat: 7 september 2007, 08:06:45
av ucadv
varför krångla till det???

Kod: Markera allt

integer'image( mitt_tal );
integer'image( to_integer( min_unsigned) );
integer'image( conv_integer(min_std_logic_vector) );