假设我有以下类型定义,它依赖于常量来指示记录成员的向量长度:
type point_t is record
x: std_logic_vector(X_WIDTH-1 downto 0);
y: std_logic_vector(Y_WIDTH-1 downto 0);
end record;
Run Code Online (Sandbox Code Playgroud)
我想将这些记录转换为std_logic_vector
s,将它们放入FIFO中.目前我使用以下代码:
PROCEDURE encodepoint(signal pnt: in point_t;
signal d: out std_logic_vector(POINT_ENC_WIDTH-1 downto 0)) is
variable top: integer := 0;
begin
top := X_WIDTH-1;
d(top downto 0) <= pnt.x;
top := top + Y_WIDTH;
d(top downto top-X_WIDTH+1) <= sl.y;
d(d'left downto top+1) <= (others => '0');
end;
Run Code Online (Sandbox Code Playgroud)
此代码在许多方面都不是最理想的.例如,它要求我始终将POINT_ENC_WIDTH正确设置为足够大的值,以允许d
保存整个序列化记录.它依靠程序员来做非常机械的工作.例如,对于记录的每个成员,例如x
,在代码中X_WIDTH
出现两次,一次x
与下一个成员直接连接,一次与下一个成员连接,y
.这很快就会变得乏味.如果我通过添加其他字段来更改记录的定义,我必须更新序列化和(非常相似)反序列化代码,我可能会忘记这一点.当我删除字段时,至少编译器会抱怨.
因此,这引出了我的问题:是否有简单,自动或至少准自动的方式将VHDL记录转换为std_logic_vector
s而无需借助于手动编写的序列化/反序列化代码?我知道特定的编码并不重要,因为我在内部使用记录,并且明确指定了最终输出格式并将手动实现.