VHDL - std_logic_vectors 数组转换为 std_logic_vector
VHDL - array of std_logic_vectors convert into std_logic_vector
意向:
我正在从 ZedBoard 上的 RAM 读取数据,RAM 由 32 位长字组成,所以我使用以下缓冲区
type mem_word is array (0 to 127) of std_logic_vector(31 downto 0);
signal buffer_word : mem_word;
但是,我想在中间线性缓冲区中以线性方式处理数据
signal buffer_linear : std_logic_vector(4095 downto 0);
buffer_linear <= buffer_word; -- !!! PROBLEM
所以我可以轻松地寻址缓冲区中的任何位,而无需重新计算特定字(buffer_word)中的位置。
问题:
如何从 std_logic_vectors 的数组变成 1 长的 std_logic_vector ?有没有办法避免在一个循环中连接 128 个单词? (类似上面 buffer_linear <= buffer_word;)
您需要一个函数来将矢量-矢量转换为一维矢量。
我下面的示例使用类型名称 T_SLVV_32
来表示它是向量的向量,其中内部向量是 32 位长。 (请参阅我的链接源文件,了解真正的二维 STD_LOGIC 矩阵类型 T_SLM
)。所以 T_SLVV_32
等同于你的 mem_word
类型。
subtype T_SLV_32 is STD_LOGIC_VECTOR(31 downto 0);
type T_SLVV_32 is array(NATURAL range <>) of T_SLV_32;
function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is
variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0);
begin
for i in slvv'range loop
slv((i * 32) + 31 downto (i * 32)) := slvv(i);
end loop;
return slv;
end function;
用法:
buffer_linear <= to_slv(buffer_word);
此函数不创建逻辑,只创建接线。
注意:一次访问内存的所有位,防止综合工具推断 RAM 或 ROM 内存块!
来源:PoC.vectors
在 GitHub 查看我的矢量包,了解更多关于前后变换矢量和矩阵的示例。
意向:
我正在从 ZedBoard 上的 RAM 读取数据,RAM 由 32 位长字组成,所以我使用以下缓冲区
type mem_word is array (0 to 127) of std_logic_vector(31 downto 0);
signal buffer_word : mem_word;
但是,我想在中间线性缓冲区中以线性方式处理数据
signal buffer_linear : std_logic_vector(4095 downto 0);
buffer_linear <= buffer_word; -- !!! PROBLEM
所以我可以轻松地寻址缓冲区中的任何位,而无需重新计算特定字(buffer_word)中的位置。
问题:
如何从 std_logic_vectors 的数组变成 1 长的 std_logic_vector ?有没有办法避免在一个循环中连接 128 个单词? (类似上面 buffer_linear <= buffer_word;)
您需要一个函数来将矢量-矢量转换为一维矢量。
我下面的示例使用类型名称 T_SLVV_32
来表示它是向量的向量,其中内部向量是 32 位长。 (请参阅我的链接源文件,了解真正的二维 STD_LOGIC 矩阵类型 T_SLM
)。所以 T_SLVV_32
等同于你的 mem_word
类型。
subtype T_SLV_32 is STD_LOGIC_VECTOR(31 downto 0);
type T_SLVV_32 is array(NATURAL range <>) of T_SLV_32;
function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is
variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0);
begin
for i in slvv'range loop
slv((i * 32) + 31 downto (i * 32)) := slvv(i);
end loop;
return slv;
end function;
用法:
buffer_linear <= to_slv(buffer_word);
此函数不创建逻辑,只创建接线。
注意:一次访问内存的所有位,防止综合工具推断 RAM 或 ROM 内存块!
来源:PoC.vectors
在 GitHub 查看我的矢量包,了解更多关于前后变换矢量和矩阵的示例。