¿Cómo maneja VHDL las operaciones bitwise?

0

Estoy teniendo un problema con el código VHDL que estoy escribiendo. Quiero transmitir una señal con otras dos señales AND juntas como esta:

mysignal <= "010" and '1';

El resultado que esperaba era un AND a nivel de bits, lo que hace que mysignal reciba el valor de "010". En su lugar, recibí un error del compilador que me decía "No hay entradas posibles para el operador infijo" y "." Cuando lo intente:

mysignal <= "010" and "111";

se compila. ¿Es posible en VHDL realizar una operación lógica a nivel de bits, sin tener que alterar mis señales y hacer que todas tengan el mismo ancho?

    
pregunta user3716057

3 respuestas

4

Una forma es simplificar la generación de señales del rango correcto. Por ejemplo:

mysignal <= "010" and (mysignal'range => '1');

Esto crea un nuevo valor para el segundo operando, el tamaño correcto, con todos los bits establecidos en '1',

    
respondido por el Brian Drummond
3

Para extender '1' a un vector de longitud específica, normalmente usaría la sintaxis (0 => '1', others => 0) .

por ejemplo:

 mysignal <= "010" and (0 => '1', mysignal'left downto mysignal'right+1 => '0');

Esto especifica que el bit 0 es '1' y el resto es cero, lo que produce "001"

Otra forma es concatenar el vector con ceros. Normalmente hago una señal ficticia llamada zeros de la siguiente manera:

signal zeros : std_logic_vector(31 downto 0)  -- or unsigned if you prefer
...
zeros <= (others => '0');

Entonces es solo una cuestión de concatenar el vector de ceros con cualquier otro vector que desees. Los símbolos & es el operador de concatenación en VHDL:

newsignal <= zeros(newsignal'left downto newsignal'right+1) & '1';

Si desea concatenar otra señal, entonces es aún más fácil:

newsignal <= zeors(newsignal'left downto oldsignal'left+1) & oldsignal;

Esto extiende oldsignal a cualquier longitud newsignal . No funcionará si newsignal tiene la misma longitud o es menor que oldsignal . "010" se convierte en "000010", por ejemplo.

Nota: la adición del vector de ceros ficticios no cambia el tamaño de su diseño de ninguna manera, las herramientas lo optimizarán en cualquier caso y lo sustituirá por todos los ceros. Simplemente me resulta mucho más fácil escribir zeros y seleccionar el rango que quiero. naturalmente, debe asegurarse de que su vector de ceros sea tan largo como su señal más larga. Encuentro que 32 bits funcionan en la mayoría de los casos.

    
respondido por el stanri
2

Puedes hacerlo de esta manera:

temp <= (others => '1');
mysignal <= "010" and temp;

donde el ancho de temp = 3.

    
respondido por el nidhin

Lea otras preguntas en las etiquetas