【问题标题】:VHDL Array: Index -10 out of bound 0 to 31999VHDL 数组:索引 -10 超出范围 0 到 31999
【发布时间】:2021-08-05 18:09:35
【问题描述】:

我有这个 BRAM 实现

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity BRAM is
    Generic (
           DEPTH  : NATURAL := 32000; -- 128 KB
           WIDTH  : NATURAL := 32
           );
    Port ( CLK   : in  STD_LOGIC;
           WRITE : in  STD_LOGIC;
           ADDRW   : in  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
           ADDRR   : in  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
           DIN   : in  STD_LOGIC_VECTOR (WIDTH-1 downto 0);
           DOUT  : out STD_LOGIC_VECTOR (WIDTH-1 downto 0)
         );
end BRAM;

architecture BEHAV of BRAM is
type STD_LOGIC_VECTOR_ARRAY is array(0 to DEPTH-1) of STD_LOGIC_VECTOR(WIDTH-1 downto 0);
signal MEMORY : STD_LOGIC_VECTOR_ARRAY;
begin
  process(CLK)
  begin
    if rising_edge(CLK) then
        if WRITE = '1' then
          MEMORY(to_integer(unsigned(ADDRW))) <= Din;
        end if;
        DOUT <= MEMORY(to_integer(unsigned(ADDRR)));
    end if;
  end process;
end BEHAV;

为了用我使用的 STD_LOGIC_VECTOR 索引 BRAM

MEMORY(to_integer(unsigned(ADDRR)))

现在有时 ADDRR(或 ADDWR)是一个大的 32 位数字,例如 0xfffffff6。 但是“to_integer”转换将此解释为“-10”,这会导致越界错误。

我不能用无符号数索引数组。那我该如何解决呢?

【问题讨论】:

  • 您希望0xfffffff6 被解释为什么?
  • @Trebor As 4294967286
  • 那不是也越界了吗?
  • @Trebor 是的,但我可以将 DEPTH 更改为 4294967295。然后它不会。我的主要目标是使用 ADDRW 和 ADDRR 作为数组的 unsigned 索引
  • 整数的范围为 –2147483647 和 +2147483647(含)。所以你的预期数字太大了。自然类型从 0 到 +2147483647。所以这确实是一个错误。我怀疑这是一个真正的问题,因为是否有可以拥有 40 亿位的 BRAM?

标签: vhdl simulation ram hdl vivado


【解决方案1】:

所以我发现了一些在模拟中有效的东西

process(CLK)
begin
    if rising_edge(CLK) then
        if WRITE = '1' then
            if (to_integer(UNSIGNED(ADDRW)) >= 0) and (to_integer(UNSIGNED(ADDRW)) < DEPTH) then
                MEMORY(to_integer(UNSIGNED(ADDRW))) <= DIN;
            end if;
        end if;
        if (to_integer(UNSIGNED(ADDRR)) >= 0) and (to_integer(UNSIGNED(ADDRR)) < DEPTH) then
            DOUT <= MEMORY(to_integer(UNSIGNED(ADDRR)));
        end if;
    end if;
end process;

我仍然更喜欢更清洁的方式。特别是因为我想综合这个项目并且在硬件中无符号数组索引在语义上不是问题。但我认为“if”仍然会被合成。

【讨论】:

  • if 语句的 AND 条件的左侧只是地址的 MS 元素。右侧是分隔 DEPTH 所需的地址元素(如果是 2 的幂,则寻址数组的地址元素数量和实际地址长度不同)。您基本上已经在更大的地址空间中内化了设备选择。
  • 我还发现这个问题似乎是一个错误。根据csee.umbc.edu/portal/help/VHDL/packages/numeric_std.vhd,当 TO_INTEGER 的输入为 UNSIGNED 时,结果不能为负,我的模拟器报告为负。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多