说我需要一个信号来表示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>
答案 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));