VHDL multiplicación para std_logic_vector

0

Al simular, obtengo un error de tiempo de ejecución, así que estoy tratando de ejecutar un análisis RTL en Vivado para ver si se puede crear al menos el esquema del componente. El código es el siguiente

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity multiplicator_test is
    generic(
            WORD_SIZE: natural := 8;
            EXP_SIZE: natural := 3
        );
        port(
            input_1: in std_logic_vector(WORD_SIZE-1 downto 0);
            input_2: in std_logic_vector(WORD_SIZE-1 downto 0);
            result: out std_logic_vector(WORD_SIZE-1 downto 0)
        );
end entity multiplicator_test;

architecture multiplicator_test_arch of multiplicator_test is
    constant SIGNIFICAND_SIZE: natural := WORD_SIZE - EXP_SIZE - 1;

    signal significand: std_logic_vector(SIGNIFICAND_SIZE-1 downto 0) := (others => '0');
    signal exponent: std_logic_vector(EXP_SIZE-1 downto 0) := (others => '0');
    signal sign: std_logic := '0';
    signal aux: std_logic_vector((2*SIGNIFICAND_SIZE)-1 downto 0) := (others => '0');
begin
        aux <= std_logic_vector(signed(input_1(SIGNIFICAND_SIZE-1 downto 0))*signed(input_2(SIGNIFICAND_SIZE - 1 downto 0)));
        significand <= aux(SIGNIFICAND_SIZE - 1 downto 0);
        exponent <= std_logic_vector(unsigned(input_1(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2))+unsigned(input_2(WORD_SIZE-2 downto WORD_SIZE-EXP_SIZE-2)));
        sign <= input_1(WORD_SIZE-1) or input_2(WORD_SIZE-1);
        result <= sign & exponent & significand;
end architecture multiplicator_test_arch;

Al ejecutar el análisis, obtengo

ERROR: [Synth 8-690] width mismatch in assignment; target has 3 bits, source has 4 bits [(...)/multiplicador.vhd:27]

La línea con el error es 27,

aux <= std_logic_vector(signed(input_1(SIGNIFICAND_SIZE-1 downto 0))*signed(input_2(SIGNIFICAND_SIZE - 1 downto 0)));

Al parecer, el objetivo (aux) es de 3 bits, pero en realidad debería ser 8.

    
pregunta MPA95

1 respuesta

1

Para ir directamente al error:

Intenta multiplicar dos firmas de 4 bits sin colocar el resultado en una firma de 8 bits.

Ejemplo (lleva a tu error):

architecture multiplicator_test_arch of multiplicator_test is
    signal input_1: signed(WORD_SIZE - 1 downto 0);
    signal input_2: signed(WORD_SIZE - 1 downto 0);
    signal result_sig : signed(WORD_SIZE - 1 downto 0);
begin  
    result_sig <= input_1 * input_2;
end architecture multiplicator_test_arch;

Ejemplo (no conduce a su error):

architecture multiplicator_test_arch of multiplicator_test is
    signal input_1: signed(WORD_SIZE - 1 downto 0);
    signal input_2: signed(WORD_SIZE - 1 downto 0);
    signal result_sig : signed((WORD_SIZE * 2) - 1 downto 0);
begin  
    result_sig <= input_1 * input_2;
end architecture multiplicator_test_arch;

El tipo con signo de resultado debe tener un ancho doble de los dos tipos con signo de entrada.

Entonces, lo que tienes que hacer es:

  • Declare otra señal firmada con el ancho doble de su multiplicación
  • coloca el resultado de la multiplicación allí
  • formatee la nueva señal en un std_logic_vector

Además, su código no es realmente legible. Usted hace un montón de formato en una fila. ¿Qué tiene que preguntarse? ¿Es necesario trabajar con std_logic_vector como entrada, o puede utilizar tipos con signo? Si no es así, está bien. Pero luego intentaría mantener las señales como firmadas y hacer el cálculo con estas señales. Después de esto, formatee el resultado de iniciar sesión en std_logic_vector. Pero esta es una cuestión de estilo de codificación.

    
respondido por el puzzled

Lea otras preguntas en las etiquetas