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);
再次使用它......在单循环cpu上工作,其他一切工作正常,但在内存中这条特殊的行。
DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0);
我想阻止DataOut的索引越界错误,但这不起作用。有什么想法吗?
Check > 0
会阻止所有数据传出。Check >= 0
允许错误通过...当导致异常的索引是-4。答案 0 :(得分:1)
如果你在一个过程中有它,你需要“dAddr
”和“check
”作为变量,否则你需要两个时钟周期,具体取决于前一个地址是否有效,而不是你正在使用的那个。
答案 1 :(得分:0)
如果你的内存有1024个位置,你的地址应该是10位,而不是现在的32位。如果您的地址为unsigned(9 downto 0)
,则其所有值都是您的内存阵列的合法输入。
注意您将数据放在地址400,404,408。您在每个数据元素之间留下三个空格!即使您的数据宽度为4个字节,每个地址也会占用整个4字节的数据字。
答案 2 :(得分:-1)
此尝试的其他一些问题和提供的答案:
你不能应用-4的索引。您的dAddr是类型std_logic_vector强制转换为UNSIGNED。所以它总是积极的或零。
如果您只是模拟,使用VARIABLES是一种解决方案。对于SYNTHESIS,如果您想知道实现正在做什么,它们仍然需要是SIGNALS。
你的记忆是只读的。如果你想拥有读/写内存,你需要在一个时钟进程中使用它,这样你就可以生成REGISTERS而不是LATCHES。
我不知道你在声明中使用数组部分赋值做了什么。是的,它在语法上是正确的,但声明处的赋值不适用于SYNTHESIZED逻辑。这实际上只适用于CONSTANTS(公平地说,这就是你的dataMem信号......一个常数。)
要在您的时钟进程的RESET块中初始化您需要的内存,请使用for循环将all设置为x“00”,然后使用[dataMem(404)&lt; = x设置400,404,408的3个赋值“08”;]
分配DataOut每个时钟
如果(检查&lt; 1024)那么
DataOut&lt; = dataMem(check);
其他
DataOut&lt; =(others =&gt;“0”); - 也许?还是只保留旧价值?
结束如果;