VHDL将可变长度的符号初始化为最大值

时间:2018-07-03 08:05:59

标签: vhdl

我有以下函数,当可以使用给定的长度作为参数表示值时,它返回值变量。如果值超出限制,则应根据值的符号返回最大可能值或最大负值。

function truncate (
  value   : in signed;
  length  : in integer)
  return signed is
constant max_positive_value  : signed(length-1 downto 0) := ((length-1) => '0', others => '1');
constant max_negative_value  : signed(length-1 downto 0) := ((length-1) => '1', others => '0');
variable return_value        : signed(length-1 downto 0) := (others => '0');
begin
  if (value >= max_positive_value) then
    return_value := max_positive_value;
  elsif (value <= max_negative_value) then
    return_value := max_negative_value;
  else
    return_value := resize(value, length);
  end if;
  return return_value;
end;

问题是max_positive_valuemax_negative_value的初始化。 GHDL抱怨not static choice exclude others choice。 如果长度可变,如何初始化极限值? 我正在使用VHDL 93。

3 个答案:

答案 0 :(得分:1)

幸运的是,由于您的单人出局在左边,因此您可以执行以下操作:

constant max_positive_value  : signed(length-1 downto 0) := ('0', others => '1');
constant max_negative_value  : signed(length-1 downto 0) := ('1', others => '0');

https://www.edaplayground.com/x/64S7

LRM说

  

除了与单选其他元素的最终元素关联外,   数组聚合的其余元素关联(如果有)   应全部为位置或全部命名。的命名关联   允许数组聚合具有非本地选择   静态,或者同样是一个空范围的选择,仅当   集合包括单个元素关联,并且此元素   协会只有一个选择。其他选择在本地是静态的,如果   适用的索引约束是局部静态的。

像泥一样清澈。

答案 1 :(得分:1)

我找到了另一种方法,Modelsim无需警告即可接受它,但长度必须小于32:

    constant max_positive_value  : signed(length-1 downto 0) := to_signed(2**(length-1)-1, length);
    constant max_negative_value  : signed(length-1 downto 0) := to_signed(-2**(length-1), length);

答案 2 :(得分:0)

另一种方法是在本地声明一个常量,以解决旧的“非本地静态” VHDL问题:

.+@.+\..+