Предположим, у меня есть следующее определение типа, которое опирается на константы для указания длины вектора членов записи:
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 без необходимости прибегать к написанию вручную сериализованного / десериализованного кода? Мне не важно знать конкретную кодировку, поскольку я использую записи для внутреннего использования, и окончательный формат вывода четко указан и будет реализован вручную.