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ß
µC und Sprache sind noch gar nicht festgelegt. Es geht nur um die prinzipielle Durchführbarkeit... Wie meinst du MSB mit ADC addieren?
Ach sorry... hatte gerade an einen ADC gedacht, da ich gerade damit zu tun hab :)! Jo danke. Habs gerafft! Vielen Dank!
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 ...
...Es sei denn, Du bist reich genug un Dir ein ASIC machen zu lassen ... Du hast den Nagel auf den Kopf getroffen :D!
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...
Wenn Du Dir sowieso einen Controller stricken willst, lege den doch gleich als 10-Bit Prozessor aus.
Außerdem kann man ja auf nem Softcore auch ne 10bit Addition einbauen die nur 10 bit nuzt und muß sich ums carry keine Gedanken machen ;)
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>
<ganz_dumme_Antwort> Sowas ähnliches wie Hardcore, halt nur weicher ... </ganz_dumme_Antwort>
> <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! =)
Na ich weiß nicht, ob das sinnvoll ist, in einem ASIC einen µC werkeln zu lassen...
Na kler ist das sinnvoll, wenn man vorhat ca. 20 Millionen Stück davon zu produzieren ;)!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.