control de tipos VHDL

2

Tengo (espero que no sea tonta) una pregunta sobre el control de tipos en vhdl.

type data_t is record -- 16 bytes + 1 bit
    order       : std_ulogic_vector(7 downto 0);
    data        : std_ulogic_vector(111 downto 0); --14 bytes data
    data_en     : std_ulogic;
    card_addr   : std_ulogic_vector(7 downto 0);
end record data_t;

type order_respond_t is record -- 16 bytes + 1 bit
    order       : std_ulogic_vector(7 downto 0);
    timestamp   : std_ulogic_vector(15 downto 0);
    data        : std_ulogic_vector(95 downto 0);
    data_en     : std_ulogic;
    card_addr   : std_ulogic_vector(7 downto 0);
end record order_respond_t;

Anteriormente, estaba trabajando como programador integrado, así que tengo curiosidad por saber cómo funciona con vhdl. Los registros tienen exactamente el mismo tamaño pero una estructura diferente dentro. ¿Puedo hacer algo como esto?:

signal_order_respond_t < = signal_data_t;

En C puedo asignar dos estructuras diferentes entre sí usando un puntero (de modo que puedo asignar datos de una estructura a otra diferente (omitamos si es útil o no en este momento).

¿Es posible hacerlo en VHDL, está bien de acuerdo con las buenas prácticas de codificación vhdl?

    
pregunta e2p

2 respuestas

1

VHDL está fuertemente tipado, por lo que lo que solicita no es posible con algunas funciones de conversión. Normalmente haría algunas funciones de conversión que codifican el registro a un slv, y una que se decodifica de un slv a un registro. Con estas funciones es posible algo como lo siguiente:

signal data : data_t;
signal order_respond : order_respond_t;
-- 
order_respond <= decode(encode(data));

Así es como se ve el código de conversión. Tenga en cuenta que con algunos ayudantes esto también puede simplificarse un poco.

subtype common_t is std_logic_vector(128 downto 0);
function encode(d : data_t) return common_t is
  variable comm : common_t;
begin
  comm(7 downto 0)               := d.order;
  comm(111+8 downto 8);          := d.data;
  comm(112+8);                   := d.data_en;
  comm(112+8+1+7 downto 112+8+1) := d.card_addr;
  return comm;
end encode;

function decode(comm : common_t) return order_respond_t is
  variable order_resp : order_respond_t;
begin
  order_resp.order     := comm(7 downto 0);             
  order_resp.timestamp := comm(8+15 downto 8);         
  order_resp.data      := comm(8+16+95 downto 8+16);                  
  order_resp.data_en   := comm(8+16+96);
  order_resp.card_addr := comm(8+16+96+7 downto 8+16+96+1)
  return d;
end decode;
    
respondido por el Lincoln
0

Su pregunta es un poco confusa, así que vamos a ver si esto lo aborda. Aunque pregunta sobre el "control de tipo", muestra los tipos de registro y su pregunta parece ser sobre los tipos de registro en particular. Así que me apego a eso ...

En VHDL, un tipo de registro es simplemente un agrupamiento conveniente de un conjunto de señales. Como VHDL es un lenguaje descriptor, no un lenguaje de programación de procedimientos, está más estrechamente conectado a un esquema.

En su tipo de registro, estas señales no tienen almacenamiento (memoria) asignado. Las asignaciones de señal describen conexiones eléctricas entre puertas lógicas en condiciones específicas. Estas condiciones pueden ser explícitas, como las asignaciones concurrentes, o implícitas, como en un proceso condicional.

Ya que no se almacenan, no puedes "encontrarlos" utilizando un puntero. Por cierto, en Ada tampoco se puede, el lenguaje de programación de procedimientos del cual VHDL deriva mucha sintaxis.

En términos más simples, si puede ver las señales como cables *, entonces solo vea los tipos de registros como paquetes de cables *.

(* Sé que estos cables son a menudo salidas de registro / puerta lógica, pero entiendes la idea)

    
respondido por el TonyM

Lea otras preguntas en las etiquetas