22. november 2005 - 16:34Der 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:
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 :).
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 :).
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) }
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.
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.