【问题标题】:VHDL - array of std_logic_vectors convert into std_logic_vectorVHDL - std_logic_vectors 数组转换为 std_logic_vector
【发布时间】:2016-04-15 10:46:22
【问题描述】:

意图:

我正在从 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

所以我可以轻松地寻址缓冲区中的任何位,而无需重新计算(缓冲区字的)特定字中的位置。

问题:

如何从 std_logic_vectors 数组中获取 1 个长 std_logic_vector ?有没有办法避免在循环中连接 128 个单词? (类似于上面的 buffer_linear )

【问题讨论】:

    标签: arrays vector vhdl fpga


    【解决方案1】:

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

    下面的示例使用类型名称T_SLVV_32 来表示它是一个向量的向量,其中内部向量是 32 位长。 (请参阅我的链接源文件,了解名为 T_SLM 的真正二维 STD_LOGIC 矩阵类型)。所以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 上的矢量包,了解更多关于来回转换矢量和矩阵的示例。

    【讨论】:

    • RAM块在什么条件下可以使用?一次访问的位有限制吗?
    • @MartinG 您最好的办法是查看您的综合工具内存推断模式。例如这里xilinx.com/support/documentation/sw_manuals/xilinx2014_1/…第95页及以后
    • 条件可能包括读取和写入进程都是同步的,即时钟进程,因为 BlockRam 是同步 RAM - 并且同时读取一些上限(32 或 64)位.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多