2011-11-02 81 views
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); 

它再次....我工作在一个单一的循环CPU和其他一切工作正常,但在内存中的这一特定行。Vhdl矢量边界检查

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

我想防止DataOut的索引超出范围的错误,但这是行不通的。有任何想法吗?

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

这是否在一个钟控过程?如果是这样,这是一个计划问题。如果不是,您已经使用DataOut创建了一个锁存器。你为什么不使用'dAddr'的9 downto 0来限制到1023? (我知道,可能是一个学习练习。) –

+0

! YOURE RIGHT我将它添加到时钟进程中,现在一切都很好。谢谢你的一切。其实这一直困扰着我说现在....我是这样一个擦洗<。< –

+0

那么你为什么“接受”下面的答案是没有意义的?我添加了一个答案,其中包括一些此类警告和其他一些警告。 –

回答

1

如果在过程中有它,你需要“dAddr”和“check”是变量,否则你是基于是否将以前的地址以两个时钟周期是有效的,而不是一个你正在使用。

0

如果你的内存有1024个位置,你的地址应该是10位,而不是你现在拥有的32位。如果您的地址是unsigned(9 downto 0),则其所有值都是您的存储阵列的合法输入。

注意您将数据放在地址400,404,408处。您将在每个数据元素之间留出三个空格!即使你的数据是4字节宽,每个地址都占用一个完整的4字节数据字。

-1

此尝试和提供的答案的其他一些问题: 您不能应用索引-4。您的dAddr将类型std_logic_vector强制转换为UNSIGNED。所以它总是一个积极的或零。 如果你只是模拟,使用VARIABLES是一个解决方案。对于SYNTHESIS,如果你想知道实现在做什么,他们仍然需要SIGNALS。 你的记忆力是只读的。如果你想读/写内存,你会希望在一个时钟进程中有这个,所以你生成寄存器而不是锁存器。 我不知道你在声明中的数组部分赋值。是的,它在合成上是正确的,但是在声明中的赋值不适用于合成逻辑。这真的只适用于CONSTANTS(公平地说,这就是你的dataMem信号是一个常数。) 要初始化内存,你需要它在你的时钟进程的RESET块中,使用for循环来设置所有的如果(检查< 1024)然后 数据输出< = dataMem(x)“00”,然后是使用[dataMem(404)< = x“08”]的3个赋值400,404,408;] 检查); else DataOut < =(others =>“0”); - 也许?或者只保留旧的价值?
end if;

+0

请格式正确哟使其可读。 – Nunser