假设我有依赖于常量,表示记录部件的矢量长度以下类型定义:“序列化” VHDL记录
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
而不必诉诸手动编写序列化/反序列化代码?对我来说,了解具体的编码并不重要,因为我在内部使用记录,并且最终的输出格式是明确指定的,并将手动实施。
哦,好点,谢谢!有时我想知道我能忽略多少!逆操作也可以用类似简洁的方式写入? – distributed 2010-10-21 12:10:35
我想你需要两个分配和属性来“解压”记录。尝试像这样:pnt.x <= d(pnt.x'length-1 downto 0); – Philippe 2010-11-15 15:31:17