【发布时间】: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