我正在开发一个BIST引擎的描述,我的经理已经要求我从Verilog过渡到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或类似时,我在尝试将地址用作数组索引时遇到错误:
ncvhdl_p: *E,INTYMM (filename,52|17): array index type mismatch [6.4]
我似乎在这里处于一种不赢的局面 . 我使用什么数据类型?请注意,解决方案必须是可综合的 . 谢谢
2 回答
您想要按位访问和包装行为:
addr
从根本上说是一个unsigned
向量 .然后你需要以整数形式访问它:
如果只需要一行整数,请在该行上使用
to_integer
调用 .如果您需要在多个位置作为整数,请创建另一个信号"shadow"并在架构中进行连续分配
像这样:
在这种情况下,我会使用
unsigned
类型 .这将与您在通用位访问方面的操作方式非常相似,但您也可以对地址进行算术运算,并在必要时轻松转换为
integer
类型 . 另外,它不会使用"dreaded"std_logic_unsigned
包装弄脏std_logic_vector
.