【问题标题】:How to Transfer Array Data in VHDL?如何在 VHDL 中传输数组数据?
【发布时间】:2013-12-16 17:23:16
【问题描述】:

令人讨厌的是,我知道如何在 C++ 中轻松做到这一点,但在 VHDL 中却不知道。我想快速轻松地将数据从受约束的 3D 数组传输到 2D 数组,例如:

2d_array[N][M]
3d_array[i][N][M]

2d_array=3d_array[i]

所以我的 VHDL 看起来像这样:

    type buff_array is array(2 downto 0, 7 downto 0) of std_logic_vector(31 downto 0);
    type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0);
    shared variable ram: ram_array;
    shared variable buff: buff_array;

我想做这样的事情:

if we = '1' then
                buff(pua, addr) := d;
                ram:=buff(poa);
            end if;

有什么想法吗?

我也知道我可以做一个快速的 for 循环,但我想尽量避免额外的逻辑

【问题讨论】:

  • 不要使用共享变量——你正在为未来储存潜在的问题!最近有几个帖子在用,谁教的??

标签: arrays multidimensional-array vhdl ram


【解决方案1】:

您只能分配相同类型的整个数组。 所以给定

type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0);

您可以声明该类型的变量——甚至是数组。

signal buf : ram_array;
signal ram_2d: array(2 downto 0) of ram_array;

现在buf <= ram_2d(1) 应该可以工作了。

【讨论】:

    【解决方案2】:

    回复:

    我知道我可以做一个快速的 for 循环,但我想尽量避免额外的逻辑

    仅将值从一个地方复制到另一个地方的 for 循环不会是任何逻辑 - 编译器将展开循环并创建您所描述的连接。

    一个常见的误解是,有一个for 循环会产生很大的逻辑。它真正的意思是它多次重复循环中的逻辑,所以如果循环中的逻辑是微不足道的,那么展开的版本也是如此。它不会创建计数器和比较器等。

    (并且,请原谅假设,作为 VHDL 的相对新手,不要担心逻辑量。当然,通过合成块来密切关注事情,但你可能会惊讶于 a)如何工具很好,b) 这些天设备有多大:) 避免过早的优化,就像在软件中一样!

    【讨论】:

    • 希望我能勾选多个答案
    • @fiz:你总是可以问一个关于 for 循环是否会推断出额外逻辑的问题,我也会把答案粘贴到那里(开个玩笑:)
    【解决方案3】:

    快速解决方法是将buff_array 声明为:

    type buff_array is array(2 downto 0) of ram_array;
    

    然后当然是把buf_array的声明放在ram_array的声明之后。

    2D/3D 数组示例:

    type array_2d_t is array(2 downto 0, 1 downto 0) of std_logic_vector(31 downto 0);
    type array_3d_t is array(3 downto 0) of array_2d_t;
    shared variable array_2d_v : array_2d_t;
    shared variable array_3d_v : array_3d_t;
    ...
    array_2d_v := array_3d_v(1);
    

    【讨论】:

    • 这会给我我想要的 3D 阵列吗?
    • 如果将其扩展到 3D,则适用相同的原则,无论是 N-D。 Se 在答案中添加了示例。
    • 感谢您的信息。它起作用了,尽管唯一的问题是如果我现在尝试将 std_logic_vector 写入例如 buff(3,1),它会显示“索引名称前缀类型 buff_array 需要 1 个维度”
    • 从技术上讲,这将是 2-D 数组的数组,而不是 3-D 数组,但它可以工作。不同之处在于您以 buff(3)(1) 而不是 buff(3,1) 的形式访问其成员之一。
    【解决方案4】:

    这仅说明了 Morten 对那些想要了解问题和解决方案的人的回答,否则会因共享变量名称更改和缺少 LRM 参考而变得模糊。

    本例分析:

    library ieee;
    use ieee.std_logic_1164.all;
    
    package declare is 
    --  type buff_array is array(2 downto 0, 7 downto 0) of std_logic_vector(31 downto 0);
        type ram_array is array(7 downto 0) of std_logic_vector(31 downto 0);
        type buff_array is array (2 downto 0) of ram_array;  -- added declaration
        shared variable ram: ram_array;
        shared variable buff: buff_array;
    end package;
    
    library ieee;
    use ieee.std_logic_1164.all;
    use work.declare.all;
    
    entity ramarray is
    end entity;
    
    architecture foo of ramarray is
        signal we:   std_logic;
    begin
        we <= '1';
    SOMELABEL:
        process (we)
        begin
            if we = '1' then
                ram := buff(1);  -- unchanged
            end if;
        end process;
    
    end architecture;
    

    不允许多维切片[1]。通过将 buff 转换为数组子类型的数组类型的数组来分离每个维度的索引允许您在赋值运算符的两侧具有相同的基本类型,从而为元素类型为 ram_array 的一维数组提供切片名称。


    [1] IEEE Std 1076-2008,第 8.5 节切片名称“切片名称表示由另一个一维数组的一系列连续元素组成的一维数组。信号的切片是信号;a变量的切片是变量;常量的切片是常量;值的切片是值。"

    另请参阅快速通道更改提案 FT-15 Slicing of multidimensional arrays and arrays of arrays 从 2004 年 6 月开始,仍在进行中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2020-09-02
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多