假设我有以下类型定义,它依赖于常量来指示记录成员的向量长度:
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;
我想将这些类型的记录转换为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;
这段代码在很多方面都不是最理想的。例如,它要求我始终正确地将 POINT_ENC_WIDTH 设置为一个足够大的值以允许d
保存整个序列化记录。它依赖于程序员做非常机械的工作。例如,对于记录的每个成员,例如x
,在代码中X_WIDTH
出现两次x
,一次与下一个成员直接相关,一次与下一个成员相关,y
。这很快就会变得乏味。如果我通过添加其他字段来更改记录的定义,我必须同时更新序列化和(非常相似的)反序列化代码,我可能会忘记这一点。当我删除字段时,至少编译器会抱怨。
因此,这引出了我的问题:是否有一种简单、自动化或至少准自动化的方式将 VHDL 记录转换为std_logic_vector
s 而无需求助于手动编写的序列化/反序列化代码?知道具体的编码对我来说并不重要,因为我在内部使用记录,并且明确指定了最终输出格式并将手动实现。