Usando el tipo de cadena en VHDL

2

Para facilitar la lectura de una forma de onda en el banco de pruebas, quiero usar una señal / variable que sea de tipo cadena. Básicamente, por ejemplo, cuando estoy leyendo la dirección 0x03 de un dispositivo SPI, la cadena lo dirá en palabras hasta que se complete la transferencia de SPI.

Esto facilitará la lectura de la salida de onda.

Problemas:

1) La variable / señal de cadena debe tener límites cuando se crea. A diferencia de C ++, no parece expandirse / contraerse internamente para ajustarse a lo que se le asigna en tiempo de ejecución. Esto debería ser posible para un agregado.

2) No se puede usar la notación (otros = > '') con el tipo de cadena, aunque se supone que es una matriz.

3) A veces me devuelven una cadena de una función diferente que necesita ser concatenada con el msg en el banco de pruebas. Si tengo que ingresar límites para la cadena cuando le asigne un valor, esto será imposible.

¿Hay una manera de usar una cadena sin asignar límites en VHDL? Por lo menos, ¿puedo asignar valor a una cadena de modo que si mi cadena asignada es menor que el límite máximo, el resto de la cadena se configurará en caracteres de espacio automáticamente?

    
pregunta quantum231

1 respuesta

5

Creo que realmente quieres un tipo enumerado. Se mostrarán nombrados en la simulación sin la molestia de las cadenas. Tendrá que revisarlos para descubrir completamente cómo usarlos. Aquí están los conceptos básicos:

-- declaration   
type my_enumerated_type is ( good, bad, ugly);
signal rating, rating2 : my_enumerated_type;
constant ENCODED_TYPE_WIDTH : natural := 2;

-- helpers - use a function like this to convert between enumerated type and std_logic_vector
function encode ( rating : my_enumerated_type ) return std_logic_vector is
begin
  return std_logic_vector(to_unsigned(my_enumerated_type'pos(rating), ENCODED_TYPE_WIDTH));
end encode;

function decode ( rating : std_logic_vector ) return my_enumerated_type is
begin
  if unsigned(rating) < my_enumerated_type'length then
    return my_enumerated_type'val(to_integer(unsigned(rating)));
  else
    return ugly;
    -- TODO: throw an error instead? like so: 
    -- assert false report "rating out of bounds in conversion to my_enumerated_type" severity ERROR;
  end if;
end decode;

-- conversion
output  <= encode(rating);
rating2 <= decode(input);

Estas enumeraciones pueden ser divertidas y potentes en VHDL. ¡Disfruta!

    
respondido por el Lincoln

Lea otras preguntas en las etiquetas