【问题标题】:VHDL logic vector to record assignment用于记录分配的 VHDL 逻辑向量
【发布时间】:2019-01-27 17:35:07
【问题描述】:

假设我定义了一个字段为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;

【问题讨论】:

    标签: vhdl record aggregates


    【解决方案1】:

    将这种转换包装在函数中通常是个好主意,并为结果向量使用subtype,例如:

    ...
      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);
    ...
    

    也许应该添加另一个常量来定义topbottom 之间的拆分。

    【讨论】:

    • 您能否解释一下为什么该子类型是必要的或它提供了什么好处?
    • 还有,这些转换函数可以合成吗?
    • vector_t 子类型不是必需的,但是当记录内容和向量内容之间存在关系时,在声明子类型时可能会更清楚。功能可综合。
    【解决方案2】:

    除了使用子程序调用将一种类型的元素分配给另一种类型的元素之外,还有其他几种方法。

    您可以使用限定表达式:

      record_s <= data_t'(vector_s(7 downto 3), vector_s (2 downto 0));
    

    其中聚合由两个具有与记录匹配的显式类型的 vector_s 切片组成。请参阅 IEEE Std 1076-2008 9.3.6 限定表达式。

    在模拟过程中,会验证信号的新值。见 14.7.3.4 信号更新:

    b) 如果 S 是复合信号(包括数组的切片),则 S 的有效值被隐式转换为 S 的子类型。子类型转换检查 S 的每个元素在有效值,反之亦然。如果此检查失败,则会发生错误。然后将这个子类型转换的结果赋给代表 S 的当前值的变量。

    除了具有匹配元素(子元素,...)之外,子类型转换还会更改索引范围以匹配目标。

    您可以使用子类型索引范围指定切片索引范围:

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity record_conversion is
    end entity;
    
    architecture subtypes 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);
      subtype t is std_logic_vector (
            vector_s'LEFT downto vector_s'LEFT - record_s.top'length + 1
      );
      subtype b is std_logic_vector (
            vector_s'LEFT - record_s.top'length downto 0
      );
    begin
    
      record_s <= data_t'(vector_s(t'range), vector_s(b'range));
    
    end architecture;
    

    这里的子类型索引右侧表达式元素的范围切片。

    你可以用别名来描述切片:

    architecture aliases 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);
        alias vector_s_top: std_ulogic_vector(record_s.top'range) is
            vector_s(7 downto 3);
        alias vector_s_bottom: std_ulogic_vector(record_s.bottom'range) is
            vector_s (2 downto 0);
    
    begin
        record_s <= data_t'(vector_s_top, vector_s_bottom);
    end architecture;
    

    这里的两个别名描述了vector_s的字段。如果您保证始终分配记录复合对象,您实际上可以取消记录并简单地使用别名。最接近的 VHDL 来自 unions。

    以上示例分析、阐述和模拟无误,证明不存在切片边界问题。

    合格的表达式、子类型声明和别名不会产生额外的模拟开销,而子程序调用会。

    【讨论】:

    • 如果在被转换的记录中有枚举类型或其他记录类型,这种技术会起作用吗?
    • 这里没有实际的转换。限定表达式说明表达式的类型。每个声明都是唯一的,包括记录的元素。枚举元素需要类型转换。正在转换的记录类型将需要选定的名称和兼容元素或不兼容元素的转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多