Vhdl矢量边界检查

时间:2011-11-02 23:56:03

标签: vhdl sequential

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。

3 个答案:

答案 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”); - 也许?还是只保留旧价值?
  结束如果;