假设我需要一个信号来表示0到5之间的数字; 显然这需要表示3比特的std_logic(即如果MAXVAL = 5,则bitwidth = { wcalc "floor(logtwo($MAXVAL))+1"}).
我知道我能做到:
SIGNAL myLogicVector : STD_LOGIC_VECTOR(2 downto 0) := 5;
Run Code Online (Sandbox Code Playgroud)
我明确指定了三个std_logic'位'的数组,并设置初始值; 然后我可以使用REPORT打印出长度(在本例中为3):
report("Bit width of myLogicVector is "& integer'image(myLogicVector'length));
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,假设我使用整数(数字)类型:
SIGNAL myInteger : NATURAL range 0 to 5 := 5;
Run Code Online (Sandbox Code Playgroud)
我猜这里'编译器'('合成器')会自动推断它需要3位存储长度,因为这个整数的范围是0到5之间的值.如果是这样的话,我的问题是:是有可能以某种方式在报告中打印出这个位宽/长度/大小?
当然,诀窍是这样的:
report("Bit width of myInteger is "& integer'image(myInteger'length));
Run Code Online (Sandbox Code Playgroud)
...将失败(例如,使用" HDLParsers:3389 - 属性的前缀'长度必须是数组对象 "),因为据我所知,所有这些属性类似于'length并且'range仅适用于数组(了解VHDL属性),而整数(自然)不是数组 - 它是一个数字 :)(VHDL向量整数转换问题)
再一次,我知道我可以利用log2(从最大值计算无符号变量的宽度?) - 但我想要的只是快速看到(在合成期间)"合成器"有多少'位'分配给最终的综合设计,因此在最终的FPGA资源方面将使用多少(特别是如果我使用'泛型'以某种方式计算整数的特定最大值 …
我可以打印一个integer小数到标准输出:
library std;
use std.textio.all;
entity min is
end min;
architecture behav of min is
begin
process is
variable my_line : line;
begin
write(my_line, 16);
writeline(output, my_line);
wait;
end process;
end behav;
Run Code Online (Sandbox Code Playgroud)
哪个输出:
16
Run Code Online (Sandbox Code Playgroud)
但是如何输出代替:
10
0x10
Run Code Online (Sandbox Code Playgroud)