除了使用子程序调用将一种类型的元素分配给另一种类型的元素之外,还有其他几种方法。
您可以使用限定表达式:
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。
以上示例分析、阐述和模拟无误,证明不存在切片边界问题。
合格的表达式、子类型声明和别名不会产生额外的模拟开销,而子程序调用会。