Avatar billede kaydk Nybegynder
22. november 2005 - 16:34 Der er 12 kommentarer og
3 løsninger

binær til decimal - algortime søges

Jeg har fire 7-segments display på en fpga kreds.

Disse styre vha. af variablerne s1, s2, s3, s4.

På disse kender jeg bit-kombinationen, som udskriver:

0, 1, 2, 3, 4, 5, 6, 7, 8 og 9

Jeg har brug for en snedig algoritme, som kan udskrive en 8-bit lang binær integer værdi til en decimal tal på displayene.

2^8 = 256.

F.eks. hvis jeg sender 11111111 afsted, så skal der stå 256 på displayet, sender jeg 00000011, så skal der udskrives 3 på displayene.

Nogen som har lavet noget lignenden som kan hjælpe?

Det skal implementeres i VHDL, sproget indeholder de kendte if, then, else, +, -, /, * modulus osv. Det er ikke nødvendigt at kende sproget, det jeg har brug for er en algoritme. Jeg kan selv omsætte til VHDL.

-----------

Den nemmeste og mindst effektive måde at løse problemet på er at lave en lookup tabel, som indeholder alle kombinationerne:

00000000b = 0
00000001b = 1
00000010b = 2
00000011b = 3
....
....
....
11111111b = 256

Men det er vel og mærke ikke særlig effektivt at skulle løbe tabellen igennem hver gang.

-------------

Jeg ved også godt det er nemmere, hvis det istedet skulle omsættes til hexadecimal, men jeg har brug for er i decimal tal, håber der er en kvik hoved herinde :).
Avatar billede roenving Novice
22. november 2005 - 16:51 #1
Hvorfor laver du ikke bare en simpel løkke, som tager bageste binære ciffer, ganger med 1 + næstbageste ganget med 2 osv.

-- hvis det skal være snedigt, kan du også bruge potenser af 2 eller vedligeholde en faktor, som så fordobles for hvert ciffer !-)
Avatar billede kaydk Nybegynder
22. november 2005 - 16:57 #2
Kan du ikke komme med et eksempel. Altså være lidt mere specifikt. Tak tak. Det skal heller ikke være vildt snedigt, bare lidt smartere end at lave en lookup tabel :).
Avatar billede jakoba Nybegynder
22. november 2005 - 17:24 #3
Kender ikke VHDL, men mon ikke du kan bruge algoritmen her:

subroutine  lavDecimaltArray( byteVærdi )  // returns decimal byte array
{
    variabel byte[] resultat = { 0, 0, 0 };
    variabel integer i = 0;       
    while( byteVærdi > 0 ) {
        resultat[i] = byteVærdi modulus 10;
        byteVærdi = floor( byteVærdi / 10 );
        i = i +1;
    }
    return resultat;
}
Avatar billede jakoba Nybegynder
22. november 2005 - 17:25 #4
ps:  11111111 er IKKE 256. det er kun 255 :-))
Avatar billede kaydk Nybegynder
22. november 2005 - 17:28 #5
Kan jeg ikke få pseudokoden istedet for, det er ikke til at læse mig ud af din kodestump. :).
Avatar billede kaydk Nybegynder
22. november 2005 - 17:42 #6
roenving; jeg kan godt se din ide

jakoba; jeg kan ikke se ideen i koden
Avatar billede olebole Juniormester
22. november 2005 - 17:43 #7
<ole>

Det er lige præcis, hvad det er ... pseudokode, der burde forståes, uanset hvilket sprog, man koder i. Hvad er det, du ikke forstår?  :)

/mvh
</bole>
Avatar billede kaydk Nybegynder
22. november 2005 - 17:48 #8
Hvad betyder?

variabel byte[] resultat = { 0, 0, 0 };

dividere du med 10 (decimal) eller 2 (decimal)?
resultat[i] = byteVærdi modulus 10;

floor betyder vel runde ned?
byteVærdi = floor( byteVærdi / 10 );
Avatar billede driis Nybegynder
22. november 2005 - 20:52 #9
variabel byte[] resultat = { 0, 0, 0 };
= Opret array af bytes til returværdi
resultat[i] = byteVærdi modulus 10;
= resultat, index i, er lig resten, når byteVærdi divideres med 10 decimalt
byteVærdi = floor( byteVærdi / 10 );
= divider byteVærdi med 10 decimalt, smid resten væk (så hvis byteVærdi før var 255 er den nu 25)

I C hvis du vil afprøve det, eller har det bedre med den syntax:

void int2dec(int val, char *dest)
{   
    int i = 0;
    while( val != 0 )            // når val er 0, er vi færdige
    {
        dest[i++] = val % 10;    // modulo 10 - resultat er resten ved division med 10
        val /= 10;                // divider med 10 (heltalsdivision, rest forsvinder)
    }
   
}
Avatar billede jakoba Nybegynder
23. november 2005 - 06:14 #10
Mon ikke det er fordi VHDL ikke er 'vores' normale sekventielle programmeringssprog
VHDL står for
  (V)ery High Speed Integrated Circuit (H)ardware (D)escription (L)anguage

Så jeg gætter på det skulle snarere være noget i retning af

entity div_mod is
    port(
      inval:              in  integer range 0 to 255;
      mod:                out integer range 0 to 9;
      div:                out integer range 0 to 255 );
end div_mod;

architecture  dm of div_mod is
begin
  mod  <= inval modolo 10;
  div  <= inval / 10;
end dm:

Og så skal 3 sådanne dm'er sættes efter hinanden så de 3 mod værdier går til dine 3 7-segment displays, og div værdien fra den første bruges som inval værdi in den anden, osv.
Avatar billede kaydk Nybegynder
23. november 2005 - 12:22 #11
Tak for svaret. Giv et svar, så får i pointerne. Pointfordeling:

jakoba 130
driis 50
roenving 20

jakoba jeg prøver at implementere din løsning senere.
Avatar billede driis Nybegynder
23. november 2005 - 18:20 #12
svar
Avatar billede jakoba Nybegynder
23. november 2005 - 19:56 #13
ok.
Avatar billede roenving Novice
23. november 2005 - 19:58 #14
Oki '-)
Avatar billede roenving Novice
23. november 2005 - 20:20 #15
-- og tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester