Hallo!
Habt ihr eine Idee wie man am geschicktesten eine 10 Bit Zahl mit einem
8 Bit µC addiert? Ich hab mir da sowas vorgestellt, dass ich die 8 LSB
in einem Register schiebe und die 2 MSB in ein anderes und mit den LSB
rechne. Falls da bei einer Addition ein Übertrag entstehen würde löst
dieses eine weitere Addition (Increment) in dem Register mit den MSB
aus.
Könnte das effizient umgesetzt werden oder habt ihr vielleicht bessere
oder andere Vorschläge?
Vielen Dank schon mal =)!
Welcher µC und welche Programmiersprache(C, ASM , ..).
Ansonsten für ASM ist deine OK schon gut. Einfach immer LSB Register
addieren mit add (falls AVR) und MSB Register addieren mit adc (falls
AVR).
Gruß
Mit der C Programmiersprache ist das kein Problem. Dort sind die integer
alle mindestens 16 bit groß (auch auf einem 8 Bit uC) und deine 10 Bit
haben locker Platz.
Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel
addierst.
...Einfach immer LSB Register
addieren mit add (falls AVR) und MSB Register addieren mit adc (falls
AVR)...
Muss es nicht gerade umgekehrt sein? Kann ich mir gerade nicht
vorstellen, wozu die MSB mit Carry addiert werden sollen...
...Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel
addierst...
Naja hab aber dann auf jeden Fall Platz verschwendet. Knausere mit den
Bits ;)...
>> Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel>> addierst...> Naja hab aber dann auf jeden Fall Platz verschwendet. Knausere mit den> Bits ;)...
Äh, nein, ob du nun 1 16 Bit benutzt oder 2 8 Bit, macht keinen
unterscheid. Oder hast du einen µC mit 2 Bit breiten Registern?
>> Und dein Programm wird auch nicht langsamer, nur weil Du 6 Bit zuviel>> addierst...> Naja hab aber dann auf jeden Fall Platz verschwendet. Knausere mit den> Bits ;)...
Äh, nein, ob du nun 1 mal 16 Bit benutzt oder 2 mal 8 Bit, macht keinen
Unterschied. Oder hast du einen µC mit 2 Bit breiten Registern?
Upps, da habe ich wohl ein Format-Befehl gefunden. ;-)
Doch, ich verschwende Platz, weil ich die restlichen Bits für andere
Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim
Addieren verloren habe. Der µC muss so klein wie möglich werden.
>Doch, ich verschwende Platz, weil ich die restlichen Bits für andere>Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim>Addieren verloren habe. Der µC muss so klein wie möglich werden.
Ich würde dir dringend raten, als Zustandsmerker einer FSM eine eigene
(achtBit)Variable zu verwenden.
Erdin wrote:
> Doch, ich verschwende Platz, weil ich die restlichen Bits für andere> Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim> Addieren verloren habe.
Das ist Quatsch mit Soße.
Wenn Du ne 10Bit-Addition machst, brauchst Du 11Bits für das Ergebnis.
Die restlichen 5 Bits kannst Du meinetwegen für sonstwas benutzen, die
werden durch die Addition nicht verändert.
> Der µC muss so klein wie möglich werden.
O.k., kleiner als ein ATtiny85 (4*4mm²) geht kaum noch und der hat 32
Byte Register + 512 Byte SRAM.
Da muß man sich nicht gleich wegen 5 Bits (=0,1%) in die Hose machen.
Ich benutze oft für jedes Flag ein ganzes Byte, weil das Flash und Zeit
spart.
Peter
>> Der µC muss so klein wie möglich werden.>> Ich würde dir dringend raten, als Zustandsmerker einer FSM eine eigene> (achtBit)Variable zu verwenden.
Wozu? Wenn er nur ein Bit braucht verschwendet er über 85% wenn er dafür
ein Byte belegt. Mir erschließt sich daher der Sinn nicht.
> Doch, ich verschwende Platz, weil ich die restlichen Bits für andere> Sachen (z.B. Statusbits einer FSM)nutzen will und diese nichts beim> Addieren verloren habe. Der µC muss so klein wie möglich werden.
Ob du nun die sechs Bits aus einer 8 Bit Variable nutzt oder aus einer
16 Bit, mit beidem kannst du dir ordentlich in den Fuß schießen.
Rest siehe lippy.
Ich werde vermutlich aber nicht drumrum kommen mir in einem 8 Bit
Register mehrere Variablen abspeichern zu müssen. Übrigens benötige ich
keinen fertigen µC (dann wär ja der Witz verloren), sondern ich bin auf
der Suche nach einem Softcore bei dem ich dann alles unnötige
rausschmeißen will um die Chip-Area so klein wie möglich zu kriegen.
Erdin wrote:
Muss es nicht gerade umgekehrt sein? Kann ich mir gerade nicht
vorstellen, wozu die MSB mit Carry addiert werden sollen...
Nein das ist schon richtig so wie ichs geschrieben habe. LSB's mit add
und MSB's mit adc.
Gruß
Ich stelle mir das aber so vor, dass ich nicht immer die MSB rechnen
muss. Sondern nur dann, wenn in den LSB ein Übertrag entstünde. Deswegen
dachte ich ich nehm bei den LSB adc und falls das Carry gesetzt wird,
soll er bei MSB einfach inc machen. Ich möchte mit so wenig Befehlen wie
möglich auskommen. Jede unnötige Addtion kostet unnötig Strom und somit
Geld :).
>ch stelle mir das aber so vor, dass ich nicht immer die MSB rechnen>muss. Sondern nur dann, wenn in den LSB ein Übertrag entstünde. Deswegen>dachte ich ich nehm bei den LSB adc und falls das Carry gesetzt wird,>soll er bei MSB einfach inc machen. Ich möchte mit so wenig Befehlen wie>möglich auskommen. Jede unnötige Addtion kostet unnötig Strom und somit>Geld :).
Das funktioniert nicht, da ja das MSB (auch wenns nur 2bit sind) auch
addiert werden muss.
Beispiel: 257 + 510
Highbyte Lowbyte
510: 1 254
257: 1 1
-----------------------------
767 2 255 (kein Übertrag)
Wenn du das Highbyte ignorieren würdest, käme 1:255 = 511 heraus...
> Übrigens benötige ich keinen fertigen µC (dann wär ja der Witz verloren),> sondern ich bin auf der Suche nach einem Softcore bei dem ich dann alles> unnötige rausschmeißen will um die Chip-Area so klein wie möglich zu> kriegen.
Und das ganze wird eine Rakete, die zum Mond fliegt ...
Mein lieber Mann, ohne dich beleidigen zu wollen, aber jemand der noch
nicht soviel von der Programmierwelt gesehen hat um zu wissen wie man 10
Bit Variable addiert, sollte vielleicht am Anfang kleinere Brötchen
backen.
Außerdem frißt ein Softcore auf einem FPGA in jedem Fall mehr Strom als
ein kleiner Prozessor den man Schlafen schicken kann.
Es sei denn, Du bist reich genug un Dir ein ASIC machen zu lassen ...
Wie man ne 10 Bit Zahl addiert weiß ich schon, und dass man bei den MSB
aufpassen muss auch. Aber bei meinem Projekt gehe ich davon aus, dass
sich zwei aufeinanderfolgende Zahlen die es zu addieren gilt nicht
soweit von einander entfernt sind, dass sich ihre zwei MSB
unterscheiden. Nur falls im LSB-Bereich ein Carry auftaucht will ich das
in die MSB addieren. Ich stelle mir das also als ne Art Mini-Interrupt
vor.
> Nur falls im LSB-Bereich ein Carry auftaucht will ich das> in die MSB addieren. Ich stelle mir das also als ne Art Mini-Interrupt> vor.
Das kommt aber auch darauf an, wie oft das 'MSB-Byte' geändert wird, die
Auswertung, ob Carry gesetzt/nicht gesetzt braucht ja auch Rechenzeit.
Ich habe starke Zweifel, dass das wirklich was bringt, sowas endet
schnell im VerschlimmBessern.
Da hast du Recht. Ich bin halt gerade am Überlegen was sich am meisten
lohnt und was im Mittel weniger Rechenauwfand ist. Einfach jedes Mal
addieren oder nur im Notfall addieren aber überprüfen.
Sehe gerade im Instruction Set vom 8051 dass JC 24 Takte aber ADD nur 12
Takte braucht. Dann addiert man doch lieber immer und verhaspelt sich
dann nicht mit dem Rumspringen...
Das wäre natürlich die beste Variante, aber diese kostet zuviel Geld.
Müssten ja ein völlig neues Design machen. Lieber ein fertiges Kaufen
und das unnötige rausschmeißen (und dabei sowas in Kauf nehmen). Einen
16 Bitter zu nehmen wäre aber totale Platzverschwendung...
Naja... bevor du dir über sowas Sorgen machst schau erstmal nach nem
Softcore wo du all sowas "rausschmeißen" kannst...
Außerdem ist es so, das meistens der Test auf carry ebenso lange dauert
wie eine addition (und wenn das carry da ist muß man dann auch
addieren...) so das man sich nix spart.
Aber den Adder zu ändern ist doch auch schon ziemliche viel Aufwand.
Müsste jede Pipeline-Stufe ändern. Ich könnte zwar eine neue
Mirkoinstruktion basteln, aber die würde ja wieder 2 8-Bit Additionen
machen...
Habe schon 9 Cores gefunden, die sich konfigurieren lassen... Ich habs
ja oben gerade angemekrt, dass JC länger braucht als ADD also der Ansatz
nicht gut war.
Deine Randbedingungen sind denjenigen nicht bekannt, die Dir hier
antworten. Wenn Du Dein ganzes Projekt (mit Zielen und Constraints)
erklärst, bekommst Du treffendere Antworten!
Erklär doch erstmal was das ziel ist...
Also das man Platz/Strom spart durch so ein bitgefummel wäre mir neu.
Wenns echt aufs lezte Bit ankommt kann man doch gleich ne eigene kleine
Architektur dafür bauen. Viele Cores sind z.B. nicht derart offen das du
da überhaupt was machen kannst an der ALU.
Und wie gesagt... 2 8-Bit addidionen sind (in den allermeisten Fällen)
schneller als ein Vergleich auf Carry und bedingter Sprung! D.h du
gewinnst genau nix außer das es extrem wartungsunfreundlich wird und
fehleranfällig.
Danke!
Das ist mal ne Aussage :)! Jo mittlerweile teile ich auch deine
Meinung... Werde bestimmt nicht auf die Idee kommen und mir nen Krampf
machen, nur um dann noch langsamer zu sein ^^.Komme wohl nicht drumherum
2 Additionen machen zu müssen.
Vielen Dank!
Mache jetzt Feierabend!
> <ganz_dumme_Frage>> Was ist eigentlich ein Softcore?> </ganz_dumme_Frage>
Das ist eine fertige Beschreibung einer Komponente in einer HDL (VHDL
oder Verilog). Das kippst du in ein FPGA und hast dann z.B. einen
Prozessor.
>> <ganz_dumme_Frage>>> Was ist eigentlich ein Softcore?>> </ganz_dumme_Frage>> Das ist eine fertige Beschreibung einer Komponente in einer HDL (VHDL> oder Verilog). Das kippst du in ein FPGA und hast dann z.B. einen> Prozessor.
Ach so, danke für die Info.
Ist dann der Bereich "Mikrocontroller und Elektronik" nicht falsch?
Müsste dann ja eher nach "FPGA, VHDL & Co.". Obwohl, sowas klappt in
Foren ja eh nie. ;-)
...Ist dann der Bereich "Mikrocontroller und Elektronik" nicht falsch?
Müsste dann ja eher nach "FPGA, VHDL & Co.". Obwohl, sowas klappt in
Foren ja eh nie. ;-)...
Also ich fand dieses Forum treffender, da es ja nicht drauf ankommt ob
es ein Soft- oder Hardcore (wird ja später ein echter ASIC) ist, sondern
dass es sich hier um einen µC handelt der mit Assemblerbefehlen
gefüttert wird und hier nur um die Effizienz von Vorgehensweisen
philosophiert wurde.
Aber danke für eure Hilfe! =)