4 votos

¿Cómo cambio a izquierda/derecha un valor de información dentro de una instrucción cuando?

Estoy tratando de crear un parametrizable ALU que maneja N bits firmado datos. Sin embargo los métodos que conozco de desplazamiento izquierda/derecha, o bien no funcionan porque los valores se definen como información:

O porque es dentro de una declaración cuando:

Para reiterar, necesito cambiar izquierda A cargo de X bits. ¿Alguien podría señalarme en la dirección correcta?

Código completo:

2voto

Morris Maynard Puntos 49

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.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X