Multiplicador de 8 bits en VHDL

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 :). ...
 
Última edición:
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 :(.
 

Adjuntos

  • 2x2 multiplayer.png
    2x2 multiplayer.png
    73.3 KB · Visitas: 55
  • 2x2 multiplayer.jpg
    2x2 multiplayer.jpg
    62.8 KB · Visitas: 45
Última edición:
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
 
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:

Código:
  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"
Código:
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
 
Última edición:
¿Alguien 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.
Adjunto lo que llevo.
 

Adjuntos

  • 2022-10-31.png
    2022-10-31.png
    475.7 KB · Visitas: 10
  • 2022-10-30 (15).png
    2022-10-30 (15).png
    408.9 KB · Visitas: 10
Última edición por un moderador:
Este es mi código:
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;
 
Última edición por un moderador:
Arriba