En una pregunta anterior pregunté acerca de una función de truncado, lo que insinuó que Debería probar una función con un ancho de retorno estático.
Estoy tratando de combinar dos vectores x
y y
tomando los primeros c
bits de x
y los restantes x'length - c
bits de y
. (Supongo que x
y y
están en el mismo rango). Por lo tanto, escribí la siguiente función, que nuevamente produce un error, esta vez en la línea donde asigno result
/*
Combines two signals by taking bitsFromX bits from x and the rest from y.
x vector 1 to combine
y vector 2 to combine, must be of same length as x
bitsFromX number of bits taken from x
*/
function combine(x: in std_logic_vector; y: in std_logic_vector; bitsFromX: in natural)
return std_logic_vector is
variable result : std_logic_vector(x'RANGE);
begin
--assert x'LENGTH= y'LENGTH report "Attempt to combine different length vectors" & lf & "X: " & RANGE'IMAGE(x'RANGE) & "Y: " & RANGE'IMAGE(y'RANGE);
result := x(x'LEFT downto x'LEFT-bitsFromX+1) & y(y'LEFT-bitsFromX downto y'RIGHT);
return result;
end function;
El mensaje de error (de synplify) es:
Esperando expresión constante
Puedo resolver esto usando dos asignaciones:
result(x'LEFT downto x'LEFT-bitsFromX+1) := x(x'LEFT downto x'LEFT-bitsFromX+1);
result(y'LEFT-bitsFromX downto y'RIGHT) := y(y'LEFT-bitsFromX downto y'RIGHT);
y me gustaría entender por qué esto es así? (Me parece que es la segunda vez que cometo el mismo error, porque todavía no entiendo la razón).
Como bonificación: ¿Cómo no me funciona el resultado de report
, x'RANGE
y to_string(x'RANGE)
?