用于记录分配的VHDL逻辑向量

Bob*_*eno 3 record vhdl aggregates

假设我定义了一条包含字段 的记录std_ulogic_vector来表示更大的std_ulogic_vector. 使用串联将此记录转换为大向量非常简单(无需知道每个字段的大小)。

我该如何做相反的事情,例如将大数据转换std_ulogic_vector回记录?

例子 :

architecture RTL of record_conversion is
  type data_t is record
    top    : std_ulogic_vector(4 downto 0);
    bottom : std_ulogic_vector(2 downto 0);
  end record data_t;

  signal record_s : data_t;
  signal vector_s : std_ulogic_vector(7 downto 0);
begin

  -- vector to record works
  --vector_s <= record_s.top & record_s.bottom;

  -- record to vector does not work
  (record_s.top, record_s.bottom) <= vector_s;

  -- tedious solution with knowledge of the field size
  record_s.top    <= vector_s(7 downto 3);
  record_s.bottom <= vector_s(2 downto 0);

end architecture;
Run Code Online (Sandbox Code Playgroud)

Mor*_*mer 5

将此类转换包装在函数中并使用subtypefor 结果向量通常是一个好主意,例如:

...
  constant LEN : integer := 8;  -- Number of bits in data_t

  type data_t is record
    top    : std_ulogic_vector(4 downto 0);
    bottom : std_ulogic_vector(2 downto 0);
  end record data_t;

  subtype vector_t is std_ulogic_vector(LEN - 1 downto 0);

  function data_to_vector(data : data_t) return std_ulogic_vector is
    variable res_v : vector_t;
  begin
    res_v := data.top & data.bottom;
    return res_v;
  end function;

  function vector_to_data(vector : vector_t) return data_t is
    variable res_v : data_t;
  begin
    res_v.top    := vector(LEN - 1 downto LEN - res_v.top'length);
    res_v.bottom := vector(res_v.bottom'length - 1 downto 0);
    return res_v;
  end function;

  signal record_s : data_t;
  signal vector_s : vector_t;

begin

  record_s <= vector_to_data(vector_s);
  vector_s <= data_to_vector(record_s);
...
Run Code Online (Sandbox Code Playgroud)

top也许应该添加另一个常量来定义和之间的分割bottom