基于布尔常数的VHDL赋值范围

基于布尔常数的VHDL赋值范围,vhdl,Vhdl,在VHDL中,似乎不可能实现下面的代码那样的功能。这是否可以使用其他语法?是否存在可以放入范围声明中的if语句?我在网上找不到这方面的任何信息 if not using_census_vector then variable diff : natural range 0 to ((2**cRed_pixel_bits)+(2**cGreen_pixel_bits)+(2**cBlue_pixel_bits)) * window_size * window_size - 1 := 0; e

在VHDL中,似乎不可能实现下面的代码那样的功能。这是否可以使用其他语法?是否存在可以放入范围声明中的if语句?我在网上找不到这方面的任何信息

if not using_census_vector then
    variable diff : natural range 0 to ((2**cRed_pixel_bits)+(2**cGreen_pixel_bits)+(2**cBlue_pixel_bits)) * window_size * window_size - 1 := 0;
else
    variable diff : natural range 0 to ((window_size * window_size * 3 )) := 0; 
end if;

使用函数返回高索引。可能不需要参数(除非您希望它通用并移动到包中),因为所有其他参数都应该在范围内

function calc_high return integer is
begin
  if not using_census_vector then
    return ((2**cRed_pixel_bits)+(2**cGreen_pixel_bits)+(2**cBlue_pixel_bits)) * window_size * window_size - 1;
  else
    return ((window_size * window_size * 3 )); 
  end if;
end function

variable diff : natural range 0 to calc_high := 0;

if语句。没有声明性部分。。。它的功能类似于下面的代码。。。这不是一个特别具体的问题陈述。您不提供,但可以使用带有简单表达式的范围,该表达式可以包含可以传递值(例如布尔值)常量的函数调用。IEEE标准1076-2008,5.2标量类型(5.2.1)范围限制,9。表达式,(9.1)简单表达式(…)。该函数可以返回1或2**cRed\u pixel\u位)+(2**cGreen\u pixel\u位)+(2**cBlue\u pixel\u位基于传递的布尔值,甚至是完整的右边界。是的。这很有效。为什么不把它作为一个答案发布呢?如果我添加了一堆额外的代码以符合mcve,那就不重要了。没有人会尝试运行它,如果他们这样做了,它显然会在if语句中抛出一个错误。这不会起任何作用利用所提供的信息理解问题。