Multiplikation in VHDL

Ich versuche, ein einfaches MACC zum Laufen zu bringen, aber es macht unerwartete Dinge. Die Multiplikation funktioniert nicht. 00001 * 00001 gibt 00000 aus

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;

Multiplikationsfehler

Wellenform hinzugefügt.
Ich erinnere mich nicht so sehr an VHDL, aber productsollte asynchron aktualisiert werden, oder? In diesem Fall ist das Problem nicht acc, sondern die eigentliche Multiplikation ...
Nun, darum geht es in diesem Beitrag.
Ja, sorry, der Kontext hat mich verwirrt...

Antworten (1)

Wenn Sie 2 5-Bit-Zahlen multiplizieren ( Aund Bbeides sind std_logic_vector(4 downto 0)), brauchen Sie nicht 10 Bits (nicht 9), um sie zu speichern ( Psollte es sein std_logic_vector(9 downto 0)? (31 * 31 = 961: benötigt 10 Bits)

Aber auch - benutze nicht std_logic_arith/_unsigned . Verwenden Sie ieee.numeric_stdund verwenden Sie dann den unsignedDatentyp.

Pakete darf ich nicht wechseln. Außerdem muss ich vorgegebene Konventionen erfüllen, um synthasefähigen Code zu erfüllen. In Bezug auf das Problem war die Ausgabevektorlänge das Problem. Danke dir.
Warum darf man Pakete nicht wechseln? Können Sie nicht wenigstens std_logic_arith loswerden (vorausgesetzt, Sie machen unsignierte Mathematik)?
Wenn Sie wirklich synthetisieren, sollten Sie stattdessen einen einfachen herstellerspezifischen Kern mit Pipeline in Betracht ziehen.
@AaronD.Marasco: oder stecken Sie einfach *ein paar Pipeline-Register danach ein und lassen Sie das Synthesizer-Tool herausfinden, wo sie platziert werden sollen - viel tragbarer.