# ¿Como se hace un sumador restador con complemento a2 en VHDL?



## milo1092 (Sep 11, 2013)

he estado intentando varias formas de programar un restador con complemento a 2, pero no logro encontrar la forma correcta...¿alguien sabe alguna forma?,¿ o alguien que pueda orientarme?.
gracias de antemano. ...


----------



## chclau (Sep 11, 2013)

Pone un ejemplo de algo que hayas hecho hasta ahora, aunque sea un sumador, y de ahi te ayudamos

Lo que si, no tiene mucho sentido hablar de complemento a dos para UN bit, salvo si lo que estas diciendo es que el resultado es en complemento a dos. No es tan dificil, plantea la tabla de verdad de un restador de 1 bit menos otro bit y su resultado en complemento a dos.

En decimal seria

0 - 0 = 0
1 - 0 = 1
1 - 1 = 0
0 - 1 = -1


----------



## milo1092 (Sep 12, 2013)

Gracias, es cierto...investigue mas y tienes razón.


----------



## huaweideos (Nov 13, 2013)

Hola que tal. Espero que me puedan ayudar ya que soy nuevo en descripción vhdl.
Me dejaron hacer un sumador restador con 2 entradas  A y B  de 3 bits cada uno, con complemento a2 y una entrada de selección OP para decidir que se debe hacer sumar a restar.
Esto es lo que tengo espero que lo puedan checar. ¿Necesito utilizar el carry? 


```
library IEEE;
use IEEE.STD_LOGIC_1164.all;   
use IEEE.STD_LOGIC_UNSIGNED.ALL;  --}} usamos esta librería para poder restar    
use IEEE.STD_LOGIC_ARITH.ALL;

entity sum_res_a2 is
     port(
         OP : in STD_LOGIC;                         --}} entrada de selección 1= suma 0 = resta
         a : in STD_LOGIC_VECTOR(2 downto 0);
         b : in STD_LOGIC_VECTOR(2 downto 0);
         S : out STD_LOGIC_VECTOR(2 downto 0);
         carry  :out  STD_LOGIC     --}}
         );
end sum_res_a2;



architecture sum_res_a2 of sum_res_a2 is
begin
-- enter your statements here --
process (OP)
begin  
    if OP = \'1\' then  S <= (not(a + b )+ \'1\') ;     --}}negamos a + b y le sumamos 1 para obtener el complemento a2 
           
       elsif OP = \'0\'  then S <= (not(a - b )+\'1\');     --}}negamos a - b y le sumamos 1 para obtener el complemento a2

    end if;
    end process;

end sum_res_a2;
```


----------



## chclau (Nov 14, 2013)

Unas cuantas premisas para que vayas corrigiendo:

1) Los numeros en complemento a dos no necesitan que les hagas ninguna conversion. Ya vienen en complemento a dos. Sabes lo que es?

2) Tenes que usar tanto carry in como carry out. Y no solo declararlos como puertos, sino tambien usarlos

3) No podes poner un proceso que sea sensible solo al tipo de operacion, porque si cambian los operandos el proceso no se ejecuta. Al menos la simulacion sera erronea.

Fijate de mejorar el codigo con esas observaciones, y lo comentamos cuando lo repostees


----------



## Meta (Nov 20, 2013)

Hola:

En el libro www.pic16f84a.org pone en asm.

*Negar W. *Hallando su complemento a 2, es decir, restándole de cero.


```
sublw 0    ; ya que 0-(W) = - (W)
```
¿Es lo que buscas?

¿Para qué lo necesitas realmente? _(Pregunta opcional y de curiosidad)._

Aquí hay más información para artarte.



```
[B] Números reales en base 2


[/B]Sea [I]x[/I]  un cierto número real que queremos expresar en base 2 de tal forma que  una computadora pueda entenderlo y realizar operaciones con él.  

[CENTER][URL="http://3.bp.blogspot.com/_eIJeqkWC_Ug/S2i6tBcoufI/AAAAAAAAAFk/I3noYnAr29k/s1600-h/binario_matrix.jpg"][IMG]http://3.bp.blogspot.com/_eIJeqkWC_Ug/S2i6tBcoufI/AAAAAAAAAFk/I3noYnAr29k/s320/binario_matrix.jpg[/IMG][/URL]

[/CENTER]
 Tenemos distintas formas de representar [I]x[/I] en base 2. Según como sea [I]x[/I], nos convendrá utilizar una u otra representación.  Binario  El caso más fácil es cuando [I]x[/I] es un número entero positivo. Lo que hacemos es usar la notación binaria a la que estamos acostumbrados.  Ejemplo: Supongamos como ejemplo que [I]x[/I]=13. Si para representarlo en binario decidimos utilizar 4 bits, lo representaríamos como:  [CENTER]1310=11012[/CENTER]
 Pues: 11012=(1.20+0.21+1.22+1.23)10=(1+4+8)10=1310.  Complemento a 2  Otro caso parecido al anterior es cuando [I]x[/I] es entero pero negativo.  En este caso lo usual es utilizar la representación por "complemento a  2". En este tipo de representación, el bit más significativo representa  el signo del entero [I]x[/I] que estamos representando y los restantes bits sirven para codificar la magnitud de dicho entero.  El bit de signo es tal que: 
[LIST]
[*]bit signo = 1 si [I]x[/I] es negativo
[*]bit signo = 0 si [I]x[/I] es positivo
[/LIST]
Ejemplo: Tomemos como ejemplo [I]x[/I]=−5 y supongamos que nuestra computadora solo nos permite utilizar 4 bits para representarlo.  El bit de signo deberá ser 1 pues [I]x[/I]  es negativo. Por otro lado la magnitud a codificar es 5. Para codificar  esta magnitud nos quedan 3 bits. La codificación de la magnitud la  realizamos de la siguiente forma: 
[LIST=1]
[*]Expresamos la magnitud en binario usando los 3 bits que nos quedan disponibles. En este caso 510=1012 en binario.
[*]Luego hallamos el complemento a 1 de la expresión anterior. Esto es,  invertimos todos los bits de la expresión anterior de tal forma que si  un bit vale 1, ahora pasa a valer 0 y a la inversa. Nos queda entonces  el 010.
[*]Finalmente, al número obtenido le sumamos 001 y obtenemos 010+001=011.
[/LIST]
El 011 obtenido representa la magnitud (es decir: 5) de [I]x[/I]=−5 en complemento a 2. Por lo tanto [I]x[/I]=−5 se expresa en complemento a 2 (CA2) como:  [CENTER]−510=1011[I]C[/I][I]A[/I]2[/CENTER]
 Observaciones: En el caso que queramos representar un entero [I]x[/I]  positivo en complemento a 2, el bit de signo será por supuesto 0 pero  la magnitud no se debe codificar como explicamos antes para el caso de [I]x[/I] negativo, sino que se toma como magnitud la expresión en binario de dicha magnitud.  Así, si por ejemplo queremos representar el número positivo [I]x[/I]=5 en CA2, el bit de signo valdría 0 y la magnitud la tomamos como 101. Por lo que se tiene:  [CENTER]510=0101[I]C[/I][I]A[/I]2[/CENTER]
 En la siguiente tabla se muestra como se expresan los números del -8 al 7 usando CA2 de 4 bits:   Expresión en CA2Equivalente decimal bit3bit2bit1bit0  01117 01106 01015 01004 00113 00102 00011 00000 1111-1 1110-2 1101-3 1100-4 1011-5 1010-6 1001-7 1000-8  Punto fijo  Supongamos ahora el caso en que el número [I]x[/I] a representar ya no es entero sino que es un número fraccionario. Es decir que se puede escribir de la forma [I]x[/I]=[I]a[/I][I]b[/I] con [I]a[/I] y [I]b[/I] números enteros. En este caso lo usual es expresar el número en "punto fijo".  Ejemplo: Tomemos como ejemplo el número [I]x[/I]=234=5,75.  La parte entera de este número es 5 y la parte fraccionaria es 0,75.  Supongamos que en nuestra computadora solo disponemos de 8 bits para  representar este número. Supongamos además que decidimos utilizar 4 de  esos bits para representar la parte entera y los restantes 4 bits para  representar la parte fraccionaria. Lo que hacemos es: 
[LIST=1]
[*]Primero escribimos la parte entera del número en forma binaria utilizando 4 bits. En este caso ya sabemos que 510=01012
[*]Luego debemos escribir la parte fraccionaria. En este caso la parte fraccionaria será 0,7510 que se escribe como: 0,7510=12+14=1.2−1+1.2−2+0.2−3+0.2−4=0,11002.
[/LIST]
Por lo tanto [I]x[/I]=234=5,75 se expresa en punto fijo como:  [CENTER]5,7510=0101,1100[I]P[/I][I]F[/I][I]i[/I][I]j[/I][I]o[/I][/CENTER]
 Punto flotante  Existe otra forma de expresar números reales fraccionarios que se denomina de "coma flotante" o también de "punto flotante".  Esta es similar a la notación científica donde se utilizan expresiones de la forma: −3,2∗10−6. En este tipo de expresión se observan cuatro componentes: 
[LIST]
[*]El [B]signo[/B]; que en el ejemplo dado toma el valor -1
[*]Lo que se denomina [B]significando[/B] o mantisa; que en este caso toma el valor 3.2
[*]la [B]base[/B]; que en este caso vale 10
[*]el [B]exponente[/B]; que en el ejemplo toma el valor -6
[/LIST]
La notación binaria de punto flotante toma una forma muy similar a  la de la notación científica pero utiliza una base de valor 2.  El formato de punto flotante mayormente utilizado es el [URL="http://es.wikipedia.org/wiki/IEEE_coma_flotante"]IEEE 754[/URL] de precisión simple. Este utiliza 32 bits para expresar el número y toma la forma (en base 10):  [CENTER](−1)[I]s[/I][I]i[/I][I]g[/I][I]n[/I][I]o[/I]∗[I]s[/I][I]i[/I][I]g[/I][I]n[/I][I]i[/I][I]f[/I][I]i[/I][I]c[/I][I]a[/I][I]n[/I][I]d[/I][I]o[/I]∗2[I]e[/I][I]x[/I][I]p[/I][I]o[/I][I]n[/I][I]e[/I][I]n[/I][I]t[/I][I]e[/I]−127[/CENTER]
 Expresar (o almacenar) este número en punto flotante binario consiste  ahora en expresar el signo, el significando y el exponente en forma  binaria utilizando los 32 bits disponibles.  Lo más sencillo es expresar el signo. Para esto se utiliza un único bit  de los 32 disponibles (el bit 31 más significativo) y, al igual que en  el caso de "complemento a 2", este toma el valor 0 si el número a  expresar es de signo positivo y el valor 1 si el número a expresar es  negativo. Es decir:  [CENTER][I]s[/I][I]i[/I][I]g[/I][I]n[/I][I]o[/I]=0 si [I]x[/I]>0 [I]s[/I][I]i[/I][I]g[/I][I]n[/I][I]o[/I]=1 si [I]x[/I]<0[/CENTER]
 Para expresar el exponente se utilizan 8 bits (los bits 23 al 30) de los 32 disponibles.  Finalmente para expresar el significando se utilizan 23 bits (los bits 0 al 22 menos significativos).  Referencias  
[LIST]
[*]Estándar IEEE 754 - [URL]http://es.wikipedia.org/wiki/IEEE_coma_flotante[/URL]
[/LIST]
.
```
Fuente:
http://charliexray.blogspot.com.es/2...se-2.html#more


Un saludo.


----------

