2
type dmemSpace is array(0 to 1023) of std_logic_vector(31 downto 0);
signal dataMem : dmemSpace := ( 
  400 => X"00000000",
  404 => X"00001000",
  408 => X"FFFFEFFF",
  others => X"00000000"
);

signal dAddr : std_logic_vector(31 downto 0);
signal check : integer; 


dAddr(31 downto 0) <= Addr(31 downto 2) & "00";  
check <= to_integer(unsigned(dAddr));
DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

又是我......

DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

我想防止 DataOut 出现索引越界错误,但这不起作用。有任何想法吗?

  • Check > 0防止所有数据流出。
  • Check >= 0让错误通过...当导致异常的索引为-4时。
4

3 回答 3

1

如果您在进程中有它,则需要“ dAddr”和“ check”作为变量,否则您将根据前一个地址是否有效而不是您正在使用的地址来占用两个时钟周期。

于 2011-11-03T00:41:41.433 回答
0

如果您的内存有 1024 个位置,那么您的地址应该是 10 位,而不是现在的 32 位。如果你的地址是unsigned(9 downto 0),它的所有值都是你的内存数组的合法输入。

请注意,您将数据放在地址 400、404、408 处。您在每个数据元素之间留下三个空格!即使您的数据是 4 字节宽,每个地址也会占用整个 4 字节数据字。

于 2011-11-03T07:32:33.400 回答
-1

此尝试和提供的答案还有一些其他问题:您无法应用 -4 的索引。您的 dAddr 是类型 std_logic_vector 强制转换为 UNSIGNED。所以它总是一个正数或零。如果您只是在模拟,使用 VARIABLES 是一种解决方案。对于 SYNTHESIS,如果您想知道实现在做什么,它们仍然需要是 SIGNALS。您的内存是只读的。如果您想拥有读/写内存,您将希望在时钟进程中拥有它,以便生成寄存器而不是锁存器。我不知道你对声明中的数组部分赋值做了什么。是的,它在语法上是正确的,但声明时的赋值不适用于综合逻辑。这真的只适用于 CONSTANTS (平心而论,这就是你的 dataMem 信号......一个常数。) 要在时钟进程的 RESET 块中初始化所需的内存,请使用 for 循环将 all 设置为 x"00",然后使用 [dataMem(404) <= x 对 400、404、408 进行 3 个分配"08";] 分配 DataOut 每个时钟 if (check < 1024) then DataOut <= dataMem(check); 否则数据输出<=(其他=>“0”); - 也许?还是只保留旧值?
万一;

于 2013-08-13T13:44:35.780 回答