Multiplicación en VHDL

Estoy tratando de hacer que un MACC simple funcione, pero hace cosas inesperadas. La multiplicación no funciona. 00001 * 00001 salidas 00000

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity macc is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           en : in  STD_LOGIC;
           A : in  STD_LOGIC_VECTOR (4 downto 0);
           B : in  STD_LOGIC_VECTOR (4 downto 0);
           P : out  STD_LOGIC_VECTOR (8 downto 0));
end macc;

architecture Behavioral of macc is
    signal product : STD_LOGIC_VECTOR (8 downto 0);
    signal acc_in : STD_LOGIC_VECTOR (8 downto 0);
    signal acc_out : STD_LOGIC_VECTOR (8 downto 0);
begin

    product <= A*B;
    acc_in <= acc_out + product;

        acc: process is
        begin
        wait until rising_edge(clk);
            if (rst = '1') then
                    acc_out <= (others => '0');     
            elsif (en = '1') then
                    acc_out <=  acc_in;
            end if;
        end process acc;

    P <= acc_out;

end Behavioral;

error de multiplicacion

Forma de onda añadida.
No recuerdo mucho sobre VHDL, pero productdebería actualizarse de forma asíncrona, ¿verdad? En ese caso, el problema no es acc, sino la multiplicación real...
Bueno, de eso se trata este post.
Sí, lo siento, me confundió el contexto...

Respuestas (1)

Si multiplica 2 números de 5 bits ( Ay Bson ambos std_logic_vector(4 downto 0)), ¿no necesita 10 bits (no 9) para almacenarlo (así Pdebería ser std_logic_vector(9 downto 0)? (31 * 31 = 961: necesita 10 bits)

Pero también, no use std_logic_arith/_unsigned . Use ieee.numeric_stdy luego use el unsignedtipo de datos.

No se me permite cambiar paquetes. Además, tengo que cumplir con las convenciones proporcionadas para cumplir con el código sintetizable. En cuanto al problema, la longitud del vector de salida era el problema. Gracias.
¿Por qué no está permitido cambiar paquetes? ¿No puedes al menos deshacerte de std_logic_arith (asumiendo que estás haciendo matemáticas sin firmar)?
Si realmente está sintetizando, es posible que desee considerar un núcleo específico del proveedor canalizado simple en su lugar.
@AaronD.Marasco: o simplemente ingrese *algunos registros de tubería después y deje que la herramienta de sintetizador descubra dónde colocarlos, mucho más portátil.