假设我需要一个信号来表示从 0 到 5 的数字;显然这需要 3 位 std_logic 来表示(即如果 MAXVAL=5,则 bitwidth= {wcalc "floor(logtwo($MAXVAL))+1"
}) 。
我知道我可以这样做:
SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5;
我用它显式指定一个由三个 std_logic“位”组成的数组,并设置初始值;然后我可以使用 REPORT 打印出长度(在本例中为 3):
report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));
到目前为止,一切都很好。但是,假设我使用整数(数字)类型:
SIGNAL myInteger : NATURAL range 0 to 5 := 5;
我猜测这里的“编译器”(“合成器”)会自动推断出它需要 3 位存储长度,因为该整数的值介于 0 到 5 之间。如果是的,我的问题是:是否有可能以某种方式在报告中打印出这个位宽度/长度/大小?
当然,诀窍是这样的:
report("Bit width of myInteger is "& integer'image(myInteger'length));
...将会失败(例如,“HDLParsers:3389 - 属性'长度的前缀必须是一个数组对象”),因为据我所知,所有这些属性都像 'length
和 'range
仅适用于数组 ( Understanding VHDL Attributes ),而整数(自然)不是数组 - 它是 < em>数字 :) ( VHDL vector integer conversion question )
再次,我知道我可能会使用 log2 ( Computing the width of an unsigned variable from maximum value? ) - 但我想要的只是快速查看(在合成期间)“”有多少“位”为最终综合设计分配的“合成器”,从而估算最终 FPGA 资源的使用量(特别是如果我使用“泛型”以某种方式计算整数的特定最大值 )。
好的,提前感谢您的回复, 干杯!
编辑:一些上下文:我正在使用 ISE Webpack 9.2;我尝试使用“通用”变量/常量作为参数,然后使用方程来计算计数器的最大值。我猜这个计算发生在“编译”时(在 ISE 中是“综合”,而不是“实现设计”),因此我希望在此处出现报告消息(事实上我得到了因此,对于 std_logic_vector 来说,在综合日志中 - 然而,对我来说相同的报告消息也在行为模拟开始时出现,这很好)。
这些报告消息的目标是确保我的方程正确,并且合成器不会尝试推断 32 位计数器 - 即使我只想从 0 计数到 5 :)
最佳答案
原则上,VHDL 整数的表示是未定义的。
实际上,您通常可以假设综合工具将使用 2 的补码表示,同时考虑范围约束。因此,范围约束和实现的位宽之间的关系很简单,尽管从 VHDL 内报告位宽并非如此。
关于integer - VHDL:找出/报告整数的位宽/长度(相对于 std_logic_vector)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195242/