首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VHDL - std_logic_vectors数组转换为std_logic_vector

VHDL - std_logic_vectors数组转换为std_logic_vector
EN

Stack Overflow用户
提问于 2016-04-15 10:46:22
回答 1查看 8.2K关注 0票数 2

意图:

我在ZedBoard上读取内存中的数据,内存由32位长字组成,所以我使用以下缓冲区

代码语言:javascript
运行
复制
type mem_word   is array (0 to 127) of std_logic_vector(31 downto 0);
signal buffer_word   : mem_word;

但是,我想以线性的方式,在中间的线性缓冲区中处理数据。

代码语言:javascript
运行
复制
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;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-15 11:22:09

您需要一个函数来将向量向量转换为一维向量.

下面的示例使用类型名称T_SLVV_32表示它是向量向量,而内部向量中的向量长度为32位。(请参阅我的链接源文件,以获得名为STD_LOGIC的真正的二维T_SLM矩阵类型)。因此,T_SLVV_32相当于您的mem_word类型。

代码语言:javascript
运行
复制
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;

用法:

代码语言:javascript
运行
复制
buffer_linear <= to_slv(buffer_word);

这个函数没有创建逻辑,只是连接。

注释:同时访问内存的所有比特,防止了推断RAM或ROM内存块的综合工具!

来源:PoC.vectors

有关前后转换向量和矩阵的更多示例,请参见我在GitHub上的向量包。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36645064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档