VHDL:查找/报告整数的位宽/长度(与std_logic_vector相比)?

时间:2011-03-04 14:49:27

标签: integer logic width vhdl synthesis

说我需要一个信号来表示0到5之间的数字;显然,这需要表示3比特的std_logic(,如果MAXVAL = 5,则bitwidth = {wcalc "floor(logtwo($MAXVAL))+1"} )。

我知道我能做到:

SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5; 

我将明确指定一个包含三个std_logic'bits'的数组,并设置初始值;然后我可以使用REPORT打印出长度(在本例中为3):

report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));

到目前为止,这么好。但是,假设我使用整数(数字)类型:

SIGNAL myInteger : NATURAL range 0 to 5 := 5;

我猜这里的'编译器'('合成器')会自动推断它需要3位存储长度,因为这个整数的范围是0到5之间的值。在这种情况下,我的问题是:是否有可能以某种方式在REPORT中打印出这个位宽/长度/大小?

当然,诀窍就是这样:

report("Bit width of myInteger is "& integer'image(myInteger'length));

...将失败(例如,使用“ HDLParsers:3389 - 属性的前缀'长度必须是数组对象”),因为据我所知,所有这些属性都像{{ 1}}和'length仅适用于数组Understanding VHDL Attributes),而整数(自然)不是数组 - 它是数字 :)(VHDL vector integer conversion question

同样,我知道我可以使用log2(Computing the width of an unsigned variable from maximum value?) - 但我想要的只是快速查看(在综合期间)多少'位'为最终合成设计分配的'合成器',因此大约将在最终FPGA资源中使用多少(,特别是如果我使用'泛型'以某种方式计算整数的特定最大值)。

嗯,提前感谢任何回复, 干杯!

编辑:一点背景:我正在使用ISE Webpack 9.2;我正在尝试使用'通用'变量/常量作为参数,然后使用公式计算计数器的最大值。这个计算,我猜想发生在'编译'时(在ISE中是'Synthesize' - 而不是'实现设计'),所以它就在这里我想要报告消息发生(我实际上得到了对于std_logic_vector来说,它们在合成日志中是正确的 - 然而,同样的报告消息也出现在行为模拟的开始,这很好)。

这些报告消息的目的是确保我的方程式都正常,并且合成器不会尝试推断32位计数器 - 即使我只想从0到5计数:) / p>

5 个答案:

答案 0 :(得分:6)

原则上,VHDL整数的表示是未定义的。

实际上,您通常可以假设综合工具将使用2的补码表示,并考虑范围约束。因此,范围约束和实现的位宽之间的关系很简单,即使从VHDL中报告位宽也不是。

答案 1 :(得分:2)

  

我猜这里是'编译'   ('合成器')会自动进行   推断它需要3位存储空间   length,因为此整数的范围是   0到5之间的值

根据规格应该,但不是必需的。来自IEEE 1076.6-2004:

  

1.3术语

     

一词表示严格遵守强制性要求,以符合标准,并且   允许偏差(必须等于)。 这个词应该   用来表示某种行动方案是首选,但是   不一定是必需的;

     

8.3.1.2整数类型

     

建议合成工具应转换信号或       具有整数子类型指示的变量       相应的位向量。如果范围不包含负数       值,该项应具有无符号二进制表示。如果       范围包含一个或多个负值,该项应具有       二重补充实施。矢量应该是最小的       宽度与这些表示一致。

     

综合工具应支持整数类型以及正,负和   无约束(通用)整数   其范围在-2 147 483 648至+2 147 483 647(范围内)范围内   成功映射32位二进制补码数)

     

示例:“INTEGER范围9到10”应使用a合成   等效向量长度为​​4位,就像它已被定义一样   子类型指示为“INTEGER范围0到15”。

我可以肯定地说,至少有一个综合工具以这种方式使用范围,因为我必须调试正式的验证错误比较。

对于Xilinx FPGA,XST综合报告将告知哪些存储元件有未使用的位,而不是简单的电线。

答案 2 :(得分:0)

是否可以通过某种方式在报告中打印出该位的宽度/长度/大小?

基本数学:

位宽= ceil(log2(my_integer + 1))

但是VHDL需要更多的努力...

内联代码:

use ieee.math_real.all;
...
report "Bit width of myInteger is " & integer'image(integer(ceil(log2(real(myInteger) + real(1)))));

功能:

use ieee.math_real.all;
...
-- Returns the bit width of i as a positive integer.
function BitWidth(constant i: in positive) return positive is
begin
    return positive(ceil(log2(real(i) + real(1))));  -- Add one to prevent errors when i = 2**n
end function;

-- Overload for returning the string representation of the bit width of i.
function BitWidth(constant i: in positive) return string is
    variable bit_width: positive := BitWidth(i);
begin
    return positive'image(bit_width);
end function;

signal myInteger: positive := 8;
...
report "Bit width of myInteger is " & BitWidth(myInteger);

您可以将这些功能放在辅助功能包中。

答案 3 :(得分:-1)

这可以解决如下:

首先,声明一个新的(sub)类型,表示应该用于with toupdate as ( select mfc.*, row_number() over (partition by [Patient Family registration no# رقم الملف] order by CONVERT(date, [date of visit] ) ) as seqnum from MFC ) update toupdate set TypeOfVisit = 'New Visit' where seqnum = 1; 的范围。 (然后将myInteger声明为此类型的信号,而不是直接表示整数范围。)

然后,使用声明的范围作为索引范围声明一个虚拟数组类型,然后使用myInteger

'length

答案 4 :(得分:-3)

您可以随时使用:

报告(“myInteger的位宽是”& integer'image(myInteger'left - myInteger'Right));