我正在开发一个BIST引擎的描述,我的经理已经问过我从Verilog过渡到VHDL。我对VHDL非常生疏,我无法弄清楚我的代码中的地址寄存器的正确数据类型。大多数情况下,地址用于索引到数组中。我应该使用什么VHDL数据类型来存储地址?
data : std_logic_vector (2**W-1 downto 0);
...
output = data(addr);
虽然有时,我需要执行按位操作(例如,这段代码中找到的最低显著1中的地址):
least_one(0) <= addr(0);
PRIORITY_ENCODER : for i in 1 to (W-1) generate
least_one(i) <= addr(i) and not or_reduce(addr(i-1 downto 0));
end generate PRIORITY_ENCODER;
least_one(W) <= not or_reduce(addr);
最后,我还要靠地址包装当它溢出时(即1111 + 1 = 0和0-1 = 1111),没有问题。
因此,考虑到所有这些不同的用途,我给了什么数据类型或子类型的地址?当我使用整数和相关类型,我得到的错误,当我执行位操作:
ncvhdl_p: *E,APNPFX (filename,17|20): can not make sense of P(...)
当我使用std_logic_vector或similiar,我得到的错误尝试使用的地址作为数组索引:
ncvhdl_p: *E,INTYMM (filename,52|17): array index type mismatch [6.4]
我似乎在这里处于一个双赢局面。我使用哪种数据类型?请注意,解决方案必须是可综合的。谢谢
不幸的是这并未解决_array索引类型不匹配错误。我无法使用无符号索引向量,并且不断转换为整数并不是真正的选项,因为地址主要用作索引。我真的很喜欢可以避免所有转换的数据类型。 – DrDean 2013-03-07 21:06:13
'to_integer(地址)'是不是一个可接受的转换? – Josh 2013-03-07 21:11:52
我的意思是,我不希望数十个'to_integer(address)'语句抛出我的代码,因为在大多数地址引用中,我将它用作索引。我可以使它成为一个int,并在必要时转换为无符号,但后来我遇到了信号不会溢出的问题。猜猜我会写我自己的附加功能,但这一切似乎太麻烦了;应该是一个更简单的方法。 – DrDean 2013-03-07 21:25:55