レコード メンバーのベクトル長を示すために定数に依存する次の型定義があるとします。
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
はコード内に2 回X_WIDTH
表示されます。1 回は直接関連して、もう 1 回は次のメンバー. これはすぐに退屈になります。フィールドを追加してレコードの定義を変更すると、シリアル化コードと (非常によく似た) 逆シリアル化コードの両方を更新する必要があり、これを忘れてしまう可能性があります。フィールドを削除すると、少なくともコンパイラは文句を言います。x
y
したがって、これは私の質問につながります:std_logic_vector
手動で書かれたシリアル化/非シリアル化コードに頼ることなく、VHDL レコードを s に変換する簡単な、自動化された、または少なくとも準自動化された方法はありますか? 私はレコードを内部で使用しており、最終的な出力形式は明確に指定されており、手動で実装されるため、特定のエンコーディングを知ることは重要ではありません。