Código VHDL para 4x4 Mult: SYNTAX OK BUT ERROR: HDLCompiler: 1029

0

Hola, esta es mi primera publicación aquí, tengo un código que escribí con el que tengo problemas. Esperaba poder conseguir ayuda.

Tengo algunos problemas con mi código VHDL para un multiplicador 4x4.

El esquema que estoy usando es el siguiente:

Laejecucióndeunacomprobacióndesintaxispasamuybienperomesaleelsiguienteerror:

ERROR:HDLCompiler:1029-"T:/Multiplier/mult.vhd" Line 26: No index value can belong to null index range
ERROR:Simulator:777 - Static elaboration of top level VHDL design unit mult in library work failed

Pude encontrar algo similar al primer error: enlace

y pudo corregir su error cambiando el tamaño de su std_logic_vector

Pero he agotado todas mis asignaciones de vectores y todas mis señales están definidas para mis resúmenes y cargas. Los códigos fuente de medio sumador y de sumador completo adjuntos al proyecto se probaron y funcionaron.

¿Alguna idea? El código está abajo. ¡Por favor y gracias! Soy nuevo aquí, aunque he investigado y no he tenido éxito.

--4x4 Multiplier
library ieee;
use ieee.std_logic_1164.all;

entity mult is
port (x,y:IN std_logic_vector (3 downto 0);
        p:OUT std_logic_vector (7 downto 0));
end mult;

architecture mult_beh of mult is

component ha 
    port(a,b: IN std_logic;
                c,s: OUT std_logic);
end component;

component fa 
    port(a,b,cin: IN std_logic;
                cout,sum: OUT std_logic);
end component;

signal andgate: std_logic_vector(15 downto 0);
signal sumout: std_logic_vector(11 downto 0);
signal carry: std_logic_vector(11 downto 0);
begin                           
    andgate(0) <= x(0) and y(0);
    andgate(1) <= x(1) and y(0);
    andgate(2) <= x(2) and y(0);
    andgate(3) <= x(3) and y(0);

    andgate(4) <= x(0) and y(1);
    andgate(5) <= x(1) and y(1);
    andgate(6) <= x(2) and y(1);
    andgate(7) <= x(3) and y(1);

    andgate(8) <= x(0) and y(2);
    andgate(9) <= x(1) and y(2);
    andgate(10) <= x(2) and y(2);
    andgate(11) <= x(3) and y(2);

    andgate(12) <= x(0) and y(3);
    andgate(13) <= x(1) and y(3);
    andgate(14) <= x(2) and y(3);
    andgate(15) <= x(3) and y(3);

    --Gates
    ha0: ha port map(s => sumout(0), a => andgate(1), b => andgate(4), c => carry(0));
    fa0: fa port map(sum => sumout(1), a => andgate(2), b => andgate(5), cout => carry(1), cin => carry(0));
    fa1: fa port map(sum => sumout(2), a => andgate(3), b => andgate(6), cout => carry(2), cin => carry(1));
    ha1: ha port map(s => sumout(3), a => carry(2), b => andgate(7), c => carry(3));
    ha2: ha port map(s =>sumout(4), a => sumout(1), b => andgate(8), c => carry(4));
    fa2: fa port map(sum => sumout(5), a => sumout(2), b => andgate(9), cout => carry(5), cin => carry(4));
    fa3: fa port map(sum => sumout(6), a => sumout(3), b => andgate(10), cout => carry(6), cin => carry(5));
    fa4: fa port map(sum => sumout(7), a => carry(3), b => andgate(11), cout => carry(7), cin => carry(6));
    ha3: ha port map(s => sumout(8), a => sumout(5), b => andgate(12), c => carry(8));
    fa5: fa port map(sum => sumout(9), a => sumout(6), b => andgate(13), cout => carry(9), cin => carry(8));
    fa6: fa port map(sum => sumout(10), a => sumout(7), b => andgate(14), cout => carry(10), cin => carry(9));
    fa7: fa port map(sum => sumout(11), a => carry(7), b => andgate(15), cout => carry(11), cin => carry(10));

    --Assigning p values
    p(0) <= andgate(0);
    p(1) <= sumout(0);
    p(2) <= sumout(4);
    p(3) <= sumout(8);
    p(4) <= sumout(9);
    p(5) <= sumout(10);
    p(6) <= sumout(11);
    p(7) <= carry(11);

end mult_beh;
    
pregunta Billy Bob

1 respuesta

1

Definiste todos tus rangos vectoriales en la dirección incorrecta. Si desea utilizar downto , el índice de la izquierda debe ser mayor que el índice de la derecha, por ejemplo:

signal andgate: std_logic_vector(15 downto 0);

O cambia la dirección a to en tu código para numerar los bits en orden ascendente.

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas