# Multiplicador de 8 bits en VHDL



## SGTheDreamer (Mar 18, 2015)

Lo que pasa es que llevo algúnas semanas sin poder dar con una solución a un multiplicador de 8 bits de dos números A y B.
Sin usar m[as librerias aparte de estas : ieee.std_logic_1164.all  -- ieee.std_logic_unsigned.all;
No puedo usar ni la libreria math ni, ni numeric o  ningúna otra , tampoco algo que tenga que ver con lógica secuencial.

Si uds han desarrollado algo así o tienen una idea de como hacerlo, me ayudaría mucho . ...


----------



## pandacba (Mar 18, 2015)

Basicamente que es multimplicar? tiene algo que ver con la suma?


----------



## SGTheDreamer (Mar 18, 2015)

Si. Digamos quieres multiplicar 2 x 3 entonces tienes que sumar 3 veces 2 o al revés, pero ahí es mi problema, en internet está que tengo que agregar sumadores de esta manera :: La imágen esta adjuntada. (Caso multiplicador de 2 bits Numeros A y B) , Mi duda ahora que saben eso, es como aplicar un código en VHDL que me haga esa lógica de ir sumando de esa manera para 8 bits.

Nota : Los sumadores se ven que son  Full Adders porque necesito el carry de entrada para la siguiente columna de sumas de derecha a izquierda.

Me explico mas detalladamente, la multiplicacion de números es así (Img adjuntada), Entonces digamos que en la parte de rojo en vez de 2 y 2 hubiera sido algo que cuya suma sobrepase a 9 , digamos 5 y 5 , esto hubiera generado un carry para la siguiente columna, he ahí mi problema en vhdl, no se como hacer eso .


----------



## chclau (Mar 18, 2015)

Si queres sumar dos numeros de dos bits y recibir el acarreo basta con que el resultado de la operacion tenga tres bits, el acarreo sera almacenado en el MSB del registro de resultado


----------



## SGTheDreamer (Mar 18, 2015)

Me podrías ayudar con un código simple para un multiplicador de 2 bits con el acarreo que me dices?, asi tal vez entienda como aplicarlo a 8 bits.


----------



## chclau (Mar 18, 2015)

Aca te pongo fragmentos de codigo que realizan la multiplicacion de dos numeros de dos bits (a y b) dando como resultado uno de cuatro bits, con dos sumas parciales (p1 y p2).

Vos deberas agregarle todo lo que falta, entidad, arquitectura, simulacion, y ampliarlo a la cantidad de bits que necesitas. Ademas presta atencion que son dos trozos de codigo que deben ir en partes diferentes:

Parte declarativa:


```
signal a  : std_logic_vector(1 downto 0) := "11";
  signal b  : std_logic_vector(1 downto 0) := "10";
  signal p1 : std_logic_vector(1 downto 0);
  signal p2 : std_logic_vector(2 downto 0);
  signal y : std_logic_vector(3 downto 0);
```

Parte de "ejecucion"

```
p1 <= a and (b(0) & b(0));
p2 <= (a and (b(1) & b(1)) ) & '0';
y  <= ('0' & p2) + p1;
```

Yo agregue en mi PC lo que falta y lo simule, el resultado es y = "0110", lo que concuerda con 3x2 = 6


----------



## SGTheDreamer (Mar 18, 2015)

Me puedes explicar ti codigo,  no entiendo muchas cosas ,  si no es mucho pedir.


----------



## chclau (Mar 19, 2015)

Hiciste un sumador de dos numeros de dos bits cuyo resultado se almacene en tres bits con su correspondiente "banco de pruebas" (testbench)?

Antes que multiplicar hay que saber sumar...

Despues que hayas hecho lo primero y simulado, hablamos sobre el multiplicador. Echate una miradita sobre este tema
https://www.forosdeelectronica.com/f25/diseno-multiplicadora-3x3-bits-74x83-129024/


----------



## fredybernalmend98@gm (Oct 31, 2022)

*¿A*lguien me puede ayudar a realizar un divisor de 8 bits en sistema 3.4*?
E*s decir*,* 3 bits para enteros y 4 bits para fraccionarios.
*A*djunto lo que llevo*.*


----------



## Fogonazo (Oct 31, 2022)

fredybernalmend98@gm dijo:


> *¿A*lguien me puede ayudar a realizar un divisor de 8 bits en sistema 3.4*?
> E*s decir*,* 3 bits para enteros y 4 bits para fraccionarios.
> *A*djunto lo que llevo*.*


Publica tu código, *NO *una captura de pantalla


----------



## fredybernalmend98@gm (Oct 31, 2022)

*E*ste es mi código*:*

```
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity division is
port (A, B: in std_logic_vector (7 downto 0);
    resultado: out std_logic_vector (22 downto 0);
--c2aa,c2bb: out std_logic_vector(7 downto 0);
        signo: out std_logic;
    PE1: out std_logic_vector(7 downto 0);
    PF1:OUT STD_LOGIC_VECTOR(13 DOWNTO 0)
        );

end entity division;

architecture behavior of division is
signal temp : integer := 0;
signal auxA, auxB: std_logic_vector (7 downto 0);
signal c2A, C2B,auxa1,auxb1: std_logic_vector (7 downto 0);
constant escalar: integer :=10000;
signal res:  std_logic_vector(22 downto 0);
signal auxPF: std_logic_vector( 7 downto 0 );
signal aux1: std_logic_vector(12 DOWNTO 0);
signal aux2: std_logic_vector(11 DOWNTO 0);
signal aux3: std_logic_vector(10 DOWNTO 0);
signal aux4: std_logic_vector (9 DOWNTO 0);
signal aux5: std_logic_vector (8 DOWNTO 0);
signal aux6: std_logic_vector (7 DOWNTO 0);
signal aux7: std_logic_vector (6 DOWNTO 0);
signal aux8: std_logic_vector (5 DOWNTO 0);
--signal auxPE: UNSIGNED (2 DOWNTO 0);
signal auxPE1: std_logic_vector(7 DOWNTO 0);
signal auxbits: std_logic_vector(13 DOWNTO 0);
signal auxbits1: std_logic_vector(13 DOWNTO 0);
signal auxbits2: std_logic_vector(14 DOWNTO 0);

begin

process (A, B,auxbits,auxbits1,auxbits2,res)

begin
    if (A(7)='1') then
        auxA <= not A;
        c2A <= auxA + 1;
        else
        c2A<=A;
        end if;

    if (B(7)='1') then
        auxB <= not B;
        c2B <= auxB + 1;
        else
        c2B<=B;
        end if;

        Signo<= A(7) xor B(7);

    --    C2aa<=C2a;
    --    C2bb<=C2b;
        temp <= (conv_integer (c2A)*escalar / conv_integer(c2B) );
        res <= std_logic_vector(to_signed (temp, res'length));
            resultado <= std_logic_vector(to_signed (temp, resultado'length));

      ---- *******************************************************
      auxbits<="10011100010000";
      auxbits1<="10011100010000";
      auxbits2<="100000001110100";

      if ( res <  auxbits ) then
        pF1<= '0' & res(12 downto 0);
         PE1<= res (  20 downto 13);
         elsif  ( res > auxbits1 and res < auxbits2)then
           pF1<=  res(13 downto 0);
         PE1<= res (  21 downto 14);
         end if;

  -----seccionamos el resultado
-- if (auxPF(7)='1') THEN
 --.aux1<= "1001110001000";
-- else
-- aux1<="0000000000000";
-- end if;

  --if (auxPF(6)='1') THEN
 --aux2<= "100111000100";
-- else
-- aux2<="000000000000";
 --end if;

 --  if (auxPF(5)='1') THEN
-- aux3<= "10011100010";
-- else
 --aux3<="00000000000";
 --end if;

 --   if (auxPF(4)='1') THEN
 --aux4<= "1001110001";
 --else
 --aux4<="0000000000";
 --end if;

 -- if (auxPF(3)='1') THEN
-- aux5<= "100111000";
-- else
 --aux5<="000000000";
 --end if;

 --  if (auxPF(2)='1') THEN
 ---aux6<= "10011100";
 --else
-- aux6<="00000000";
 --end if;

 --  if (auxPF(1)='1') THEN
-- aux7<= "1001110";
-- else
-- aux7<="0000000";
 --end if;

  -- if (auxPF(0)='1') THEN
 --aux8<= "100111";
-- else
-- aux8<="000000";
-- end if;

-- PF1<= res(13 downto 0);
-- auxPF<=resultado (7 downto 0);
 --PF1 <=(('0'& aux1)+ ('0'& aux2)+ ('0'& aux3)+ ('0' & aux4)+('0' & aux5)+('0' & aux6)+('0' & aux7)+('0' & aux8));


 --auxPE1<= res(11 downto 4 );
 --PE1<=auxPE1;
end process;
end behavior;
```


----------

