My 2's Complement Multiplier Не генерирует все биты продукта - PullRequest
0 голосов
/ 06 мая 2019

Я создаю общий множитель дополнения 2, используя VHDL. Я следую Алгоритму Боу Вули и использую метод структурированного множителя для выполнения расчетов. Проблема, с которой я столкнулся, заключается в том, что когда я умножаю 5-битное на 4-битное число, он правильно вычисляет первые 3 бита продукта, но не остальные. Код, который я имею, работает для умножения 4 на 4 бита.

Моделирование Алгоритм структуры массива

Я сузил свои проблемы до того факта, что структура массива, похоже, не генерирует биты SUM правильно. Я думаю, что это связано с проблемами индексации в операторах генерирования, но из-за моего видения туннеля я не могу найти ошибку.

--Main MULT entity--
LIBRARY IEEE;
use IEEE.std_logic_1164.all;

entity MULT is 
    generic(X_len:positive:=4;Y_len:positive:=4);
    port(X:in std_logic_vector(X_len-1 downto 0);
            Y: in std_logic_vector(Y_len-1 downto 0);
            P: out std_logic_vector(X_len+Y_len-1 downto 0));
end;

architecture behav of MULT is

type twoD_array is array(X_len downto 0, Y_len+X_len-2 downto 0) of std_logic; 
signal XY: twoD_array;
signal carry: twoD_array;
signal S: twoD_array;


--Declaring HA/FA components--
component HA is 
        port(a, b : in std_logic;
                    s, c_out : out std_logic);
end component;

component FA is
        port(a, b, c_in : in std_logic;
                    s, c_out : out std_logic);
end component;

component AND_2 is 
        port(A,B:in std_logic;
                C:out std_logic);
end component;

component NAND_2 is 
        port(A,B:in std_logic;
                C:out std_logic);
end component;

-----------------------------
begin       

    --Generating Partial Products (XY)--
    genPPouter: for r in 0 to X_len-1 generate
        genPPinner: for c in 0 to Y_len-1 generate
            notlastindex: if (r/=X_len-1) and (c/=Y_len-1) generate
                                PProw: AND_2 port map(X(r),Y(c),XY(r,c+r));
                                end generate;
            lastindex: if (r/=X_len-1) and (c=Y_len-1) generate
                                PPlastin: NAND_2 port map(X(r),Y(c),XY(r,c+r));
                                end generate;
            lastrownotlastin: if (r=X_len-1) and (c/=Y_len-1) generate
                                PPlastrwo: NAND_2 port map(X(r),Y(c),XY(r,c+r));
                                end generate;
            lastrowlastin: if (r=X_len-1) and (c=Y_len-1) generate
                                PPlastrowlastin: AND_2 port map(X(r),Y(c),XY(r,c+r));
                                end generate;
        end generate;
    end generate;
    P(0)<=XY(0,0);

    --Generating first row components--
    genHAorFA: for a in 1 to Y_len-1 generate
        firstrwoHAXneqY: if (X_len/=Y_len) and ((a/=X_len-1) and (a/=Y_len-1)) generate
                HAgen: HA port map(XY(0,a),XY(1,a),s(1,a),carry(1,a));
                end generate;
        firstrowFAXneqY: if (X_len/=Y_len) and ((a=X_len-1) and (a=Y_len-1)) generate
                FAgen: FA port map(XY(0,a),XY(1,a),'1',s(1,a),carry(1,a));
                end generate;
        firstrowHAXeqY: if (X_len=Y_len) generate
                HAgen2: HA port map(XY(0,a),XY(1,a),s(1,a),carry(1,a));
                end generate;
    end generate;
    P(1)<=s(1,1);

    --Generating FAs--
    genFAsouter: for r in 2 to X_len-1 generate
        genFAsinner: for c in 2 to Y_len generate
                genFAnotlastindex: if (c/=Y_len) generate
                        genFA: FA port map(XY(r,c+r-2),s(r-1,c+r-2),carry(r-1,c-1+r-2),s(r,c+r-2),carry(r,c+r-2));
                        end generate;
                genFAlastindex: if (c=Y_len) generate
                        genFA2: FA port map(XY(r,c+r-2),XY(r-1,c+r-2),carry(r-1,c-1+r-2),s(r,c+r-2),carry(r,c+r-2));
                        end generate;
        end generate;
        P(r)<=s(r,r);
    end generate;

    --Generating RCA--  
    genRCAX: for c in X_len to Y_len+X_len-2 generate
        genFirstHA: if (X_len/=Y_len) and (c=X_len) generate
                        genHA: HA port map(s(X_len-1,c),carry(X_len-1,c-1),s(X_len,c),carry(X_len,c));
                        P(c)<=s(X_len,c);
                        end generate;
        genfirstFAifXeqY: if (X_len=Y_len) and (c=X_len) generate
                        genfirstFA: FA port map(s(X_len-1,c),carry(X_len-1,c-1),'1',s(X_len,c),carry(X_len,c));
                        P(c)<=s(X_len,c);
                        end generate;
        genIntermediateFA: if (c/=X_len) and (c/=X_len+Y_len-2) generate
                        genIntFA: FA port map(s(X_len-1,c),carry(X_len-1,c-1),carry(X_len,c-1),s(X_len,c),carry(X_len,c));
                        P(c)<=s(X_len,c);
                        end generate;
        genLastFA: if (c=X_len+Y_len-2) generate
                        genlastFA: FA port map(XY(X_len-1,c),carry(X_len-1,c-1),carry(X_len,c-1),s(X_len,c),carry(X_len,c));
                        P(c)<=s(X_len,c);
                        end generate;
    end generate;

    --Generate HA to add 1 at X_len+Y_len-1--
    genfinalHA: HA port map(carry(X_len,Y_len+X_len-2),'1',P(X_len+Y_len-1),carry(0,0));
end behav;

Я должен получить фактический результат 2-го дополнения на осциллограмме, но я генерирую только первые 3 бита продукта.

...