Hallo,

Als opdracht moet ik een ALU maken in VHDL en ik zit vast bij volgende bewerkingen:
a + b
a - b
b - a

Waarbij a en b inputs zijn van 4 bits (f is 4 bit output), en je flags hebt voor:
zf : zeroflaf
ovf : overflow flag
nf : negative flag
cf : carryflag

Waar ik compleet vast zit is bij: verschil carry en overflow bij optellen en aftrekken bij signed en unsigned getallen.

ik dacht er eerst aan om een 2 keer 4 bit getal op te tellen waar ik telkens een 0 voor zet zodat het resultaat een 5 bit oplossing is. waarbij de 5de bit de carrybit is en de andere 4 bits het resultaat.

en aftellen is: a - b = a + (2complement van b)

maar hoe zit het dan met negatieve getallen met elkaar optellen en aftrekken.
En hoe zit het met de carryflag en de overflowflag?
want ik weet echt niet wanneer er een overflow zich voordoet...

(de optelling is niet compleet af en ik gebruik http://en.wikibooks.org/wiki/VHDL_for_FPGA_Design/4-Bit_ALU als referentie)

ik hoop dat iemand me kan verder helpen!
Alvast bedankt!

[Bericht gewijzigd door kevin_ op (48%)]

Voor overflow kun je een bit extra gebruiken, wordt die 1, dan is het een overflow.

bv: 4 bits input dan sla je het resultaat op in 5 bits.

1101+0010=01111
1101+0011=10000

Ik denk dat carry en overflow hetzelfde zijn. Negatief kun je herkennen aan de MSB, 1->negatief 0->positief. Zeroflag is uiteraard als alle bits 0 zijn.

ik denk niet dat een carry en overflow gelijk zijn aan elkaar?
anders zou de opdracht voor 2 flags overbodig zijn?

en ik slaag inderdaad het resultaat op in een 5 bits resultaat waarbij de MSB gelijk is aan de carry (bij optelling)

echter snap ik niet wanneer er bij optellinge en aftrekking een carry of overflow plaats vind?

alvast bedankt,
Kevin

Een overflow treedt op wanneer je twee getallen bij elkaar optelt die niet in het gewenste aantal bits past. M.a.w. 15 bij 2 optellen en het resultaat in 4 bits stoppen gaat niet passen terwijl de afzonderlijke getallen wel in 4 bits passen.

Een carry treedt op bij het XOR'en (optellen) van bits. Dus als je 1101 (decimaal 13) optelt bij 1010 (decimaal 10) krijg je:
01101
01010
-----+
10111
Bij de msb (most significant bit) wordt 1 ge-XOR't met 1. Het resultaat is een 0 met carry. Deze carry komt bij de volgende optelling erbij. Aangezien er geen volgende optelling is (de meest linker bits zijn nul en kunnen dus worden weggelaten) komt deze carry erbij links.

EDIT 4:
de vragen die hier eerst stonden waren vrij nutteloos.

[Bericht gewijzigd door kevin_ op (94%)]