Hay un par de maneras de ir con esto. Si desea utilizar sra
, entonces usted necesita para utilizar el tipo correcto. A la izquierda el operando debe ser un BIT_VECTOR
, y el derecho debe ser un entero. La salida es un BIT_VECTOR
. Así que usted puede definir sus entradas y salidas como BIT_VECTOR
en lugar de STD_LOGIC_VECTOR
y, a continuación, utilizar un molde para obtener su X
en un entero. Yo creo que el buen arroja sería algo parecido a esto (pero vas a tener el doble check me como yo no tengo un compilador de VHDL en esta máquina):
--Declaration
A, B, X : in BIT_VECTOR(N downto 0);
--Usage
OUTPUT <= (A sra to_integer(unsigned(to_stdlogicvector(X)) WHEN OPERATION = "1001" ELSE
O, si es posible definir A
como BIT_VECTOR
y X
como STD_LOGIC_VECTOR
dejar fuera de la extra de fundición.
Alternativamente, usted podría continuar con el uso de STD_LOGIC_VECTOR
de sus entradas y salidas. Pero entonces usted necesita para echar ambos operandos a los tipos apropiados y, a continuación, elenco de la salida:
--Declaration
A, B, X : in STD_LOGIC_VECTOR(N downto 0);
--Usage
OUTPUT <= to_stdlogicvector(to_bitvector(A) sra to_integer(unsigned(X)) WHEN OPERATION = "1001" ELSE
Todos estos deben estar disponibles en ieee.numeric_std.ALL
y IEEE.STD_LOGIC_1164
.
La diferencia entre BIT_VECTOR
y STD_LOGIC_VECTOR
es que BIT_VECTOR
sólo tiene dos valores: 0
y 1
. Mientras que STD_LOGIC_VECTOR
nueve: U
, X
, 0
, 1
, Z
, W
, L
,H
y -
. Donde:
U
= sin inicializar
X
= desconocido - un multifuente línea es impulsado '0' y '1' simultáneamente (*)
0
= 0 lógico
1
= lógica 1
Z
= alta impedancia (tri estado)
W
= débil desconocido
L
= débil "0"
H
= débil "1"
-
= no me importa
En general es mejor utilizar STD_LOGIC_VECTOR
, ya que es más flexible y un mejor modelo del mundo real de las señales.
Mirando el código de la concatenación, no estoy del todo seguro de lo que estás tratando de hacer. Parece que usted está tratando de asignar el MSB de X
concatenado con el MSB hasta el LSB + 1 X
a A
y, a continuación, asignar que a TEMP_OUTPUT
. Yo creo que es el doble <=
de la asignación que está causando el error.
Lo que usted desea para un desplazamiento aritmético a la derecha es para establecer el derecho de la mayoría de bits, menos cambio de número de bits más significativos de la salida a la izquierda de la mayoría de los bits menos cambio de número de bits menos significativos de la entrada. A continuación, establezca todos los de el cambio de número de bits más significativos de la salida en el bit más significativo de la entrada.
La primera parte es un poco complicada, pero la segunda parte puede realizarse fácilmente con el others
de palabras clave.
--|right most - shift # * MSB of output| |left most - shift # * LSB of input| |MSBs of output|
((N - to_integer(unsigned(X))) downto 0 => A(N downto to_integer(unsigned(X))), others => A(N)) WHEN OPERATION = "1001" ELSE
El problema básico que tiene es una de las conversiones de tipo. Entonces usted necesita para pensar acerca de lo que la señal debe ser de qué tipo y qué tipos de los operandos de las funciones que son de usar y requieren lanzado en consecuencia.